Re: [Mesa-dev] [PATCH 01/18] nir/linker: handle uniforms without explicit location

2018-06-30 Thread Timothy Arceri



On 30/06/18 16:05, Timothy Arceri wrote:

On 30/06/18 00:28, Alejandro Piñeiro wrote:

ARB_gl_spirv points that uniforms in general need explicit
location. But there are still some cases of uniforms without location,
like for example uniform atomic counters. Those doesn't have a
location from the OpenGL point of view (they are identified with a
binding), but Mesa internally assigns it a location.

Signed-off-by: Eduardo Lima 
Signed-off-by: Alejandro Piñeiro 
Signed-off-by: Neil Roberts 
---

The @FIXME included on the patch below is solved with the follow-up
path "nir/linker: use empty block info to assign uniform locations",
so perhaps it makes sense to just squash both patches. I don't have a
strong opinion on that, but I think that it would be easier to review
as splitted patches.


  src/compiler/glsl/gl_nir_link_uniforms.c | 61 
++--

  1 file changed, 59 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c 
b/src/compiler/glsl/gl_nir_link_uniforms.c

index c6961fbb6ca..388c1ab63fc 100644
--- a/src/compiler/glsl/gl_nir_link_uniforms.c
+++ b/src/compiler/glsl/gl_nir_link_uniforms.c
@@ -36,6 +36,8 @@
   * normal uniforms as mandatory, and so on).
   */
+#define UNMAPPED_UNIFORM_LOC ~0u
+
  static void
  nir_setup_uniform_remap_tables(struct gl_context *ctx,
 struct gl_shader_program *prog)
@@ -58,8 +60,59 @@ nir_setup_uniform_remap_tables(struct gl_context *ctx,
 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
    struct gl_uniform_storage *uniform = 
>data->UniformStorage[i];
+  if (prog->data->UniformStorage[i].remap_location == 
UNMAPPED_UNIFORM_LOC)

+ continue;
+
+  /* How many new entries for this uniform? */
+  const unsigned entries = MAX2(1, uniform->array_elements);
+  unsigned num_slots = glsl_get_component_slots(uniform->type);
+
+  uniform->storage = [data_pos];
+
+  /* Set remap table entries point to correct gl_uniform_storage. */
+  for (unsigned j = 0; j < entries; j++) {
+ unsigned element_loc = uniform->remap_location + j;
+ prog->UniformRemapTable[element_loc] = uniform;
+
+ data_pos += num_slots;
+  }
+   }
+
+   /* Reserve locations for rest of the uniforms. */
+   for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
+  struct gl_uniform_storage *uniform = 
>data->UniformStorage[i];

+
+  if (uniform->is_shader_storage)
+ continue;
+
+  /* Built-in uniforms should not get any location. */
+  if (uniform->builtin)
+ continue;
+
+  /* Explicit ones have been set already. */
+  if (uniform->remap_location != UNMAPPED_UNIFORM_LOC)
+ continue;
+
    /* How many new entries for this uniform? */
    const unsigned entries = MAX2(1, uniform->array_elements);
+
+  /* @FIXME: By now, we add un-assigned uniform locations to the 
end of
+   * the uniform file. We need to keep track of empty locations 
and use

+   * them.
+   */


Maybe reword this to:

/* @FIXME: For now, we add un-assigned uniform locations to the end of
  * the uniform file. We should fix this to keep track of empty
  * locations and use those first.
  */



+  unsigned chosen_location = prog->NumUniformRemapTable;


Can we please just rename chosen_location 


Whoops that should be:

Can we please just rename chosen_location -> location


With those two nits this patch is:

Reviewed-by: Timothy Arceri 

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 01/18] nir/linker: handle uniforms without explicit location

2018-06-30 Thread Timothy Arceri

On 30/06/18 00:28, Alejandro Piñeiro wrote:

ARB_gl_spirv points that uniforms in general need explicit
location. But there are still some cases of uniforms without location,
like for example uniform atomic counters. Those doesn't have a
location from the OpenGL point of view (they are identified with a
binding), but Mesa internally assigns it a location.

