1 2 #include "main/context.h" 3 #include "main/fbobject.h" 4 #include "main/macros.h" 5 #include "main/teximage.h" 6 #include "main/renderbuffer.h" 7 #include "swrast/swrast.h" 8 #include "swrast/s_context.h" 9 #include "swrast/s_texfetch.h" 10 11 12 /* 13 * Render-to-texture code for GL_EXT_framebuffer_object 14 */ 15 16 17 static void 18 delete_texture_wrapper(struct gl_context *ctx, struct gl_renderbuffer *rb) 19 { 20 assert(rb->RefCount == 0); 21 free(rb); 22 } 23 24 /** 25 * Update the renderbuffer wrapper for rendering to a texture. 26 * For example, update the width, height of the RB based on the texture size, 27 * update the internal format info, etc. 28 */ 29 static void 30 update_wrapper(struct gl_context *ctx, struct gl_renderbuffer_attachment *att) 31 { 32 struct gl_renderbuffer *rb = att->Renderbuffer; 33 struct swrast_renderbuffer *srb = swrast_renderbuffer(rb); 34 struct swrast_texture_image *swImage; 35 mesa_format format; 36 GLuint zOffset; 37 38 (void) ctx; 39 40 swImage = swrast_texture_image(rb->TexImage); 41 assert(swImage); 42 43 format = swImage->Base.TexFormat; 44 45 if (att->Texture->Target == GL_TEXTURE_1D_ARRAY_EXT) { 46 zOffset = 0; 47 } 48 else { 49 zOffset = att->Zoffset; 50 } 51 52 /* Want to store linear values, not sRGB */ 53 rb->Format = _mesa_get_srgb_format_linear(format); 54 55 srb->Buffer = swImage->ImageSlices[zOffset]; 56 } 57 58 59 60 /** 61 * Called when rendering to a texture image begins, or when changing 62 * the dest mipmap level, cube face, etc. 63 * This is a fallback routine for software render-to-texture. 64 * 65 * Called via the glRenderbufferTexture1D/2D/3D() functions 66 * and elsewhere (such as glTexImage2D). 67 * 68 * The image we're rendering into is 69 * att->Texture->Image[att->CubeMapFace][att->TextureLevel]; 70 * It'll never be NULL. 71 * 72 * \param fb the framebuffer object the texture is being bound to 73 * \param att the fb attachment point of the texture 74 * 75 * \sa _mesa_FramebufferRenderbuffer_sw 76 */ 77 void 78 _swrast_render_texture(struct gl_context *ctx, 79 struct gl_framebuffer *fb, 80 struct gl_renderbuffer_attachment *att) 81 { 82 struct gl_renderbuffer *rb = att->Renderbuffer; 83 (void) fb; 84 85 /* plug in our texture_renderbuffer-specific functions */ 86 rb->Delete = delete_texture_wrapper; 87 88 update_wrapper(ctx, att); 89 } 90 91 92 void 93 _swrast_finish_render_texture(struct gl_context *ctx, 94 struct gl_renderbuffer *rb) 95 { 96 /* do nothing */ 97 /* The renderbuffer texture wrapper will get deleted by the 98 * normal mechanism for deleting renderbuffers. 99 */ 100 (void) ctx; 101 (void) rb; 102 } 103