diff options
Diffstat (limited to 'src/mesa/state_tracker')
| -rw-r--r-- | src/mesa/state_tracker/st_public.h | 3 | ||||
| -rw-r--r-- | src/mesa/state_tracker/st_texture.c | 47 | 
2 files changed, 50 insertions, 0 deletions
| diff --git a/src/mesa/state_tracker/st_public.h b/src/mesa/state_tracker/st_public.h index 6ef30f4403..88995aa874 100644 --- a/src/mesa/state_tracker/st_public.h +++ b/src/mesa/state_tracker/st_public.h @@ -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, diff --git a/src/mesa/state_tracker/st_texture.c b/src/mesa/state_tracker/st_texture.c index 29b1634762..63cfe5fc16 100644 --- a/src/mesa/state_tracker/st_texture.c +++ b/src/mesa/state_tracker/st_texture.c @@ -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 | 