Signed-off-by: Eduardo Lima 
Signed-off-by: Alejandro Piñeiro 
Signed-off-by: Neil Roberts 
---

The @FIXME included on the patch below is solved with the follow-up
path "nir/linker: use empty block info to assign uniform locations",
so perhaps it makes sense to just squash both patches. I don't have a
strong opinion on that, but I think that it would be easier to review
as splitted patches.


  src/compiler/glsl/gl_nir_link_uniforms.c | 61 ++--
  1 file changed, 59 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c 
b/src/compiler/glsl/gl_nir_link_uniforms.c
index c6961fbb6ca..388c1ab63fc 100644
--- a/src/compiler/glsl/gl_nir_link_uniforms.c
+++ b/src/compiler/glsl/gl_nir_link_uniforms.c
@@ -36,6 +36,8 @@
   * normal uniforms as mandatory, and so on).
   */
  
+#define UNMAPPED_UNIFORM_LOC ~0u

+
  static void
  nir_setup_uniform_remap_tables(struct gl_context *ctx,
 struct gl_shader_program *prog)
@@ -58,8 +60,59 @@ nir_setup_uniform_remap_tables(struct gl_context *ctx,
 for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
struct gl_uniform_storage *uniform = >data->UniformStorage[i];
  
+  if (prog->data->UniformStorage[i].remap_location == UNMAPPED_UNIFORM_LOC)

+ continue;
+
+  /* How many new entries for this uniform? */
+  const unsigned entries = MAX2(1, uniform->array_elements);
+  unsigned num_slots = glsl_get_component_slots(uniform->type);
+
+  uniform->storage = [data_pos];
+
+  /* Set remap table entries point to correct gl_uniform_storage. */
+  for (unsigned j = 0; j < entries; j++) {
+ unsigned element_loc = uniform->remap_location + j;
+ prog->UniformRemapTable[element_loc] = uniform;
+
+ data_pos += num_slots;
+  }
+   }
+
+   /* Reserve locations for rest of the uniforms. */
+   for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
+  struct gl_uniform_storage *uniform = >data->UniformStorage[i];
+
+  if (uniform->is_shader_storage)
+ continue;
+
+  /* Built-in uniforms should not get any location. */
+  if (uniform->builtin)
+ continue;
+
+  /* Explicit ones have been set already. */
+  if (uniform->remap_location != UNMAPPED_UNIFORM_LOC)
+ continue;
+
/* How many new entries for this uniform? */
const unsigned entries = MAX2(1, uniform->array_elements);
+
+  /* @FIXME: By now, we add un-assigned uniform locations to the end of
+   * the uniform file. We need to keep track of empty locations and use
+   * them.
+   */


Maybe reword this to:

/* @FIXME: For now, we add un-assigned uniform locations to the end of
 * the uniform file. We should fix this to keep track of empty
 * locations and use those first.
 */



+  unsigned chosen_location = prog->NumUniformRemapTable;


Can we please just rename chosen_location

With those two nits this patch is:

Reviewed-by: Timothy Arceri 


+
+  /* resize remap table to fit new entries */
+  prog->UniformRemapTable =
+ reralloc(prog,
+  prog->UniformRemapTable,
+  struct gl_uniform_storage *,
+  prog->NumUniformRemapTable + entries);
+  prog->NumUniformRemapTable += entries;
+
+  /* set the base location in remap table for the uniform */
+  uniform->remap_location = chosen_location;
+
unsigned num_slots = glsl_get_component_slots(uniform->type);
  
uniform->storage = [data_pos];

@@ -302,8 +355,12 @@ nir_link_uniform(struct gl_context *ctx,
}
uniform->active_shader_mask |= 1 << stage;
  
-  /* Uniform has an explicit location */

-  uniform->remap_location = location;
+  if (location >= 0) {
+ /* Uniform has an explicit location */
+ uniform->remap_location = location;
+  } else {
+ uniform->remap_location = UNMAPPED_UNIFORM_LOC;
+  }
  
