swrast: use Map/UnmapTextureImage() in framebuffer map/unmap code
authorBrian Paul <brianp@vmware.com>
Thu, 19 Jan 2012 00:39:33 +0000 (17:39 -0700)
committerBrian Paul <brianp@vmware.com>
Tue, 24 Jan 2012 21:12:37 +0000 (14:12 -0700)
When we're actually rendering into a texture, map the texture image
instead of the corresponding renderbuffer.  Before, we just copied
a pointer from the texture image to the renderbuffer.  This change
will make the code usable by hardware drivers.

src/mesa/swrast/s_renderbuffer.c

index 501b4698c8efc93a9f98ef4f13ca2b5d84754222..637a7b6dc1e3e8461e97f05940ccf0db249e01e8 100644 (file)
@@ -565,20 +565,16 @@ map_attachment(struct gl_context *ctx,
    struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
 
    if (texObj) {
+      /* map texture image (render to texture) */
       const GLuint level = fb->Attachment[buffer].TextureLevel;
       const GLuint face = fb->Attachment[buffer].CubeMapFace;
+      const GLuint slice = fb->Attachment[buffer].Zoffset;
       struct gl_texture_image *texImage = texObj->Image[face][level];
       if (texImage) {
-         struct swrast_texture_image *swImage
-            = swrast_texture_image(texImage);
-
-         /* XXX we'll eventually call _swrast_map_teximage() here */
-         swImage->Map = swImage->Buffer;
-         if (srb) {
-            srb->Map = swImage->Buffer;
-            srb->RowStride = swImage->RowStride *
-               _mesa_get_format_bytes(swImage->Base.TexFormat);
-         }
+         ctx->Driver.MapTextureImage(ctx, texImage, slice,
+                                     0, 0, texImage->Width, texImage->Height,
+                                     GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
+                                     &srb->Map, &srb->RowStride);
       }
    }
    else if (rb) {
@@ -587,8 +583,9 @@ map_attachment(struct gl_context *ctx,
                                   0, 0, rb->Width, rb->Height,
                                   GL_MAP_READ_BIT | GL_MAP_WRITE_BIT,
                                   &srb->Map, &srb->RowStride);
-      assert(srb->Map);
    }
+
+   assert(srb->Map);
 }
  
 
@@ -602,14 +599,15 @@ unmap_attachment(struct gl_context *ctx,
    struct swrast_renderbuffer *srb = swrast_renderbuffer(rb);
 
    if (texObj) {
+      /* unmap texture image (render to texture) */
       const GLuint level = fb->Attachment[buffer].TextureLevel;
       const GLuint face = fb->Attachment[buffer].CubeMapFace;
+      const GLuint slice = fb->Attachment[buffer].Zoffset;
       struct gl_texture_image *texImage = texObj->Image[face][level];
       if (texImage) {
-
-         /* XXX we'll eventually call _swrast_unmap_teximage() here */
-       }
-    }
+         ctx->Driver.UnmapTextureImage(ctx, texImage, slice);
+      }
+   }
    else if (rb) {
       /* unmap ordinary renderbuffer */
       ctx->Driver.UnmapRenderbuffer(ctx, rb);