Mesa (master): v3d: store number of color buffers in job

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Dec 9 12:45:16 UTC 2020


Module: Mesa
Branch: master
Commit: 1ebdeb3c4307e5ab3ff6bdbdadfb274c061ef5dd
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ebdeb3c4307e5ab3ff6bdbdadfb274c061ef5dd

Author: Juan A. Suarez Romero <jasuarez at igalia.com>
Date:   Wed Dec  2 13:53:17 2020 +0100

v3d: store number of color buffers in job

Avoids requiring to calculate in other places.

Reviewed-by: Iago Toral Quiroga <itoral at igalia.com>
Signed-off-by: Juan A. Suarez Romero <jasuarez at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7816>

---

 src/gallium/drivers/v3d/v3d_context.h |  2 ++
 src/gallium/drivers/v3d/v3d_job.c     | 18 +++++++++++-------
 src/gallium/drivers/v3d/v3dx_draw.c   |  4 ++--
 src/gallium/drivers/v3d/v3dx_rcl.c    | 14 ++++----------
 4 files changed, 19 insertions(+), 19 deletions(-)

diff --git a/src/gallium/drivers/v3d/v3d_context.h b/src/gallium/drivers/v3d/v3d_context.h
index c46bf278edb..f2c5dadc9e9 100644
--- a/src/gallium/drivers/v3d/v3d_context.h
+++ b/src/gallium/drivers/v3d/v3d_context.h
@@ -337,6 +337,7 @@ struct v3d_job {
         uint32_t bo_handles_size;
 
         /** @{ Surfaces to submit rendering for. */
+        uint32_t nr_cbufs;
         struct pipe_surface *cbufs[4];
         struct pipe_surface *zsbuf;
         /** @} */
@@ -645,6 +646,7 @@ void v3d_job_init(struct v3d_context *v3d);
 struct v3d_job *v3d_job_create(struct v3d_context *v3d);
 void v3d_job_free(struct v3d_context *v3d, struct v3d_job *job);
 struct v3d_job *v3d_get_job(struct v3d_context *v3d,
+                            uint32_t nr_cbufs,
                             struct pipe_surface **cbufs,
                             struct pipe_surface *zsbuf);
 struct v3d_job *v3d_get_job_for_fbo(struct v3d_context *v3d);
diff --git a/src/gallium/drivers/v3d/v3d_job.c b/src/gallium/drivers/v3d/v3d_job.c
index bbf36f6dcfb..d608684a5a3 100644
--- a/src/gallium/drivers/v3d/v3d_job.c
+++ b/src/gallium/drivers/v3d/v3d_job.c
@@ -55,7 +55,7 @@ v3d_job_free(struct v3d_context *v3d, struct v3d_job *job)
                 }
         }
 
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 if (job->cbufs[i]) {
                         _mesa_hash_table_remove_key(v3d->write_jobs,
                                                     job->cbufs[i]->texture);
@@ -294,7 +294,7 @@ v3d_job_set_tile_buffer_size(struct v3d_job *job)
                 tile_size_index++;
 
         int max_bpp = RENDER_TARGET_MAXIMUM_32BPP;
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 if (job->cbufs[i]) {
                         struct v3d_surface *surf = v3d_surface(job->cbufs[i]);
                         max_bpp = MAX2(max_bpp, surf->internal_bpp);
@@ -319,7 +319,9 @@ v3d_job_set_tile_buffer_size(struct v3d_job *job)
  */
 struct v3d_job *
 v3d_get_job(struct v3d_context *v3d,
-            struct pipe_surface **cbufs, struct pipe_surface *zsbuf)
+            uint32_t nr_cbufs,
+            struct pipe_surface **cbufs,
+            struct pipe_surface *zsbuf)
 {
         /* Return the existing job for this FBO if we have one */
         struct v3d_job_key local_key = {
@@ -340,8 +342,9 @@ v3d_get_job(struct v3d_context *v3d,
          * writing these buffers are flushed.
          */
         struct v3d_job *job = v3d_job_create(v3d);
+        job->nr_cbufs = nr_cbufs;
 
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 if (cbufs[i]) {
                         v3d_flush_jobs_reading_resource(v3d, cbufs[i]->texture,
                                                         V3D_FLUSH_DEFAULT,
@@ -361,7 +364,7 @@ v3d_get_job(struct v3d_context *v3d,
                         job->msaa = true;
         }
 
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 if (cbufs[i])
                         _mesa_hash_table_insert(v3d->write_jobs,
                                                 cbufs[i]->texture, job);
@@ -393,9 +396,10 @@ v3d_get_job_for_fbo(struct v3d_context *v3d)
         if (v3d->job)
                 return v3d->job;
 
+        uint32_t nr_cbufs = v3d->framebuffer.nr_cbufs;
         struct pipe_surface **cbufs = v3d->framebuffer.cbufs;
         struct pipe_surface *zsbuf = v3d->framebuffer.zsbuf;
-        struct v3d_job *job = v3d_get_job(v3d, cbufs, zsbuf);
+        struct v3d_job *job = v3d_get_job(v3d, nr_cbufs, cbufs, zsbuf);
 
         if (v3d->framebuffer.samples >= 1)
                 job->msaa = true;
@@ -411,7 +415,7 @@ v3d_get_job_for_fbo(struct v3d_context *v3d)
         /* If we're binding to uninitialized buffers, no need to load their
          * contents before drawing.
          */
-        for (int i = 0; i < 4; i++) {
+        for (int i = 0; i < nr_cbufs; i++) {
                 if (cbufs[i]) {
                         struct v3d_resource *rsc = v3d_resource(cbufs[i]->texture);
                         if (!rsc->writes)
diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c
index 95773c8f5bd..683fe86913a 100644
--- a/src/gallium/drivers/v3d/v3dx_draw.c
+++ b/src/gallium/drivers/v3d/v3dx_draw.c
@@ -1417,7 +1417,7 @@ v3d_draw_vbo(struct pipe_context *pctx, const struct pipe_draw_info *info,
                 rsc->initialized_buffers |= PIPE_CLEAR_STENCIL;
         }
 
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 uint32_t bit = PIPE_CLEAR_COLOR0 << i;
                 int blend_rt = v3d->blend->base.independent_blend_enable ? i : 0;
 
@@ -1670,7 +1670,7 @@ v3d_tlb_clear(struct v3d_job *job, unsigned buffers,
                 buffers &= ~PIPE_CLEAR_DEPTHSTENCIL;
         }
 
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 uint32_t bit = PIPE_CLEAR_COLOR0 << i;
                 if (!(buffers & bit))
                         continue;
diff --git a/src/gallium/drivers/v3d/v3dx_rcl.c b/src/gallium/drivers/v3d/v3dx_rcl.c
index d945350e7fe..7cebd3d0fc0 100644
--- a/src/gallium/drivers/v3d/v3dx_rcl.c
+++ b/src/gallium/drivers/v3d/v3dx_rcl.c
@@ -214,7 +214,7 @@ v3d_rcl_emit_loads(struct v3d_job *job, struct v3d_cl *cl, int layer)
 {
         uint32_t loads_pending = job->load;
 
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 uint32_t bit = PIPE_CLEAR_COLOR0 << i;
                 if (!(loads_pending & bit))
                         continue;
@@ -313,7 +313,7 @@ v3d_rcl_emit_stores(struct v3d_job *job, struct v3d_cl *cl, int layer)
          * perspective.  Non-MSAA surfaces will use
          * STORE_MULTI_SAMPLE_RESOLVED_TILE_COLOR_BUFFER_EXTENDED.
          */
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 uint32_t bit = PIPE_CLEAR_COLOR0 << i;
                 if (!(job->store & bit))
                         continue;
@@ -639,12 +639,6 @@ v3dX(emit_rcl)(struct v3d_job *job)
         job->submit.rcl_start = job->rcl.bo->offset;
         v3d_job_add_bo(job, job->rcl.bo);
 
-        int nr_cbufs = 0;
-        for (int i = 0; i < V3D_MAX_DRAW_BUFFERS; i++) {
-                if (job->cbufs[i])
-                        nr_cbufs = i + 1;
-        }
-
         /* Comon config must be the first TILE_RENDERING_MODE_CFG
          * and Z_STENCIL_CLEAR_VALUES must be last.  The ones in between are
          * optional updates to the previous HW state.
@@ -681,14 +675,14 @@ v3dX(emit_rcl)(struct v3d_job *job)
                 config.image_width_pixels = job->draw_width;
                 config.image_height_pixels = job->draw_height;
 
-                config.number_of_render_targets = MAX2(nr_cbufs, 1);
+                config.number_of_render_targets = MAX2(job->nr_cbufs, 1);
 
                 config.multisample_mode_4x = job->msaa;
 
                 config.maximum_bpp_of_all_render_targets = job->internal_bpp;
         }
 
-        for (int i = 0; i < nr_cbufs; i++) {
+        for (int i = 0; i < job->nr_cbufs; i++) {
                 struct pipe_surface *psurf = job->cbufs[i];
                 if (!psurf)
                         continue;



More information about the mesa-commit mailing list