v3d/compiler: handle GL/Vulkan differences in uniform handling
authorAlejandro Piñeiro <apinheiro@igalia.com>
Fri, 11 Sep 2020 21:42:19 +0000 (23:42 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 13 Oct 2020 21:21:27 +0000 (21:21 +0000)
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>

src/broadcom/compiler/nir_to_vir.c
src/broadcom/compiler/v3d_compiler.h
src/broadcom/compiler/v3d_nir_lower_io.c
src/broadcom/vulkan/v3dv_pipeline.c

index 6b55bf7..72c0d37 100644 (file)
@@ -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));
index 5b837ea..ddb3d14 100644 (file)
@@ -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 {
index 188194e..9242460 100644 (file)
@@ -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);
index 4dd5524..95e7520 100644 (file)
@@ -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