/* @FIXME: the initialization of the following will be done as we

 * implement support for their specific features, like SSBO, atomics,


___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 01/18] nir/linker: handle uniforms without explicit location

2018-06-29 Thread Alejandro Piñeiro
ARB_gl_spirv points that uniforms in general need explicit
location. But there are still some cases of uniforms without location,
like for example uniform atomic counters. Those doesn't have a
location from the OpenGL point of view (they are identified with a
binding), but Mesa internally assigns it a location.

Signed-off-by: Eduardo Lima 
Signed-off-by: Alejandro Piñeiro 
Signed-off-by: Neil Roberts 
---

The @FIXME included on the patch below is solved with the follow-up
path "nir/linker: use empty block info to assign uniform locations",
so perhaps it makes sense to just squash both patches. I don't have a
strong opinion on that, but I think that it would be easier to review
as splitted patches.


 src/compiler/glsl/gl_nir_link_uniforms.c | 61 ++--
 1 file changed, 59 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl/gl_nir_link_uniforms.c 
b/src/compiler/glsl/gl_nir_link_uniforms.c
index c6961fbb6ca..388c1ab63fc 100644
--- a/src/compiler/glsl/gl_nir_link_uniforms.c
+++ b/src/compiler/glsl/gl_nir_link_uniforms.c
@@ -36,6 +36,8 @@
  * normal uniforms as mandatory, and so on).
  */
 
+#define UNMAPPED_UNIFORM_LOC ~0u
+
 static void
 nir_setup_uniform_remap_tables(struct gl_context *ctx,
struct gl_shader_program *prog)
@@ -58,8 +60,59 @@ nir_setup_uniform_remap_tables(struct gl_context *ctx,
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
   struct gl_uniform_storage *uniform = >data->UniformStorage[i];
 
+  if (prog->data->UniformStorage[i].remap_location == UNMAPPED_UNIFORM_LOC)
+ continue;
+
+  /* How many new entries for this uniform? */
+  const unsigned entries = MAX2(1, uniform->array_elements);
+  unsigned num_slots = glsl_get_component_slots(uniform->type);
+
+  uniform->storage = [data_pos];
+
+  /* Set remap table entries point to correct gl_uniform_storage. */
+  for (unsigned j = 0; j < entries; j++) {
+ unsigned element_loc = uniform->remap_location + j;
+ prog->UniformRemapTable[element_loc] = uniform;
+
+ data_pos += num_slots;
+  }
+   }
+
+   /* Reserve locations for rest of the uniforms. */
+   for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
+  struct gl_uniform_storage *uniform = >data->UniformStorage[i];
+
+  if (uniform->is_shader_storage)
+ continue;
+
+  /* Built-in uniforms should not get any location. */
+  if (uniform->builtin)
+ continue;
+
+  /* Explicit ones have been set already. */
+  if (uniform->remap_location != UNMAPPED_UNIFORM_LOC)
+ continue;
+
   /* How many new entries for this uniform? */
   const unsigned entries = MAX2(1, uniform->array_elements);
+
+  /* @FIXME: By now, we add un-assigned uniform locations to the end of
+   * the uniform file. We need to keep track of empty locations and use
+   * them.
+   */
+  unsigned chosen_location = prog->NumUniformRemapTable;
+
+  /* resize remap table to fit new entries */
+  prog->UniformRemapTable =
+ reralloc(prog,
+  prog->UniformRemapTable,
+  struct gl_uniform_storage *,
+  prog->NumUniformRemapTable + entries);
+  prog->NumUniformRemapTable += entries;
+
+  /* set the base location in remap table for the uniform */
+  uniform->remap_location = chosen_location;
+
   unsigned num_slots = glsl_get_component_slots(uniform->type);
 
   uniform->storage = [data_pos];
@@ -302,8 +355,12 @@ nir_link_uniform(struct gl_context *ctx,
   }
   uniform->active_shader_mask |= 1 << stage;
 
-  /* Uniform has an explicit location */
-  uniform->remap_location = location;
+  if (location >= 0) {
+ /* Uniform has an explicit location */
+ uniform->remap_location = location;
+  } else {
+ uniform->remap_location = UNMAPPED_UNIFORM_LOC;
+  }
 
   /* @FIXME: the initialization of the following will be done as we
* implement support for their specific features, like SSBO, atomics,
-- 
2.14.1

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev