v3d/compiler: handle GL/Vulkan differences in uniform handling
This also adds a v3d_execution_environment, so compiler could know if
it is generating code for OpenGL or Vulkan needs.
Reviewed-by: Iago Toral <itoral@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6766>
diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c
index 6b55bf7..72c0d37 100644
--- a/src/broadcom/compiler/nir_to_vir.c
+++ b/src/broadcom/compiler/nir_to_vir.c
@@ -241,10 +241,13 @@
v3d_unit_data_create(0, const_offset));
const_offset = 0;
} else if (instr->intrinsic == nir_intrinsic_load_ubo) {
- uint32_t index = nir_src_as_uint(instr->src[0]) + 1;
- /* Note that QUNIFORM_UBO_ADDR takes a UBO index shifted up by
- * 1 (0 is gallium's constant buffer 0).
- */
+ uint32_t index = nir_src_as_uint(instr->src[0]);
+ /* On OpenGL QUNIFORM_UBO_ADDR takes a UBO index
+ * shifted up by 1 (0 is gallium's constant buffer 0).
+ */
+ if (c->key->environment == V3D_ENVIRONMENT_OPENGL)
+ index++;
+
base_offset =
vir_uniform(c, QUNIFORM_UBO_ADDR,
v3d_unit_data_create(index, const_offset));
diff --git a/src/broadcom/compiler/v3d_compiler.h b/src/broadcom/compiler/v3d_compiler.h
index 5b837ea..ddb3d14 100644
--- a/src/broadcom/compiler/v3d_compiler.h
+++ b/src/broadcom/compiler/v3d_compiler.h
@@ -333,6 +333,11 @@
return slot.slot_and_component & 3;
}
+enum v3d_execution_environment {
+ V3D_ENVIRONMENT_OPENGL = 0,
+ V3D_ENVIRONMENT_VULKAN,
+};
+
struct v3d_key {
void *shader_state;
struct {
@@ -346,6 +351,8 @@
uint8_t num_tex_used;
uint8_t ucp_enables;
bool is_last_geometry_stage;
+
+ enum v3d_execution_environment environment;
};
struct v3d_fs_key {
diff --git a/src/broadcom/compiler/v3d_nir_lower_io.c b/src/broadcom/compiler/v3d_nir_lower_io.c
index 188194e..9242460 100644
--- a/src/broadcom/compiler/v3d_nir_lower_io.c
+++ b/src/broadcom/compiler/v3d_nir_lower_io.c
@@ -107,6 +107,12 @@
v3d_nir_lower_uniform(struct v3d_compile *c, nir_builder *b,
nir_intrinsic_instr *intr)
{
+ /* On SPIR-V/Vulkan we are already getting our offsets in
+ * bytes.
+ */
+ if (c->key->environment == V3D_ENVIRONMENT_VULKAN)
+ return;
+
b->cursor = nir_before_instr(&intr->instr);
nir_intrinsic_set_base(intr, nir_intrinsic_base(intr) * 16);
diff --git a/src/broadcom/vulkan/v3dv_pipeline.c b/src/broadcom/vulkan/v3dv_pipeline.c
index 4dd5524..95e7520 100644
--- a/src/broadcom/vulkan/v3dv_pipeline.c
+++ b/src/broadcom/vulkan/v3dv_pipeline.c
@@ -454,6 +454,8 @@
* revisited based on all the clip related extensions available.
*/
key->ucp_enables = 0;
+
+ key->environment = V3D_ENVIRONMENT_VULKAN;
}
/* FIXME: anv maps to hw primitive type. Perhaps eventually we would do the