[Mesa-dev] [PATCH 12/17] swrast: Always use MapTextureImage for mapping textures for swrast.

Brian Paul brianp at vmware.com
Tue Apr 30 07:07:59 PDT 2013


On 04/22/2013 10:14 AM, Eric Anholt wrote:
> Now that everything goes through ImageSlices[], we can rely on the
> driver's existing texture mapping function.
>
> A big block of code goes away on Radeon that looks like it was to deal with
> the validate that happened at SpanRenderStart, which no longer occurs since we
> don't need validation for the MapTextureImage hook.
> ---
>   src/mesa/drivers/dri/i915/intel_tris.c           |    2 -
>   src/mesa/drivers/dri/intel/intel_span.c          |   80 ++-----------------
>   src/mesa/drivers/dri/intel/intel_span.h          |    2 -
>   src/mesa/drivers/dri/intel/intel_tex.h           |    6 --
>   src/mesa/drivers/dri/intel/intel_tex_validate.c  |   90 ----------------------
>   src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c |   21 -----
>   src/mesa/drivers/dri/radeon/radeon_span.c        |   18 +----
>   src/mesa/drivers/dri/radeon/radeon_texture.c     |   74 ------------------
>   src/mesa/drivers/dri/radeon/radeon_texture.h     |    3 -
>   src/mesa/swrast/s_texture.c                      |   61 ++++++++++++---
>   10 files changed, 59 insertions(+), 298 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i915/intel_tris.c b/src/mesa/drivers/dri/i915/intel_tris.c
> index 4516db6..30eb6ac 100644
> --- a/src/mesa/drivers/dri/i915/intel_tris.c
> +++ b/src/mesa/drivers/dri/i915/intel_tris.c
> @@ -1096,11 +1096,9 @@ intelRunPipeline(struct gl_context * ctx)
>         intel->NewGLState = 0;
>      }
>
> -   intel_map_vertex_shader_textures(ctx);
>      intel->tnl_pipeline_running = true;
>      _tnl_run_pipeline(ctx);
>      intel->tnl_pipeline_running = false;
> -   intel_unmap_vertex_shader_textures(ctx);
>
>      _mesa_unlock_context_textures(ctx);
>   }
> diff --git a/src/mesa/drivers/dri/intel/intel_span.c b/src/mesa/drivers/dri/intel/intel_span.c
> index d7eaa41..e74398d 100644
> --- a/src/mesa/drivers/dri/intel/intel_span.c
> +++ b/src/mesa/drivers/dri/intel/intel_span.c
> @@ -105,31 +105,8 @@ intel_offset_S8(uint32_t stride, uint32_t x, uint32_t y, bool swizzled)
>   }
>
>   /**
> - * Map the regions needed by intelSpanRenderStart().
> - */
> -static void
> -intel_span_map_buffers(struct intel_context *intel)
> -{
> -   struct gl_context *ctx =&intel->ctx;
> -   struct intel_texture_object *tex_obj;
> -
> -   for (int i = 0; i<  ctx->Const.MaxTextureImageUnits; i++) {
> -      if (!ctx->Texture.Unit[i]._ReallyEnabled)
> -	 continue;
> -      tex_obj = intel_texture_object(ctx->Texture.Unit[i]._Current);
> -      intel_finalize_mipmap_tree(intel, i);
> -      intel_tex_map_images(intel, tex_obj,
> -			   GL_MAP_READ_BIT | GL_MAP_WRITE_BIT);
> -   }
> -
> -   _swrast_map_renderbuffers(ctx);
> -}
> -
> -/**
>    * Prepare for software rendering.  Map current read/draw framebuffers'
> - * renderbuffes and all currently bound texture objects.
> - *
> - * Old note: Moved locking out to get reasonable span performance.
> + * renderbuffers and all currently bound texture objects.
>    */
>   void
>   intelSpanRenderStart(struct gl_context * ctx)
> @@ -139,7 +116,9 @@ intelSpanRenderStart(struct gl_context * ctx)
>      intel_flush(ctx);
>      intel_prepare_render(intel);
>      intel_flush(ctx);
> -   intel_span_map_buffers(intel);
> +
> +   _swrast_map_textures(ctx);
> +   _swrast_map_renderbuffers(ctx);
>   }
>
>   /**
> @@ -149,18 +128,8 @@ intelSpanRenderStart(struct gl_context * ctx)
>   void
>   intelSpanRenderFinish(struct gl_context * ctx)
>   {
> -   struct intel_context *intel = intel_context(ctx);
> -   GLuint i;
> -
>      _swrast_flush(ctx);
> -
> -   for (i = 0; i<  ctx->Const.MaxTextureImageUnits; i++) {
> -      if (ctx->Texture.Unit[i]._ReallyEnabled) {
> -         struct gl_texture_object *texObj = ctx->Texture.Unit[i]._Current;
> -         intel_tex_unmap_images(intel, intel_texture_object(texObj));
> -      }
> -   }
> -
> +   _swrast_unmap_textures(ctx);
>      _swrast_unmap_renderbuffers(ctx);
>   }
>
> @@ -174,42 +143,3 @@ intelInitSpanFuncs(struct gl_context * ctx)
>         swdd->SpanRenderFinish = intelSpanRenderFinish;
>      }
>   }
> -
> -void
> -intel_map_vertex_shader_textures(struct gl_context *ctx)
> -{
> -   struct intel_context *intel = intel_context(ctx);
> -   int i;
> -
> -   if (ctx->VertexProgram._Current == NULL)
> -      return;
> -
> -   for (i = 0; i<  ctx->Const.MaxTextureImageUnits; i++) {
> -      if (ctx->Texture.Unit[i]._ReallyEnabled&&
> -	  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),
> -                              GL_MAP_READ_BIT | GL_MAP_WRITE_BIT);
> -      }
> -   }
> -}
> -
> -void
> -intel_unmap_vertex_shader_textures(struct gl_context *ctx)
> -{
> -   struct intel_context *intel = intel_context(ctx);
> -   int i;
> -
> -   if (ctx->VertexProgram._Current == NULL)
> -      return;
> -
> -   for (i = 0; i<  ctx->Const.MaxTextureImageUnits; i++) {
> -      if (ctx->Texture.Unit[i]._ReallyEnabled&&
> -	  ctx->VertexProgram._Current->Base.TexturesUsed[i] != 0) {
> -         struct gl_texture_object *texObj = ctx->Texture.Unit[i]._Current;
> -
> -         intel_tex_unmap_images(intel, intel_texture_object(texObj));
> -      }
> -   }
> -}
> diff --git a/src/mesa/drivers/dri/intel/intel_span.h b/src/mesa/drivers/dri/intel/intel_span.h
> index e521869..412f244 100644
> --- a/src/mesa/drivers/dri/intel/intel_span.h
> +++ b/src/mesa/drivers/dri/intel/intel_span.h
> @@ -36,8 +36,6 @@ extern void intelInitSpanFuncs(struct gl_context * ctx);
>   extern void intelSpanRenderFinish(struct gl_context * ctx);
>   extern void intelSpanRenderStart(struct gl_context * ctx);
>
> -void intel_map_vertex_shader_textures(struct gl_context *ctx);
> -void intel_unmap_vertex_shader_textures(struct gl_context *ctx);
>   intptr_t intel_offset_S8(uint32_t stride, uint32_t x, uint32_t y, bool swizzled);
>
>   #endif
> diff --git a/src/mesa/drivers/dri/intel/intel_tex.h b/src/mesa/drivers/dri/intel/intel_tex.h
> index 6fa5b40..4785507 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex.h
> +++ b/src/mesa/drivers/dri/intel/intel_tex.h
> @@ -64,12 +64,6 @@ 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,
> -                          GLbitfield mode);
> -
> -void intel_tex_unmap_images(struct intel_context *intel,
> -                            struct intel_texture_object *intelObj);
>   bool
>   intel_tex_image_s8z24_create_renderbuffers(struct intel_context *intel,
>   					   struct intel_texture_image *image);
> diff --git a/src/mesa/drivers/dri/intel/intel_tex_validate.c b/src/mesa/drivers/dri/intel/intel_tex_validate.c
> index 6068733..eaa2561 100644
> --- a/src/mesa/drivers/dri/intel/intel_tex_validate.c
> +++ b/src/mesa/drivers/dri/intel/intel_tex_validate.c
> @@ -139,93 +139,3 @@ intel_finalize_mipmap_tree(struct intel_context *intel, GLuint unit)
>
>      return true;
>   }
> -
> -/**
> - * \param mode  bitmask of GL_MAP_READ_BIT, GL_MAP_WRITE_BIT
> - */
> -static void
> -intel_tex_map_image_for_swrast(struct intel_context *intel,
> -			       struct intel_texture_image *intel_image,
> -			       GLbitfield mode)
> -{
> -   int level;
> -   int face;
> -   struct intel_mipmap_tree *mt;
> -   unsigned int x, y;
> -
> -   if (!intel_image || !intel_image->mt)
> -      return;
> -
> -   level = intel_image->base.Base.Level;
> -   face = intel_image->base.Base.Face;
> -   mt = intel_image->mt;
> -
> -   for (int i = 0; i<  mt->level[level].depth; i++)
> -      intel_miptree_slice_resolve_depth(intel, mt, level, i);
> -
> -   void *map = intel_miptree_map_raw(intel, mt);
> -
> -   for (int i = 0; i<  mt->level[level].depth; i++) {
> -      intel_miptree_get_image_offset(mt, level, i,&x,&y);
> -      intel_image->base.ImageSlices[i] = (map +
> -                                          y * mt->region->pitch +
> -                                          x * mt->cpp);
> -      DBG("%s: (%d,%d,%d) ->  (%d, %d)/%d\n",
> -	  __FUNCTION__, face, level, i, x, y, mt->region->pitch);
> -   }
> -
> -   intel_image->base.Map = intel_image->base.ImageSlices[0];
> -
> -   assert(mt->region->pitch % mt->region->cpp == 0);
> -   intel_image->base.RowStride = mt->region->pitch / mt->region->cpp;
> -}
> -
> -static void
> -intel_tex_unmap_image_for_swrast(struct intel_context *intel,
> -				 struct intel_texture_image *intel_image)
> -{
> -   if (intel_image&&  intel_image->mt) {
> -      intel_miptree_unmap_raw(intel, intel_image->mt);
> -      intel_image->base.Map = NULL;
> -   }
> -}
> -
> -/**
> - * \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,
> -		     GLbitfield mode)
> -{
> -   GLuint nr_faces = _mesa_num_tex_faces(intelObj->base.Target);
> -   int i, face;
> -
> -   DBG("%s\n", __FUNCTION__);
> -
> -   for (i = intelObj->base.BaseLevel; i<= intelObj->_MaxLevel; i++) {
> -      for (face = 0; face<  nr_faces; face++) {
> -	 struct intel_texture_image *intel_image =
> -	    intel_texture_image(intelObj->base.Image[face][i]);
> -
> -	 intel_tex_map_image_for_swrast(intel, intel_image, mode);
> -      }
> -   }
> -}
> -
> -void
> -intel_tex_unmap_images(struct intel_context *intel,
> -		       struct intel_texture_object *intelObj)
> -{
> -   GLuint nr_faces = _mesa_num_tex_faces(intelObj->base.Target);
> -   int i, face;
> -
> -   for (i = intelObj->base.BaseLevel; i<= intelObj->_MaxLevel; i++) {
> -      for (face = 0; face<  nr_faces; face++) {
> -	 struct intel_texture_image *intel_image =
> -	    intel_texture_image(intelObj->base.Image[face][i]);
> -
> -	 intel_tex_unmap_image_for_swrast(intel, intel_image);
> -      }
> -   }
> -}
> diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
> index ebf6a19..4cb1838 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
> @@ -431,27 +431,6 @@ static void migrate_image_to_miptree(radeon_mipmap_tree *mt,
>   		radeon_bo_unmap(image->mt->bo);
>
>   		radeon_miptree_unreference(&image->mt);
> -	} else if (image->base.Map) {
> -		/* This condition should be removed, it's here to workaround
> -		 * a segfault when mapping textures during software fallbacks.
> -		 */
> -		radeon_print(RADEON_FALLBACKS, RADEON_IMPORTANT,
> -				"%s Trying to map texture in software fallback.\n",
> -				__func__);
> -		const uint32_t srcrowstride = _mesa_format_row_stride(image->base.Base.TexFormat, image->base.Base.Width);
> -		uint32_t rows = image->base.Base.Height * image->base.Base.Depth;
> -
> -		if (_mesa_is_format_compressed(image->base.Base.TexFormat)) {
> -			uint32_t blockWidth, blockHeight;
> -			_mesa_get_format_block_size(image->base.Base.TexFormat,&blockWidth,&blockHeight);
> -			rows = (rows + blockHeight - 1) / blockHeight;
> -		}
> -
> -		copy_rows(dest, dstlvl->rowstride, image->base.Map, srcrowstride,
> -				  rows, srcrowstride);
> -
> -		_mesa_align_free(image->base.Map);
> -		image->base.Map = 0;
>   	}
>
>   	radeon_bo_unmap(mt->bo);
> diff --git a/src/mesa/drivers/dri/radeon/radeon_span.c b/src/mesa/drivers/dri/radeon/radeon_span.c
> index 0617adc..6a7df73 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_span.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_span.c
> @@ -119,18 +119,11 @@ radeon_unmap_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb)
>   static void radeonSpanRenderStart(struct gl_context * ctx)
>   {
>   	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
> -	int i;
>
>   	radeon_firevertices(rmesa);
>
> -	for (i = 0; i<  ctx->Const.MaxTextureImageUnits; i++) {
> -		if (ctx->Texture.Unit[i]._ReallyEnabled) {
> -			radeon_validate_texture_miptree(ctx, _mesa_get_samplerobj(ctx, i),
> -							ctx->Texture.Unit[i]._Current);
> -			radeon_swrast_map_texture_images(ctx, ctx->Texture.Unit[i]._Current);
> -		}
> -	}
> -	
> +	_swrast_map_textures(ctx);
> +
>   	radeon_map_framebuffer(ctx, ctx->DrawBuffer);
>   	if (ctx->ReadBuffer != ctx->DrawBuffer)
>   		radeon_map_framebuffer(ctx, ctx->ReadBuffer);
> @@ -138,13 +131,8 @@ static void radeonSpanRenderStart(struct gl_context * ctx)
>
>   static void radeonSpanRenderFinish(struct gl_context * ctx)
>   {
> -	int i;
> -
>   	_swrast_flush(ctx);
> -
> -	for (i = 0; i<  ctx->Const.MaxTextureImageUnits; i++)
> -		if (ctx->Texture.Unit[i]._ReallyEnabled)
> -			radeon_swrast_unmap_texture_images(ctx, ctx->Texture.Unit[i]._Current);
> +	_swrast_unmap_textures(ctx);
>
>   	radeon_unmap_framebuffer(ctx, ctx->DrawBuffer);
>   	if (ctx->ReadBuffer != ctx->DrawBuffer)
> diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
> index aa2f734..52cf95d 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_texture.c
> +++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
> @@ -630,80 +630,6 @@ radeon_init_common_texture_funcs(radeonContextPtr radeon,
>   	radeonInitTextureFormats();
>   }
>
> -static void
> -radeon_swrast_map_image(radeonContextPtr rmesa,
> -			radeon_texture_image *image)
> -{
> -	GLuint level, face;
> -	radeon_mipmap_tree *mt;
> -	GLuint texel_size;
> -	radeon_mipmap_level *lvl;
> -
> -	if (!image || !image->mt)
> -		return;
> -
> -	texel_size = _mesa_get_format_bytes(image->base.Base.TexFormat);
> -	level = image->base.Base.Level;
> -	face = image->base.Base.Face;
> -	mt = image->mt;
> -
> -	lvl =&image->mt->levels[level];
> -
> -	radeon_bo_map(mt->bo, 1);
> -	
> -	image->base.Map = mt->bo->ptr + lvl->faces[face].offset;
> -
> -	for (int i = 0; i<  mt->levels[level].depth; i++) {
> -		image->base.ImageSlices[i] =
> -			image->base.Map + (lvl->rowstride * lvl->height * i);
> -	}
> -
> -	image->base.RowStride = lvl->rowstride / texel_size;
> -}
> -
> -static void
> -radeon_swrast_unmap_image(radeonContextPtr rmesa,
> -			  radeon_texture_image *image)
> -{
> -	if (image&&  image->mt) {
> -		image->base.Map = NULL;
> -		radeon_bo_unmap(image->mt->bo);
> -	}
> -}
> -
> -void
> -radeon_swrast_map_texture_images(struct gl_context *ctx,
> -				 struct gl_texture_object *texObj)
> -{
> -	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
> -	GLuint nr_faces = _mesa_num_tex_faces(texObj->Target);
> -	int i, face;
> -
> -	for (i = texObj->BaseLevel; i<= texObj->_MaxLevel; i++) {
> -		for (face = 0; face<  nr_faces; face++) {
> -			radeon_texture_image *image = get_radeon_texture_image(texObj->Image[face][i]);
> -			radeon_swrast_map_image(rmesa, image);
> -		}
> -	}
> -}
> -
> -void
> -radeon_swrast_unmap_texture_images(struct gl_context *ctx,
> -				   struct gl_texture_object *texObj)
> -{
> -	radeonContextPtr rmesa = RADEON_CONTEXT(ctx);
> -	GLuint nr_faces = _mesa_num_tex_faces(texObj->Target);
> -	int i, face;
> -
> -	for (i = texObj->BaseLevel; i<= texObj->_MaxLevel; i++) {
> -		for (face = 0; face<  nr_faces; face++) {
> -			radeon_texture_image *image = get_radeon_texture_image(texObj->Image[face][i]);
> -			radeon_swrast_unmap_image(rmesa, image);
> -		}
> -	}
> -	
> -}
> -
>   static radeon_mipmap_tree *radeon_miptree_create_for_teximage(radeonContextPtr rmesa,
>   						       struct gl_texture_object *texObj,
>   						       struct gl_texture_image *texImage)
> diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.h b/src/mesa/drivers/dri/radeon/radeon_texture.h
> index 343c171..6ef640c 100644
> --- a/src/mesa/drivers/dri/radeon/radeon_texture.h
> +++ b/src/mesa/drivers/dri/radeon/radeon_texture.h
> @@ -51,9 +51,6 @@ int radeon_validate_texture_miptree(struct gl_context * ctx,
>   				    struct gl_texture_object *texObj);
>
>
> -void radeon_swrast_map_texture_images(struct gl_context *ctx, struct gl_texture_object *texObj);
> -void radeon_swrast_unmap_texture_images(struct gl_context *ctx, struct gl_texture_object *texObj);
> -
>   gl_format radeonChooseTextureFormat_mesa(struct gl_context * ctx,
>                                            GLenum target,
>                                            GLint internalFormat,
> diff --git a/src/mesa/swrast/s_texture.c b/src/mesa/swrast/s_texture.c
> index bfc2e9d..d56e91d 100644
> --- a/src/mesa/swrast/s_texture.c
> +++ b/src/mesa/swrast/s_texture.c
> @@ -257,12 +257,43 @@ _swrast_map_texture(struct gl_context *ctx, struct gl_texture_object *texObj)
>      for (face = 0; face<  faces; face++) {
>         for (level = texObj->BaseLevel; level<  MAX_TEXTURE_LEVELS; level++) {
>            struct gl_texture_image *texImage = texObj->Image[face][level];
> -         if (texImage) {
> -            struct swrast_texture_image *swImage =
> -               swrast_texture_image(texImage);
> +         struct swrast_texture_image *swImage =
> +            swImage = swrast_texture_image(texImage);
> +         unsigned int i;
> +
> +         if (!texImage)
> +            continue;
> +
> +         /* In the case of a swrast-allocated texture buffer, the ImageSlices
> +          * and RowStride are always available.
> +          */
> +         if (swImage->Buffer) {
> +            assert(swImage->ImageSlices[0] == swImage->Buffer);
> +            continue;
> +         }
>
> -            /* XXX we'll eventually call _swrast_map_teximage() here */
> -            swImage->Map = swImage->Buffer;
> +         for (i = 0; i<  texture_slices(texImage); i++) {
> +            GLubyte *map;
> +            GLint rowStride;
> +
> +            if (swImage->ImageSlices[i])
> +               continue;
> +
> +            ctx->Driver.MapTextureImage(ctx, texImage, i,
> +                                        0, 0,
> +                                        texImage->Width, texImage->Height,
> +                                        GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
> +&map,&rowStride);
> +
> +            swImage->ImageSlices[i] = map;
> +            /* A swrast-using driver has to return the same rowstride for
> +             * every slice of the same texture, since we don't track them
> +             * separately.
> +             */
> +            if (i == 0)
> +               swImage->RowStride = rowStride;
> +            else
> +               assert(swImage->RowStride == rowStride);
>            }
>         }
>      }
> @@ -278,12 +309,22 @@ _swrast_unmap_texture(struct gl_context *ctx, struct gl_texture_object *texObj)
>      for (face = 0; face<  faces; face++) {
>         for (level = texObj->BaseLevel; level<  MAX_TEXTURE_LEVELS; level++) {
>            struct gl_texture_image *texImage = texObj->Image[face][level];
> -         if (texImage) {
> -            struct swrast_texture_image *swImage
> -               = swrast_texture_image(texImage);
> +         struct swrast_texture_image *swImage =
> +            swImage = swrast_texture_image(texImage);

rm extra "swImage = "


> +         unsigned int i;
> +
> +         if (!texImage)
> +            continue;
> +
> +         if (swImage->Buffer)
> +            return;
> +
> +         for (i = 0; i<  texture_slices(texImage); i++) {
> +            if (!swImage->ImageSlices[i])
> +               continue;
>
> -            /* XXX we'll eventually call _swrast_unmap_teximage() here */
> -            swImage->Map = NULL;
> +            ctx->Driver.UnmapTextureImage(ctx, texImage, i);
> +            swImage->ImageSlices[i] = 0;
 >            }
 >         }
 >      }


How about getting rid of the 'continue':

for (i = 0 ... )
    if (swImage->IMageSlices[i]) {
       ctx->Driver.UnmapTextureImage(ctx, texImage, i);
       swImage->ImageSlices[i] = NULL;
    }
}


More information about the mesa-dev mailing list