--- src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 1 + src/mesa/drivers/dri/i965/gen7_wm_surface_state.c | 1 + src/mesa/drivers/dri/intel/intel_regions.c | 7 +++++-- src/mesa/drivers/dri/intel/intel_regions.h | 5 +++++ src/mesa/drivers/dri/intel/intel_screen.c | 6 ++++++ 5 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index 0a6de2b..cf8210a 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -679,6 +679,7 @@ brw_update_texture_surface( struct gl_context *ctx, GLuint unit ) BRW_SURFACE_FORMAT_SHIFT)); surf[1] = intelObj->mt->region->bo->offset; /* reloc */ + surf[1] += intelObj->mt->region->offset; surf[2] = ((intelObj->_MaxLevel - tObj->BaseLevel) << BRW_SURFACE_LOD_SHIFT | (width - 1) << BRW_SURFACE_WIDTH_SHIFT | diff --git a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c index c567fb0..dd01feb 100644 --- a/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/gen7_wm_surface_state.c @@ -176,6 +176,7 @@ gen7_update_texture_surface(struct gl_context *ctx, GLuint unit) */ surf->ss1.base_addr = intelObj->mt->region->bo->offset; /* reloc */ + surf->ss1.base_addr += intelObj->mt->region->offset; surf->ss2.width = width - 1; surf->ss2.height = height - 1; diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c index 218be30..b4607a5 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.c +++ b/src/mesa/drivers/dri/intel/intel_regions.c @@ -257,7 +257,8 @@ intel_region_alloc_internal(struct intel_screen *screen, if (region == NULL) return region; - region->plane_id = 0; + region->plane_id = attrs->plane_id; + region->offset = attrs->offset; region->structure = attrs->structure; region->cpp = attrs->cpp; region->width = attrs->width; @@ -293,6 +294,8 @@ intel_region_alloc(struct intel_screen *screen, if (buffer == NULL) return NULL; + attrs.plane_id = 0; + attrs.offset = 0; attrs.structure = __DRI_IMAGE_STRUCTURE_FRAME; attrs.cpp = cpp; attrs.width = width; @@ -345,7 +348,7 @@ intel_region_alloc_for_handle2(struct intel_screen *screen, int ret; uint32_t bit_6_swizzle, tiling; - region = intel_region_hash_lookup(screen->named_regions, handle, 0); + region = intel_region_hash_lookup(screen->named_regions, handle, attrs->plane_id); if (region != NULL) { dummy = NULL; if (!intel_region_validate_attributes(region, attrs)) { diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h index 052ee0b..9dcb901 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.h +++ b/src/mesa/drivers/dri/intel/intel_regions.h @@ -56,6 +56,7 @@ struct intel_buffer_object; struct intel_region { drm_intel_bo *bo; /**< buffer manager's buffer */ + uint32_t offset; /**< Offset (in bytes) to the base bo */ GLuint refcount; /**< Reference count for region */ GLuint plane_id; /**< Plane id out of 3 (range: 0..2) */ GLuint cpp; /**< bytes per pixel */ @@ -77,6 +78,8 @@ struct intel_region * See. intel_region_alloc_for_handle(). */ struct intel_region_attributes { + GLuint plane_id; /**< plane id */ + uint32_t offset; /**< Offset (in bytes) to the base bo */ GLuint structure; /**< picture structure. See __DRI_IMAGE_STRUCTURE_xxx */ GLuint cpp; /**< bytes per pixel */ GLuint width; /**< in pixels */ @@ -108,6 +111,8 @@ intel_region_alloc_for_handle(struct intel_screen *screen, { struct intel_region_attributes attrs; + attrs.plane_id = 0; + attrs.offset = 0; attrs.structure = __DRI_IMAGE_STRUCTURE_FRAME; attrs.cpp = cpp; attrs.width = width; diff --git a/src/mesa/drivers/dri/intel/intel_screen.c b/src/mesa/drivers/dri/intel/intel_screen.c index 84e4e41..a5ac80c 100644 --- a/src/mesa/drivers/dri/intel/intel_screen.c +++ b/src/mesa/drivers/dri/intel/intel_screen.c @@ -239,6 +239,8 @@ intel_create_image_from_name2(__DRIscreen *screen, image->data = loaderPrivate; cpp = _mesa_get_format_bytes(image->format); + region_attrs.plane_id = attrs->plane_id; + region_attrs.offset = offset; region_attrs.structure = attrs->structure; region_attrs.cpp = cpp; region_attrs.width = attrs->width; @@ -387,6 +389,10 @@ intel_query_image(__DRIimage *image, int attrib, int *value) return image->dri_format; case __DRI_IMAGE_ATTRIB_STRUCTURE: return image->region->structure; + case __DRI_IMAGE_ATTRIB_OFFSET: + return image->region->offset; + case __DRI_IMAGE_ATTRIB_PLANE_ID: + return image->region->plane_id; default: return false; } -- 1.7.5.4 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev