The 'mode' param is a bitmask of GL_MAP_READ_BIT and GL_MAP_WRITE_BIT. A future commit will perform HiZ resolve operations in intel_region_map(). So, even though the access mode is irrelevant to the GTT, the extra information allows us to intelligently avoid unneccessary HiZ ops.
Signed-off-by: Chad Versace <c...@chad-versace.us> --- src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 11 +++++++---- src/mesa/drivers/dri/intel/intel_mipmap_tree.h | 1 + src/mesa/drivers/dri/intel/intel_regions.c | 6 ++++-- src/mesa/drivers/dri/intel/intel_regions.h | 8 ++++++-- src/mesa/drivers/dri/intel/intel_span.c | 6 ++++-- src/mesa/drivers/dri/intel/intel_tex.c | 6 ++++-- src/mesa/drivers/dri/intel/intel_tex.h | 6 ++++-- src/mesa/drivers/dri/intel/intel_tex_image.c | 2 ++ src/mesa/drivers/dri/intel/intel_tex_validate.c | 15 ++++++++++++--- 9 files changed, 44 insertions(+), 17 deletions(-) diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c index 18427b5..b8e583c 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c @@ -311,6 +311,8 @@ intel_miptree_get_image_offset(struct intel_mipmap_tree *mt, /** * Map a teximage in a mipmap tree. + * + * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT * \param row_stride returns row stride in bytes * \param image_stride returns image stride in bytes (for 3D textures). * \param image_offsets pointer to array of pixel offsets from the returned @@ -322,6 +324,7 @@ intel_miptree_image_map(struct intel_context * intel, struct intel_mipmap_tree * mt, GLuint face, GLuint level, + GLbitfield mode, GLuint * row_stride, GLuint * image_offsets) { GLuint x, y; @@ -341,7 +344,7 @@ intel_miptree_image_map(struct intel_context * intel, DBG("%s \n", __FUNCTION__); - return intel_region_map(intel, mt->region); + return intel_region_map(intel, mt->region, mode); } else { assert(mt->level[level].depth == 1); intel_miptree_get_image_offset(mt, level, face, 0, @@ -351,7 +354,7 @@ intel_miptree_image_map(struct intel_context * intel, DBG("%s: (%d,%d) -> (%d, %d)/%d\n", __FUNCTION__, face, level, x, y, mt->region->pitch * mt->cpp); - return intel_region_map(intel, mt->region) + + return intel_region_map(intel, mt->region, mode) + (x + y * mt->region->pitch) * mt->cpp; } } @@ -451,8 +454,8 @@ intel_miptree_image_copy(struct intel_context *intel, if (!success) { GLubyte *src_ptr, *dst_ptr; - src_ptr = intel_region_map(intel, src->region); - dst_ptr = intel_region_map(intel, dst->region); + src_ptr = intel_region_map(intel, src->region, GL_MAP_READ_BIT); + dst_ptr = intel_region_map(intel, dst->region, GL_MAP_WRITE_BIT); _mesa_copy_rect(dst_ptr, dst->cpp, diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h index 7f20319..b30eb91 100644 --- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.h +++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.h @@ -173,6 +173,7 @@ GLubyte *intel_miptree_image_map(struct intel_context *intel, struct intel_mipmap_tree *mt, GLuint face, GLuint level, + GLbitfield mode, GLuint * row_stride, GLuint * image_stride); void intel_miptree_image_unmap(struct intel_context *intel, diff --git a/src/mesa/drivers/dri/intel/intel_regions.c b/src/mesa/drivers/dri/intel/intel_regions.c index cd0542c..0a5c2c1 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.c +++ b/src/mesa/drivers/dri/intel/intel_regions.c @@ -109,7 +109,8 @@ debug_backtrace(void) /* XXX: Thread safety? */ GLubyte * -intel_region_map(struct intel_context *intel, struct intel_region *region) +intel_region_map(struct intel_context *intel, struct intel_region *region, + GLbitfield mode) { intel_flush(&intel->ctx); @@ -362,7 +363,8 @@ intel_region_data(struct intel_context *intel, intel_prepare_render(intel); - _mesa_copy_rect(intel_region_map(intel, dst) + dst_offset, + GLubyte *dst_base = intel_region_map(intel, dst, GL_MAP_WRITE_BIT); + _mesa_copy_rect(dst_base + dst_offset, dst->cpp, dst->pitch, dstx, dsty, width, height, src, src_pitch, srcx, srcy); diff --git a/src/mesa/drivers/dri/intel/intel_regions.h b/src/mesa/drivers/dri/intel/intel_regions.h index 3b7a3cf..209ea90 100644 --- a/src/mesa/drivers/dri/intel/intel_regions.h +++ b/src/mesa/drivers/dri/intel/intel_regions.h @@ -115,10 +115,14 @@ void intel_region_release(struct intel_region **ib); void intel_recreate_static_regions(struct intel_context *intel); -/* Map/unmap regions. This is refcounted also: +/** + * Map/unmap regions. This is refcounted also: + * + * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT */ GLubyte *intel_region_map(struct intel_context *intel, - struct intel_region *ib); + struct intel_region *ib, + GLbitfield mode); void intel_region_unmap(struct intel_context *intel, struct intel_region *ib); diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c index 2e1c80c..9760844 100644 --- a/src/mesa/drivers/dri/intel/intel_span.c +++ b/src/mesa/drivers/dri/intel/intel_span.c @@ -321,7 +321,8 @@ intelSpanRenderStart(struct gl_context * ctx) struct gl_texture_object *texObj = ctx->Texture.Unit[i]._Current; intel_finalize_mipmap_tree(intel, i); - intel_tex_map_images(intel, intel_texture_object(texObj)); + intel_tex_map_images(intel, intel_texture_object(texObj), + GL_MAP_READ_BIT | GL_MAP_WRITE_BIT); } } @@ -379,7 +380,8 @@ intel_map_vertex_shader_textures(struct gl_context *ctx) ctx->VertexProgram._Current->Base.TexturesUsed[i] != 0) { struct gl_texture_object *texObj = ctx->Texture.Unit[i]._Current; - intel_tex_map_images(intel, intel_texture_object(texObj)); + intel_tex_map_images(intel, intel_texture_object(texObj), + GL_MAP_READ_BIT | GL_MAP_WRITE_BIT); } } } diff --git a/src/mesa/drivers/dri/intel/intel_tex.c b/src/mesa/drivers/dri/intel/intel_tex.c index 8d3cbd6..9cf88db 100644 --- a/src/mesa/drivers/dri/intel/intel_tex.c +++ b/src/mesa/drivers/dri/intel/intel_tex.c @@ -83,6 +83,7 @@ intel_free_texture_image_buffer(struct gl_context * ctx, /** * Map texture memory/buffer into user space. * Note: the region of interest parameters are ignored here. + * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT * \param mapOut returns start of mapping of region of interest * \param rowStrideOut returns row stride in bytes */ @@ -118,7 +119,7 @@ intel_map_texture_image(struct gl_context *ctx, y /= bh; if (likely(mt)) { - void *base = intel_region_map(intel, mt->region); + void *base = intel_region_map(intel, mt->region, mode); unsigned int image_x, image_y; intel_miptree_get_image_offset(mt, tex_image->Level, tex_image->Face, @@ -180,7 +181,8 @@ intelGenerateMipmap(struct gl_context *ctx, GLenum target, fallback_debug("%s - fallback to swrast\n", __FUNCTION__); - intel_tex_map_level_images(intel, intelObj, texObj->BaseLevel); + intel_tex_map_level_images(intel, intelObj, texObj->BaseLevel, + GL_MAP_READ_BIT | GL_MAP_WRITE_BIT); _mesa_generate_mipmap(ctx, target, texObj); intel_tex_unmap_level_images(intel, intelObj, texObj->BaseLevel); diff --git a/src/mesa/drivers/dri/intel/intel_tex.h b/src/mesa/drivers/dri/intel/intel_tex.h index 895c634..7059a4b 100644 --- a/src/mesa/drivers/dri/intel/intel_tex.h +++ b/src/mesa/drivers/dri/intel/intel_tex.h @@ -51,14 +51,16 @@ GLuint intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit); void intel_tex_map_level_images(struct intel_context *intel, struct intel_texture_object *intelObj, - int level); + int level, + GLbitfield mode); void intel_tex_unmap_level_images(struct intel_context *intel, struct intel_texture_object *intelObj, int level); void intel_tex_map_images(struct intel_context *intel, - struct intel_texture_object *intelObj); + struct intel_texture_object *intelObj, + GLbitfield mode); void intel_tex_unmap_images(struct intel_context *intel, struct intel_texture_object *intelObj); diff --git a/src/mesa/drivers/dri/intel/intel_tex_image.c b/src/mesa/drivers/dri/intel/intel_tex_image.c index 8fd69c3..2d8519f 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_image.c +++ b/src/mesa/drivers/dri/intel/intel_tex_image.c @@ -430,6 +430,7 @@ intelTexImage(struct gl_context * ctx, intelImage->mt, intelImage->base.Base.Face, intelImage->base.Base.Level, + GL_MAP_WRITE_BIT, &dstRowStride, intelImage->base.Base.ImageOffsets); } @@ -600,6 +601,7 @@ intel_get_tex_image(struct gl_context * ctx, GLenum target, GLint level, intelImage->mt, intelImage->base.Base.Face, intelImage->base.Base.Level, + GL_MAP_READ_BIT, &intelImage->base.Base.RowStride, intelImage->base.Base.ImageOffsets); intelImage->base.Base.RowStride /= intelImage->mt->cpp; diff --git a/src/mesa/drivers/dri/intel/intel_tex_validate.c b/src/mesa/drivers/dri/intel/intel_tex_validate.c index 59f39de..d476f99 100644 --- a/src/mesa/drivers/dri/intel/intel_tex_validate.c +++ b/src/mesa/drivers/dri/intel/intel_tex_validate.c @@ -160,10 +160,14 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit) return GL_TRUE; } +/** + * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT + */ void intel_tex_map_level_images(struct intel_context *intel, struct intel_texture_object *intelObj, - int level) + int level, + GLbitfield mode) { GLuint nr_faces = (intelObj->base.Target == GL_TEXTURE_CUBE_MAP) ? 6 : 1; GLuint face; @@ -178,6 +182,7 @@ intel_tex_map_level_images(struct intel_context *intel, intelImage->mt, intelImage->base.Base.Face, intelImage->base.Base.Level, + mode, &intelImage->base.Base.RowStride, intelImage->base.Base.ImageOffsets); /* convert stride to texels, not bytes */ @@ -206,16 +211,20 @@ intel_tex_unmap_level_images(struct intel_context *intel, } } +/** + * \param mode bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT + */ void intel_tex_map_images(struct intel_context *intel, - struct intel_texture_object *intelObj) + struct intel_texture_object *intelObj, + GLbitfield mode) { int i; DBG("%s\n", __FUNCTION__); for (i = intelObj->base.BaseLevel; i <= intelObj->_MaxLevel; i++) - intel_tex_map_level_images(intel, intelObj, i); + intel_tex_map_level_images(intel, intelObj, i, mode); } void -- 1.7.6.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev