From c8212731e7d67a7036289696020bfa3a6f9c3f62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Pi=C3=B1eiro?= Date: Fri, 11 Sep 2020 23:42:19 +0200 Subject: [PATCH] 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 Part-of: --- src/broadcom/compiler/nir_to_vir.c | 11 +++++++---- src/broadcom/compiler/v3d_compiler.h | 7 +++++++ src/broadcom/compiler/v3d_nir_lower_io.c | 6 ++++++ src/broadcom/vulkan/v3dv_pipeline.c | 2 ++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/broadcom/compiler/nir_to_vir.c b/src/broadcom/compiler/nir_to_vir.c index 6b55bf7895f..72c0d372fb3 100644 --- a/src/broadcom/compiler/nir_to_vir.c +++ b/src/broadcom/compiler/nir_to_vir.c @@ -241,10 +241,13 @@ ntq_emit_tmu_general(struct v3d_compile *c, nir_intrinsic_instr *instr, 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 5b837eadf5f..ddb3d145bc9 100644 --- a/src/broadcom/compiler/v3d_compiler.h +++ b/src/broadcom/compiler/v3d_compiler.h @@ -333,6 +333,11 @@ static inline uint8_t v3d_slot_get_component(struct v3d_varying_slot slot) 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 @@ struct v3d_key { 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 188194e3936..9242460408e 100644 --- a/src/broadcom/compiler/v3d_nir_lower_io.c +++ b/src/broadcom/compiler/v3d_nir_lower_io.c @@ -107,6 +107,12 @@ static void 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 4dd5524fcd4..95e7520779b 100644 --- a/src/broadcom/vulkan/v3dv_pipeline.c +++ b/src/broadcom/vulkan/v3dv_pipeline.c @@ -454,6 +454,8 @@ pipeline_populate_v3d_key(struct v3d_key *key, * 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