gallium: add st_set_teximage_surface for EXT_texture_from_pixmap
authorBen Skeggs <skeggsb-at-gmail.com>
Thu, 13 Nov 2008 16:47:47 +0000 (16:47 +0000)
committerAlan Hourihane <alanh@tungstengraphics.com>
Thu, 13 Nov 2008 16:47:47 +0000 (16:47 +0000)
support.

src/mesa/state_tracker/st_public.h
src/mesa/state_tracker/st_texture.c

index 6ef30f4..88995aa 100644 (file)
@@ -42,6 +42,8 @@
 #define ST_SURFACE_DEPTH        8
 
 #define ST_TEXTURE_2D    0x2
+#define ST_TEXTURE_RECT  0x4
+
 #define ST_TEXTURE_RGB   0x1
 #define ST_TEXTURE_RGBA  0x2
 
@@ -99,6 +101,7 @@ void st_finish( struct st_context *st );
 void st_notify_swapbuffers(struct st_framebuffer *stfb);
 void st_notify_swapbuffers_complete(struct st_framebuffer *stfb);
 
+int st_set_teximage(struct pipe_texture *pt, int target);
 
 /** Redirect rendering into stfb's surface to a texture image */
 int st_bind_teximage(struct st_framebuffer *stfb, uint surfIndex,
index 29b1634..63cfe5f 100644 (file)
@@ -32,6 +32,7 @@
 #include "st_cb_fbo.h"
 #include "main/enums.h"
 #include "main/teximage.h"
+#include "main/texstore.h"
 
 #undef Elements  /* fix re-defined macro warning */
 
@@ -352,6 +353,52 @@ st_texture_image_copy(struct pipe_context *pipe,
    }
 }
 
+/** Bind a pipe surface for use as a texture image */
+int
+st_set_teximage(struct pipe_texture *pt, int target)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   const GLuint unit = ctx->Texture.CurrentUnit;
+   struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];
+   struct gl_texture_object *texObj;
+   struct gl_texture_image *texImage;
+   struct st_texture_image *stImage;
+   int internalFormat;
+
+   switch (pt->format) {
+   case PIPE_FORMAT_A8R8G8B8_UNORM:
+      internalFormat = GL_RGBA8;
+      break;
+   default:
+      return 0;
+   };
+
+   switch (target) {
+   case ST_TEXTURE_2D:
+      target = GL_TEXTURE_2D;
+      break;
+   case ST_TEXTURE_RECT:
+      target = GL_TEXTURE_RECTANGLE_ARB;
+      break;
+   default:
+      return 0;
+   }
+
+   texObj = _mesa_select_tex_object(ctx, texUnit, target);
+   texImage = _mesa_get_tex_image(ctx, texObj, target, 0);
+   stImage = st_texture_image(texImage);
+   
+   _mesa_init_teximage_fields(ctx, GL_TEXTURE_2D, texImage, pt->width[0],
+                              pt->height[0], 1, 0, internalFormat);
+
+   texImage->TexFormat = st_ChooseTextureFormat(ctx, internalFormat, GL_RGBA,
+                                                GL_UNSIGNED_BYTE);
+   _mesa_set_fetch_functions(texImage, 2);
+
+   pipe_texture_reference(&stImage->pt, pt);
+
+   return 1;
+}
 
 /** Redirect rendering into stfb's surface to a texture image */
 int