[Mesa-dev] [PATCH 01/10] glsl: add support for tracking atomic counter index across stages.
Dave Airlie
airlied at gmail.com
Thu Nov 2 05:42:41 UTC 2017
From: Dave Airlie <airlied at redhat.com>
If we have hardware like evergreen with limited hw counters, we need
to assign each used counter in a series of linked shaders a unique
index so the driver can assign them to the hw counters uniquely.
Since I need to know this information at compile time, I would
have to introduce shader variants in the backend for it if I can't
get it provided from the frontend, so this adds it to the front end
to avoid that.
Signed-off-by: Dave Airlie <airlied at redhat.com>
---
src/compiler/glsl/ir_uniform.h | 6 ++++++
src/compiler/glsl/link_atomics.cpp | 5 +++++
src/compiler/glsl/link_uniforms.cpp | 1 +
3 files changed, 12 insertions(+)
diff --git a/src/compiler/glsl/ir_uniform.h b/src/compiler/glsl/ir_uniform.h
index 9545c49..bfb7f33 100644
--- a/src/compiler/glsl/ir_uniform.h
+++ b/src/compiler/glsl/ir_uniform.h
@@ -184,6 +184,12 @@ struct gl_uniform_storage {
int atomic_buffer_index;
/**
+ * For drivers with limited shared hw atomic counters, this is the
+ * the index into the hw counters within all linked shaders.
+ */
+ int atomic_hw_counter_index;
+
+ /**
* The 'base location' for this uniform in the uniform remap table. For
* arrays this is the first element in the array.
* for subroutines this is in shader subroutine uniform remap table.
diff --git a/src/compiler/glsl/link_atomics.cpp b/src/compiler/glsl/link_atomics.cpp
index d26e62a..dbf7942 100644
--- a/src/compiler/glsl/link_atomics.cpp
+++ b/src/compiler/glsl/link_atomics.cpp
@@ -212,6 +212,8 @@ link_assign_atomic_counter_resources(struct gl_context *ctx,
prog->data->NumAtomicBuffers = num_buffers;
unsigned i = 0;
+ unsigned hw_counter_index = 0;
+
for (unsigned binding = 0;
binding < ctx->Const.MaxAtomicBufferBindings;
binding++) {
@@ -245,6 +247,9 @@ link_assign_atomic_counter_resources(struct gl_context *ctx,
storage->offset = var->data.offset;
storage->array_stride = (var->type->is_array() ?
var->type->without_array()->atomic_size() : 0);
+ storage->atomic_hw_counter_index = hw_counter_index;
+ hw_counter_index += storage->array_elements ? storage->array_elements : 1;
+
if (!var->type->is_matrix())
storage->matrix_stride = 0;
}
diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp
index 7d14154..6bf7e01 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -824,6 +824,7 @@ private:
this->uniforms[id].num_driver_storage = 0;
this->uniforms[id].driver_storage = NULL;
this->uniforms[id].atomic_buffer_index = -1;
+ this->uniforms[id].atomic_hw_counter_index = -1;
this->uniforms[id].hidden =
current_var->data.how_declared == ir_var_hidden;
this->uniforms[id].builtin = is_gl_identifier(name);
--
2.9.5
More information about the mesa-dev
mailing list