[Mesa-dev] [PATCH 17/22] i965: Keep track of texture base dimensions

Topi Pohjolainen topi.pohjolainen at intel.com
Mon Jun 9 00:45:51 PDT 2014


These are needed when texturing stencil buffers, otherwise they
are simply ignored.

Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
 src/mesa/drivers/dri/i965/brw_context.h | 12 ++++++++
 src/mesa/drivers/dri/i965/intel_tex.c   | 49 +++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
index b2e5416..0e128aa 100644
--- a/src/mesa/drivers/dri/i965/brw_context.h
+++ b/src/mesa/drivers/dri/i965/brw_context.h
@@ -299,6 +299,17 @@ static inline uint32_t AUB_TRACE_SUBTYPE(enum state_struct_type ss_type)
    return ss_type & 0xFFFF;
 }
 
+/**
+ * Store for texture base dimensions per sampler. These are values backing
+ * corresponding builtin uniforms needed by the stencil texturing logic for
+ * manual clamping and mip-level offseting.
+ * For textures other than stencil these are simply ignored.
+ */
+struct brw_tex_base_dimensions {
+   uint32_t base_width[MAX_SAMPLERS];
+   uint32_t base_height[MAX_SAMPLERS];
+};
+
 /** Subclass of Mesa vertex program */
 struct brw_vertex_program {
    struct gl_vertex_program program;
@@ -317,6 +328,7 @@ struct brw_geometry_program {
 struct brw_fragment_program {
    struct gl_fragment_program program;
    GLuint id;  /**< serial no. to identify frag progs, never re-used */
+   struct brw_tex_base_dimensions tex_base_dimensions;
 };
 
 
diff --git a/src/mesa/drivers/dri/i965/intel_tex.c b/src/mesa/drivers/dri/i965/intel_tex.c
index f18ca45..0b0c1d5 100644
--- a/src/mesa/drivers/dri/i965/intel_tex.c
+++ b/src/mesa/drivers/dri/i965/intel_tex.c
@@ -291,6 +291,54 @@ intel_texture_view(struct gl_context *ctx,
    return GL_TRUE;
 }
 
+/**
+ * Store the current texture base dimensions for the designated program.
+ * In case of stencil textures the compiler has introduced corresponding
+ * builtin uniforms for which values are loaded from this store when program
+ * and its buffers are loaded for the gpu. For other types of textures these
+ * are simply ignored.
+ */
+static void
+intel_tex_parameter(struct gl_context *ctx, struct gl_texture_object *texObj,
+                    GLenum pname, const GLfloat *params)
+{
+   if (pname != GL_DEPTH_STENCIL_TEXTURE_MODE ||
+       (int)params[0] != GL_STENCIL_INDEX)
+      return;
+
+   struct gl_shader_program *sh_prog = ctx->_Shader->_CurrentFragmentProgram;
+   if (!sh_prog)
+      return;
+
+   struct gl_shader *sh = sh_prog->_LinkedShaders[MESA_SHADER_FRAGMENT];
+   if (!sh)
+      return;
+
+   struct gl_program *prog = sh->Program;
+   if (!prog)
+      return;
+
+   GLuint s;
+   struct brw_fragment_program *fp = brw_fragment_program(
+                                        (struct gl_fragment_program *)prog);
+
+   for (s = 0; s < MAX_SAMPLERS; ++s) {
+      if (!(prog->SamplersUsed & (1 << s)))
+         continue;
+
+      const unsigned unit = prog->SamplerUnits[s];
+
+      if (ctx->Texture.Unit[unit]._Current != texObj)
+         continue;
+
+      struct intel_texture_object *intelObj = intel_texture_object(texObj);
+      const struct intel_mipmap_tree *mt = intelObj->mt;
+
+      fp->tex_base_dimensions.base_width[s] = mt->logical_width0;
+      fp->tex_base_dimensions.base_height[s] = mt->logical_height0;
+   }
+}
+
 void
 intelInitTextureFuncs(struct dd_function_table *functions)
 {
@@ -304,4 +352,5 @@ intelInitTextureFuncs(struct dd_function_table *functions)
    functions->MapTextureImage = intel_map_texture_image;
    functions->UnmapTextureImage = intel_unmap_texture_image;
    functions->TextureView = intel_texture_view;
+   functions->TexParameter = intel_tex_parameter;
 }
-- 
1.8.3.1



More information about the mesa-dev mailing list