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
delete_texture_wrapper(struct gl_context * ctx,struct gl_renderbuffer * rb)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
update_wrapper(struct gl_context * ctx,struct gl_renderbuffer_attachment * att)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
_swrast_render_texture(struct gl_context * ctx,struct gl_framebuffer * fb,struct gl_renderbuffer_attachment * att)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
_swrast_finish_render_texture(struct gl_context * ctx,struct gl_renderbuffer * rb)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