[virglrenderer-devel] [PATCH 6/9] renderer: refactor draw time sampler binding.

Dave Airlie airlied at gmail.com
Thu Jun 14 02:01:49 UTC 2018


From: Dave Airlie <airlied at redhat.com>

This pulls the per shader type code out into a separate function.
This is prep work for adding compute shaders.
---
 src/vrend_renderer.c | 116 +++++++++++++++++++++++++++------------------------
 1 file changed, 61 insertions(+), 55 deletions(-)

diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c
index 82b1ce9..be3bd64 100644
--- a/src/vrend_renderer.c
+++ b/src/vrend_renderer.c
@@ -2954,70 +2954,76 @@ static void vrend_draw_bind_vertex_binding(struct vrend_context *ctx,
    }
 }
 
-static void vrend_draw_bind_samplers(struct vrend_context *ctx)
+static void vrend_draw_bind_samplers_shader(struct vrend_context *ctx,
+                                            int shader_type,
+                                            int *sampler_id)
 {
-   int sampler_id;
-   int i;
-   int shader_type;
+   int index = 0;
+   for (int i = 0; i < ctx->sub->views[shader_type].num_views; i++) {
+      struct vrend_resource *texture = NULL;
 
-   sampler_id = 0;
-   for (shader_type = PIPE_SHADER_VERTEX; shader_type <= ctx->sub->last_shader_idx; shader_type++) {
-      int index = 0;
-      for (i = 0; i < ctx->sub->views[shader_type].num_views; i++) {
-         struct vrend_resource *texture = NULL;
+      if (ctx->sub->views[shader_type].views[i]) {
+         texture = ctx->sub->views[shader_type].views[i]->texture;
+      }
 
-         if (ctx->sub->views[shader_type].views[i]) {
-            texture = ctx->sub->views[shader_type].views[i]->texture;
-         }
+      if (!(ctx->sub->prog->samplers_used_mask[shader_type] & (1 << i)))
+         continue;
 
-         if (!(ctx->sub->prog->samplers_used_mask[shader_type] & (1 << i)))
-            continue;
+      if (ctx->sub->prog->samp_locs[shader_type])
+         glUniform1i(ctx->sub->prog->samp_locs[shader_type][index], *sampler_id);
+
+      if (ctx->sub->prog->shadow_samp_mask[shader_type] & (1 << i)) {
+         struct vrend_sampler_view *tview = ctx->sub->views[shader_type].views[i];
+         glUniform4f(ctx->sub->prog->shadow_samp_mask_locs[shader_type][index],
+                     (tview->gl_swizzle_r == GL_ZERO || tview->gl_swizzle_r == GL_ONE) ? 0.0 : 1.0,
+                     (tview->gl_swizzle_g == GL_ZERO || tview->gl_swizzle_g == GL_ONE) ? 0.0 : 1.0,
+                     (tview->gl_swizzle_b == GL_ZERO || tview->gl_swizzle_b == GL_ONE) ? 0.0 : 1.0,
+                     (tview->gl_swizzle_a == GL_ZERO || tview->gl_swizzle_a == GL_ONE) ? 0.0 : 1.0);
+         glUniform4f(ctx->sub->prog->shadow_samp_add_locs[shader_type][index],
+                     tview->gl_swizzle_r == GL_ONE ? 1.0 : 0.0,
+                     tview->gl_swizzle_g == GL_ONE ? 1.0 : 0.0,
+                     tview->gl_swizzle_b == GL_ONE ? 1.0 : 0.0,
+                     tview->gl_swizzle_a == GL_ONE ? 1.0 : 0.0);
+      }
+
+      glActiveTexture(GL_TEXTURE0 + *sampler_id);
+      if (texture) {
+         GLuint id;
+         GLenum target = texture->target;
+
+         if (texture->is_buffer) {
+            id = texture->tbo_tex_id;
+            target = GL_TEXTURE_BUFFER;
+         } else
+            id = texture->id;
 
-         if (ctx->sub->prog->samp_locs[shader_type])
-            glUniform1i(ctx->sub->prog->samp_locs[shader_type][index], sampler_id);
-
-         if (ctx->sub->prog->shadow_samp_mask[shader_type] & (1 << i)) {
-            struct vrend_sampler_view *tview = ctx->sub->views[shader_type].views[i];
-            glUniform4f(ctx->sub->prog->shadow_samp_mask_locs[shader_type][index],
-                        (tview->gl_swizzle_r == GL_ZERO || tview->gl_swizzle_r == GL_ONE) ? 0.0 : 1.0,
-                        (tview->gl_swizzle_g == GL_ZERO || tview->gl_swizzle_g == GL_ONE) ? 0.0 : 1.0,
-                        (tview->gl_swizzle_b == GL_ZERO || tview->gl_swizzle_b == GL_ONE) ? 0.0 : 1.0,
-                        (tview->gl_swizzle_a == GL_ZERO || tview->gl_swizzle_a == GL_ONE) ? 0.0 : 1.0);
-            glUniform4f(ctx->sub->prog->shadow_samp_add_locs[shader_type][index],
-                        tview->gl_swizzle_r == GL_ONE ? 1.0 : 0.0,
-                        tview->gl_swizzle_g == GL_ONE ? 1.0 : 0.0,
-                        tview->gl_swizzle_b == GL_ONE ? 1.0 : 0.0,
-                        tview->gl_swizzle_a == GL_ONE ? 1.0 : 0.0);
+         glBindTexture(target, id);
+         if (ctx->sub->views[shader_type].old_ids[i] != id || ctx->sub->sampler_state_dirty) {
+            vrend_apply_sampler_state(ctx, texture, shader_type, i, *sampler_id, ctx->sub->views[shader_type].views[i]->srgb_decode);
+            ctx->sub->views[shader_type].old_ids[i] = id;
          }
-
-         glActiveTexture(GL_TEXTURE0 + sampler_id);
-         if (texture) {
-            GLuint id;
-            GLenum target = texture->target;
-
-            if (texture->is_buffer) {
-               id = texture->tbo_tex_id;
-               target = GL_TEXTURE_BUFFER;
-            } else
-               id = texture->id;
-
-            glBindTexture(target, id);
-            if (ctx->sub->views[shader_type].old_ids[i] != id || ctx->sub->sampler_state_dirty) {
-               vrend_apply_sampler_state(ctx, texture, shader_type, i, sampler_id, ctx->sub->views[shader_type].views[i]->srgb_decode);
-               ctx->sub->views[shader_type].old_ids[i] = id;
-            }
-            if (ctx->sub->rs_state.point_quad_rasterization) {
-               if (vrend_state.use_core_profile == false) {
-                  if (ctx->sub->rs_state.sprite_coord_enable & (1 << i))
-                     glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
-                  else
-                     glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_FALSE);
-               }
+         if (ctx->sub->rs_state.point_quad_rasterization) {
+            if (vrend_state.use_core_profile == false) {
+               if (ctx->sub->rs_state.sprite_coord_enable & (1 << i))
+                  glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);
+               else
+                  glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_FALSE);
             }
-            sampler_id++;
          }
-         index++;
+         (*sampler_id)++;
       }
+      index++;
+   }
+}
+
+static void vrend_draw_bind_samplers(struct vrend_context *ctx)
+{
+   int sampler_id;
+   int shader_type;
+
+   sampler_id = 0;
+   for (shader_type = PIPE_SHADER_VERTEX; shader_type <= ctx->sub->last_shader_idx; shader_type++) {
+      vrend_draw_bind_samplers_shader(ctx, shader_type, &sampler_id);
    }
 
    if (vrend_state.use_core_profile && ctx->sub->prog->fs_stipple_loc != -1) {
-- 
2.14.3



More information about the virglrenderer-devel mailing list