[Mesa-dev] [PATCH] st/mesa: Factorize duplicate code in st_BlitFramebuffer()

Guillaume Charifi guillaume.charifi at sfr.fr
Tue Feb 20 13:30:06 UTC 2018


---
 src/mesa/state_tracker/st_cb_blit.c | 76 +++++++++++++------------------------
 1 file changed, 26 insertions(+), 50 deletions(-)

diff --git a/src/mesa/state_tracker/st_cb_blit.c b/src/mesa/state_tracker/st_cb_blit.c
index 8aa849b3fc..564ad66665 100644
--- a/src/mesa/state_tracker/st_cb_blit.c
+++ b/src/mesa/state_tracker/st_cb_blit.c
@@ -174,53 +174,29 @@ st_BlitFramebuffer(struct gl_context *ctx,
    if (mask & GL_COLOR_BUFFER_BIT) {
       struct gl_renderbuffer_attachment *srcAtt =
          &readFB->Attachment[readFB->_ColorReadBufferIndex];
+      GLuint i;
 
       blit.mask = PIPE_MASK_RGBA;
 
       if (srcAtt->Type == GL_TEXTURE) {
          struct st_texture_object *srcObj = st_texture_object(srcAtt->Texture);
-         GLuint i;
 
          if (!srcObj || !srcObj->pt) {
             return;
          }
 
-         for (i = 0; i < drawFB->_NumColorDrawBuffers; i++) {
-            struct st_renderbuffer *dstRb =
-               st_renderbuffer(drawFB->_ColorDrawBuffers[i]);
+         blit.src.resource = srcObj->pt;
+         blit.src.level = srcAtt->TextureLevel;
+         blit.src.box.z = srcAtt->Zoffset + srcAtt->CubeMapFace;
+         blit.src.format = srcObj->pt->format;
 
-            if (dstRb) {
-               struct pipe_surface *dstSurf;
-
-               st_update_renderbuffer_surface(st, dstRb);
-
-               dstSurf = dstRb->surface;
-
-               if (dstSurf) {
-                  blit.dst.resource = dstSurf->texture;
-                  blit.dst.level = dstSurf->u.tex.level;
-                  blit.dst.box.z = dstSurf->u.tex.first_layer;
-                  blit.dst.format = dstSurf->format;
-
-                  blit.src.resource = srcObj->pt;
-                  blit.src.level = srcAtt->TextureLevel;
-                  blit.src.box.z = srcAtt->Zoffset + srcAtt->CubeMapFace;
-                  blit.src.format = srcObj->pt->format;
-
-                  if (!ctx->Color.sRGBEnabled)
-                     blit.src.format = util_format_linear(blit.src.format);
-
-                  st->pipe->blit(st->pipe, &blit);
-                  dstRb->defined = true; /* front buffer tracking */
-               }
-            }
-         }
+         if (!ctx->Color.sRGBEnabled)
+            blit.src.format = util_format_linear(blit.src.format);
       }
       else {
          struct st_renderbuffer *srcRb =
             st_renderbuffer(readFB->_ColorReadBuffer);
          struct pipe_surface *srcSurf;
-         GLuint i;
 
          if (!srcRb)
             return;
@@ -232,31 +208,31 @@ st_BlitFramebuffer(struct gl_context *ctx,
 
          srcSurf = srcRb->surface;
 
-         for (i = 0; i < drawFB->_NumColorDrawBuffers; i++) {
-            struct st_renderbuffer *dstRb =
-               st_renderbuffer(drawFB->_ColorDrawBuffers[i]);
+         blit.src.resource = srcSurf->texture;
+         blit.src.level = srcSurf->u.tex.level;
+         blit.src.box.z = srcSurf->u.tex.first_layer;
+         blit.src.format = srcSurf->format;
+      }
 
-            if (dstRb) {
-               struct pipe_surface *dstSurf;
+      for (i = 0; i < drawFB->_NumColorDrawBuffers; i++) {
+         struct st_renderbuffer *dstRb =
+            st_renderbuffer(drawFB->_ColorDrawBuffers[i]);
 
-               st_update_renderbuffer_surface(st, dstRb);
+         if (dstRb) {
+            struct pipe_surface *dstSurf;
 
-               dstSurf = dstRb->surface;
+            st_update_renderbuffer_surface(st, dstRb);
 
-               if (dstSurf) {
-                  blit.dst.resource = dstSurf->texture;
-                  blit.dst.level = dstSurf->u.tex.level;
-                  blit.dst.box.z = dstSurf->u.tex.first_layer;
-                  blit.dst.format = dstSurf->format;
+            dstSurf = dstRb->surface;
 
-                  blit.src.resource = srcSurf->texture;
-                  blit.src.level = srcSurf->u.tex.level;
-                  blit.src.box.z = srcSurf->u.tex.first_layer;
-                  blit.src.format = srcSurf->format;
+            if (dstSurf) {
+               blit.dst.resource = dstSurf->texture;
+               blit.dst.level = dstSurf->u.tex.level;
+               blit.dst.box.z = dstSurf->u.tex.first_layer;
+               blit.dst.format = dstSurf->format;
 
-                  st->pipe->blit(st->pipe, &blit);
-                  dstRb->defined = true; /* front buffer tracking */
-               }
+               st->pipe->blit(st->pipe, &blit);
+               dstRb->defined = true; /* front buffer tracking */
             }
          }
       }
-- 
2.14.1



More information about the mesa-dev mailing list