New ctx->Driver.Map/UnmapTexture() functions for accessing textures from t_vb_program.c
authorBrian <brian.paul@tungstengraphics.com>
Thu, 29 Nov 2007 15:12:33 +0000 (08:12 -0700)
committerBrian <brian.paul@tungstengraphics.com>
Thu, 29 Nov 2007 15:13:16 +0000 (08:13 -0700)
src/mesa/drivers/common/driverfuncs.c
src/mesa/main/config.h
src/mesa/main/dd.h
src/mesa/tnl/t_vb_program.c

index 1e7c279875ee811c0aea9362e1cc5822aadd72df..03fbab69e3982dfd0794b229c379b27ccd963028 100644 (file)
@@ -112,6 +112,8 @@ _mesa_init_driver_functions(struct dd_function_table *driver)
    driver->DeleteTexture = _mesa_delete_texture_object;
    driver->NewTextureImage = _mesa_new_texture_image;
    driver->FreeTexImageData = _mesa_free_texture_image_data; 
+   driver->MapTexture = NULL;
+   driver->UnmapTexture = NULL;
    driver->TextureMemCpy = _mesa_memcpy; 
    driver->IsTextureResident = NULL;
    driver->PrioritizeTexture = NULL;
index 8eb02beb4c26c62a6256ddc3b64898f3088c1d2e..ab0f035b45b442cf6775a4004883298e7025845c 100644 (file)
 /** For GL_ARB_vertex_shader */
 /*@{*/
 #define MAX_VERTEX_ATTRIBS 16
-#define MAX_VERTEX_TEXTURE_IMAGE_UNITS 0
+#define MAX_VERTEX_TEXTURE_IMAGE_UNITS MAX_TEXTURE_UNITS
 #define MAX_COMBINED_TEXTURE_IMAGE_UNITS (MAX_TEXTURE_IMAGE_UNITS + MAX_VERTEX_TEXTURE_IMAGE_UNITS)
 /*@}*/
 
index caa50dd6826c6173bd52022ce7ff040bf0b44522..77d27bb03ddaf01b62ca7a1f7c77cb498d78b011 100644 (file)
@@ -493,6 +493,11 @@ struct dd_function_table {
     */
    void (*FreeTexImageData)( GLcontext *ctx, struct gl_texture_image *tImage );
 
+   /** Map texture image data into user space */
+   void (*MapTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
+   /** Unmap texture images from user space */
+   void (*UnmapTexture)( GLcontext *ctx, struct gl_texture_object *tObj );
+
    /**
     * Note: no context argument.  This function doesn't initially look
     * like it belongs here, except that the driver is the only entity
index cd49e9baf0134b9e2c13cf592c863688616d005f..addaf761273076eb6ef0f47df552518de476059a 100644 (file)
@@ -245,6 +245,50 @@ init_machine(GLcontext *ctx, struct gl_program_machine *machine)
 }
 
 
+/**
+ * Map the texture images which the vertex program will access (if any).
+ */
+static void
+map_textures(GLcontext *ctx, const struct gl_vertex_program *vp)
+{
+   GLuint u;
+
+   if (!ctx->Driver.MapTexture)
+      return;
+
+   for (u = 0; u < ctx->Const.MaxVertexTextureImageUnits; u++) {
+      if (vp->Base.TexturesUsed[u]) {
+         /* Note: _Current *should* correspond to the target indicated
+          * in TexturesUsed[u].
+          */
+         ctx->Driver.MapTexture(ctx, ctx->Texture.Unit[u]._Current);
+      }
+   }
+}
+
+
+/**
+ * Unmap the texture images which were used by the vertex program (if any).
+ */
+static void
+unmap_textures(GLcontext *ctx, const struct gl_vertex_program *vp)
+{
+   GLuint u;
+
+   if (!ctx->Driver.MapTexture)
+      return;
+
+   for (u = 0; u < ctx->Const.MaxVertexTextureImageUnits; u++) {
+      if (vp->Base.TexturesUsed[u]) {
+         /* Note: _Current *should* correspond to the target indicated
+          * in TexturesUsed[u].
+          */
+         ctx->Driver.UnmapTexture(ctx, ctx->Texture.Unit[u]._Current);
+      }
+   }
+}
+
+
 /**
  * This function executes vertex programs
  */
@@ -278,6 +322,8 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
       }
    }
 
+   map_textures(ctx, program);
+
    for (i = 0; i < VB->Count; i++) {
       GLuint attr;
 
@@ -329,6 +375,8 @@ run_vp( GLcontext *ctx, struct tnl_pipeline_stage *stage )
 #endif
    }
 
+   unmap_textures(ctx, program);
+
    /* Fixup fog and point size results if needed */
    if (program->IsNVProgram) {
       if (ctx->Fog.Enabled &&