Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-28 Thread Tapani Pälli
On 08/28/2014 01:50 AM, Micael wrote:
 I am getting another error regarding explicit locations, which I
 believe has a one-line fix. If I only have a single uniform in my
 shader, and that uniform is explicitely given location 1 (or anything
 above zero), my program will crash if I attempt to give the
 unnassigned locs a value with glProgramUniform1i().
 A quick view into the code appears to reveal
 reserve_explicit_locations() as the culprit by initializing the remap
 table entries to NULL instead of INACTIVE_UNIFORM_EXPLICIT_LOCATION,
 which will allow validate_uniform_parameters() to pass the test if
 (shProg-UniformRemapTable[location]
 ==INACTIVE_UNIFORM_EXPLICIT_LOCATION) later.

 Should I open another bug report?


Yes please, I'll write a Piglit test for this.

Thanks;


 On Wed, Aug 27, 2014 at 11:15 AM, Tapani Pälli tapani.pa...@intel.com
 mailto:tapani.pa...@intel.com wrote:

 On 08/26/2014 10:37 PM, Ian Romanick wrote:
  On 08/23/2014 07:51 AM, Micael wrote:
  On second thought, the glsl_type::uniform_locations() method
 comment in
  the header file says:
  /**
   * Calculate the number of unique values from
 glGetUniformLocation for the
   * elements of the type.
   */
 
  Which makes me believe that maybe we should return at least 1
 for every
  case because this is only called for explicit locations and
 therefore
  will not make shaders failing to link unless they've
 explicitely used
  more locations than they should.
  Maybe glsl_type::uniform_locations() should be renamed to
 something that
  makes it clear it's only used for explicit locations too, or
 make it
  clear that it reflects the size for the API, not GPU memory
 (since it's
  only used to fill prog-UniformRemapTable).
  I spent some time this morning looking at this code a bit more
 closely,
  and I think you're right.  The problem is that GL overloads
 locations
  both to mean the number of handles a uniform gets and to mean
 amount
  of storage space the uniform occupies.  For some things this is
 the same
  (simple variables, arrays, structures), but for other things it
 is not
  (matrices, samplers, other opaque types).
 
  I think it's weird for uniform_locations to call component_slots
 at all.

 Yep, at the moment of writing this I have gotten confused of the
 locations and actual storage space (resulting in vectors using too
 many
 locs). As this is my mess, I've sent a patch that implements the count
 as you describe below + adds a bit more documentation to the header.

  Looking at the OpenGL 4.2 spec, it seems that everything except
 atomic
  counters and subroutines (not yet supported by Mesa) should have at
  least one location per array element.
 
  Here's what I think would be better: have uniform_locations
 mirror the
  structure of component_slots.  Eliminate the is_matrix() check
 at the
  top, and just have all the basic types (e.g., GLSL_TYPE_FLOAT)
 return 1.
 
  Keeping functions separate that count separate kinds of things seems
  like a good idea.
 
  On Sat, Aug 23, 2014 at 2:07 PM, Micael kam1k...@gmail.com
 mailto:kam1k...@gmail.com
  mailto:kam1k...@gmail.com mailto:kam1k...@gmail.com wrote:
 
  On Fri, Aug 22, 2014 at 9:23 PM, Ian Romanick
 i...@freedesktop.org mailto:i...@freedesktop.org
  mailto:i...@freedesktop.org mailto:i...@freedesktop.org
 wrote:
 
  I'm not sure this is correct, and I think we need a
 more complex
  fix.
  As Dave points out, bindless will make it even more
 complex.
 
  In a non-bindless, static-sampler-array-indexing world,
 applications
  assume that samplers will use zero uniform locations. 
 The sampler
  information is baked into the instructions, and it
 isn't represented
  anywhere else in GPU memory.  As a result, I would not be
  surprised to
  see previously working applications fail to link (due
 to using
  too many
  uniforms) with this change.
 
  It seems that the only time a sampler needs non-zero
 space is
  when it is
  part of any array samplers (or array of structures
 containing
  samplers,
  etc.) or is bindless.  In the array cases, it is
 probably only
  necessary
  when the index is dynamic.  I think the array splitting and
  structure
  splitting passes may make that moot.
 
 
  Did you miss the case of assigning an explicit location to a
  sampler, or did you ommit on purpose?
  I'm not very familiar with mesa source, but as far as I could
  analyze it, 

Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-27 Thread Micael
I am getting another error regarding explicit locations, which I believe
has a one-line fix. If I only have a single uniform in my shader, and that
uniform is explicitely given location 1 (or anything above zero), my
program will crash if I attempt to give the unnassigned locs a value with
glProgramUniform1i().
A quick view into the code appears to reveal reserve_explicit_locations()
as the culprit by initializing the remap table entries to NULL instead of
INACTIVE_UNIFORM_EXPLICIT_LOCATION, which will allow
validate_uniform_parameters() to pass the test if
(shProg-UniformRemapTable[location] ==INACTIVE_UNIFORM_EXPLICIT_LOCATION)
later.

Should I open another bug report?


On Wed, Aug 27, 2014 at 11:15 AM, Tapani Pälli tapani.pa...@intel.com
wrote:

 On 08/26/2014 10:37 PM, Ian Romanick wrote:
  On 08/23/2014 07:51 AM, Micael wrote:
  On second thought, the glsl_type::uniform_locations() method comment in
  the header file says:
  /**
   * Calculate the number of unique values from glGetUniformLocation for
 the
   * elements of the type.
   */
 
  Which makes me believe that maybe we should return at least 1 for every
  case because this is only called for explicit locations and therefore
  will not make shaders failing to link unless they've explicitely used
  more locations than they should.
  Maybe glsl_type::uniform_locations() should be renamed to something that
  makes it clear it's only used for explicit locations too, or make it
  clear that it reflects the size for the API, not GPU memory (since it's
  only used to fill prog-UniformRemapTable).
  I spent some time this morning looking at this code a bit more closely,
  and I think you're right.  The problem is that GL overloads locations
  both to mean the number of handles a uniform gets and to mean amount
  of storage space the uniform occupies.  For some things this is the same
  (simple variables, arrays, structures), but for other things it is not
  (matrices, samplers, other opaque types).
 
  I think it's weird for uniform_locations to call component_slots at all.

 Yep, at the moment of writing this I have gotten confused of the
 locations and actual storage space (resulting in vectors using too many
 locs). As this is my mess, I've sent a patch that implements the count
 as you describe below + adds a bit more documentation to the header.

  Looking at the OpenGL 4.2 spec, it seems that everything except atomic
  counters and subroutines (not yet supported by Mesa) should have at
  least one location per array element.
 
  Here's what I think would be better: have uniform_locations mirror the
  structure of component_slots.  Eliminate the is_matrix() check at the
  top, and just have all the basic types (e.g., GLSL_TYPE_FLOAT) return 1.
 
  Keeping functions separate that count separate kinds of things seems
  like a good idea.
 
  On Sat, Aug 23, 2014 at 2:07 PM, Micael kam1k...@gmail.com
  mailto:kam1k...@gmail.com wrote:
 
  On Fri, Aug 22, 2014 at 9:23 PM, Ian Romanick i...@freedesktop.org
  mailto:i...@freedesktop.org wrote:
 
  I'm not sure this is correct, and I think we need a more complex
  fix.
  As Dave points out, bindless will make it even more complex.
 
  In a non-bindless, static-sampler-array-indexing world,
 applications
  assume that samplers will use zero uniform locations.  The
 sampler
  information is baked into the instructions, and it isn't
 represented
  anywhere else in GPU memory.  As a result, I would not be
  surprised to
  see previously working applications fail to link (due to using
  too many
  uniforms) with this change.
 
  It seems that the only time a sampler needs non-zero space is
  when it is
  part of any array samplers (or array of structures containing
  samplers,
  etc.) or is bindless.  In the array cases, it is probably only
  necessary
  when the index is dynamic.  I think the array splitting and
  structure
  splitting passes may make that moot.
 
 
  Did you miss the case of assigning an explicit location to a
  sampler, or did you ommit on purpose?
  I'm not very familiar with mesa source, but as far as I could
  analyze it, only reserve_explicit_locations() and
  validate_explicit_location() call glsl_type::uniform_locations(),
  everything else uses glsl_type::component_slots().
  Now I agree with you that simply returning 1 from
  glsl_type::uniform_locations() for samplers can be misleading.
 
  How about if glsl_type::uniform_locations() takes a bool
  isExplicitLocation and return at least 1 for every type? I am aware
  that this won't solve the bindless textures issue, but it would fix
  this bug (and the integer underflows) for now, I think.
 
 
 
  The 82921 bug seems to be an orthognal issue.  There is a
 difference
  between the API visible 

Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-26 Thread Ian Romanick
On 08/23/2014 07:51 AM, Micael wrote:
 On second thought, the glsl_type::uniform_locations() method comment in
 the header file says:
 /**
  * Calculate the number of unique values from glGetUniformLocation for the
  * elements of the type.
  */
 
 Which makes me believe that maybe we should return at least 1 for every
 case because this is only called for explicit locations and therefore
 will not make shaders failing to link unless they've explicitely used
 more locations than they should.
 Maybe glsl_type::uniform_locations() should be renamed to something that
 makes it clear it's only used for explicit locations too, or make it
 clear that it reflects the size for the API, not GPU memory (since it's
 only used to fill prog-UniformRemapTable).

I spent some time this morning looking at this code a bit more closely,
and I think you're right.  The problem is that GL overloads locations
both to mean the number of handles a uniform gets and to mean amount
of storage space the uniform occupies.  For some things this is the same
(simple variables, arrays, structures), but for other things it is not
(matrices, samplers, other opaque types).

I think it's weird for uniform_locations to call component_slots at all.

Looking at the OpenGL 4.2 spec, it seems that everything except atomic
counters and subroutines (not yet supported by Mesa) should have at
least one location per array element.

Here's what I think would be better: have uniform_locations mirror the
structure of component_slots.  Eliminate the is_matrix() check at the
top, and just have all the basic types (e.g., GLSL_TYPE_FLOAT) return 1.

Keeping functions separate that count separate kinds of things seems
like a good idea.

 On Sat, Aug 23, 2014 at 2:07 PM, Micael kam1k...@gmail.com
 mailto:kam1k...@gmail.com wrote:
 
 On Fri, Aug 22, 2014 at 9:23 PM, Ian Romanick i...@freedesktop.org
 mailto:i...@freedesktop.org wrote:
 
 I'm not sure this is correct, and I think we need a more complex
 fix.
 As Dave points out, bindless will make it even more complex.
 
 In a non-bindless, static-sampler-array-indexing world, applications
 assume that samplers will use zero uniform locations.  The sampler
 information is baked into the instructions, and it isn't represented
 anywhere else in GPU memory.  As a result, I would not be
 surprised to
 see previously working applications fail to link (due to using
 too many
 uniforms) with this change.
 
 It seems that the only time a sampler needs non-zero space is
 when it is
 part of any array samplers (or array of structures containing
 samplers,
 etc.) or is bindless.  In the array cases, it is probably only
 necessary
 when the index is dynamic.  I think the array splitting and
 structure
 splitting passes may make that moot.
 
 
 Did you miss the case of assigning an explicit location to a
 sampler, or did you ommit on purpose?
 I'm not very familiar with mesa source, but as far as I could
 analyze it, only reserve_explicit_locations() and
 validate_explicit_location() call glsl_type::uniform_locations(),
 everything else uses glsl_type::component_slots().
 Now I agree with you that simply returning 1 from
 glsl_type::uniform_locations() for samplers can be misleading.
 
 How about if glsl_type::uniform_locations() takes a bool
 isExplicitLocation and return at least 1 for every type? I am aware
 that this won't solve the bindless textures issue, but it would fix
 this bug (and the integer underflows) for now, I think.
  
 
 
 The 82921 bug seems to be an orthognal issue.  There is a difference
 between the API visible locations assigned to a uniform and the GPU
 visible locations where the uniform is stored.  My guess is that
 we're
 using the same accounting for both in places where we should not.
 
 On 08/21/2014 04:25 PM, Micael Dias wrote:
  ---
  If samplers occupy zero locations we can run into a lot of
 issues. See #82921.
  I briefly tested this with my own code (which was previously
 crashing and
  misbehaving) and also ran other apps and everything seems to
 work fine.
  I'm not used to contributing code in this fashion, so please
 forgive me if I'm
  making some mistake. Thanks.
 
   src/glsl/glsl_types.cpp | 2 ++
   1 file changed, 2 insertions(+)
 
  diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
  index 66e9b13..cc05193 100644
  --- a/src/glsl/glsl_types.cpp
  +++ b/src/glsl/glsl_types.cpp
  @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
 return size;
  case GLSL_TYPE_ARRAY:
 return this-length *
 

Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-23 Thread Micael
On Fri, Aug 22, 2014 at 9:23 PM, Ian Romanick i...@freedesktop.org wrote:

 I'm not sure this is correct, and I think we need a more complex fix.
 As Dave points out, bindless will make it even more complex.

 In a non-bindless, static-sampler-array-indexing world, applications
 assume that samplers will use zero uniform locations.  The sampler
 information is baked into the instructions, and it isn't represented
 anywhere else in GPU memory.  As a result, I would not be surprised to
 see previously working applications fail to link (due to using too many
 uniforms) with this change.

 It seems that the only time a sampler needs non-zero space is when it is
 part of any array samplers (or array of structures containing samplers,
 etc.) or is bindless.  In the array cases, it is probably only necessary
 when the index is dynamic.  I think the array splitting and structure
 splitting passes may make that moot.


Did you miss the case of assigning an explicit location to a sampler, or
did you ommit on purpose?
I'm not very familiar with mesa source, but as far as I could analyze it,
only reserve_explicit_locations() and validate_explicit_location() call
glsl_type::uniform_locations(), everything else uses
glsl_type::component_slots().
Now I agree with you that simply returning 1 from
glsl_type::uniform_locations() for samplers can be misleading.

How about if glsl_type::uniform_locations() takes a bool
isExplicitLocation and return at least 1 for every type? I am aware that
this won't solve the bindless textures issue, but it would fix this bug
(and the integer underflows) for now, I think.



 The 82921 bug seems to be an orthognal issue.  There is a difference
 between the API visible locations assigned to a uniform and the GPU
 visible locations where the uniform is stored.  My guess is that we're
 using the same accounting for both in places where we should not.

 On 08/21/2014 04:25 PM, Micael Dias wrote:
  ---
  If samplers occupy zero locations we can run into a lot of issues. See
 #82921.
  I briefly tested this with my own code (which was previously crashing and
  misbehaving) and also ran other apps and everything seems to work fine.
  I'm not used to contributing code in this fashion, so please forgive me
 if I'm
  making some mistake. Thanks.
 
   src/glsl/glsl_types.cpp | 2 ++
   1 file changed, 2 insertions(+)
 
  diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
  index 66e9b13..cc05193 100644
  --- a/src/glsl/glsl_types.cpp
  +++ b/src/glsl/glsl_types.cpp
  @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
 return size;
  case GLSL_TYPE_ARRAY:
 return this-length * this-fields.array-uniform_locations();
  +   case GLSL_TYPE_SAMPLER:
  +  return 1;
  default:
 break;
  }
 




-- 
Micael Dias
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-23 Thread Micael
On second thought, the glsl_type::uniform_locations() method comment in the
header file says:
/**
 * Calculate the number of unique values from glGetUniformLocation for the
 * elements of the type.
 */

Which makes me believe that maybe we should return at least 1 for every
case because this is only called for explicit locations and therefore will
not make shaders failing to link unless they've explicitely used more
locations than they should.
Maybe glsl_type::uniform_locations() should be renamed to something that
makes it clear it's only used for explicit locations too, or make it clear
that it reflects the size for the API, not GPU memory (since it's only used
to fill prog-UniformRemapTable).


On Sat, Aug 23, 2014 at 2:07 PM, Micael kam1k...@gmail.com wrote:

 On Fri, Aug 22, 2014 at 9:23 PM, Ian Romanick i...@freedesktop.org wrote:

 I'm not sure this is correct, and I think we need a more complex fix.
 As Dave points out, bindless will make it even more complex.

 In a non-bindless, static-sampler-array-indexing world, applications
 assume that samplers will use zero uniform locations.  The sampler
 information is baked into the instructions, and it isn't represented
 anywhere else in GPU memory.  As a result, I would not be surprised to
 see previously working applications fail to link (due to using too many
 uniforms) with this change.

 It seems that the only time a sampler needs non-zero space is when it is
 part of any array samplers (or array of structures containing samplers,
 etc.) or is bindless.  In the array cases, it is probably only necessary
 when the index is dynamic.  I think the array splitting and structure
 splitting passes may make that moot.


 Did you miss the case of assigning an explicit location to a sampler, or
 did you ommit on purpose?
 I'm not very familiar with mesa source, but as far as I could analyze it,
 only reserve_explicit_locations() and validate_explicit_location() call
 glsl_type::uniform_locations(), everything else uses
 glsl_type::component_slots().
 Now I agree with you that simply returning 1 from
 glsl_type::uniform_locations() for samplers can be misleading.

 How about if glsl_type::uniform_locations() takes a bool
 isExplicitLocation and return at least 1 for every type? I am aware that
 this won't solve the bindless textures issue, but it would fix this bug
 (and the integer underflows) for now, I think.



 The 82921 bug seems to be an orthognal issue.  There is a difference
 between the API visible locations assigned to a uniform and the GPU
 visible locations where the uniform is stored.  My guess is that we're
 using the same accounting for both in places where we should not.

 On 08/21/2014 04:25 PM, Micael Dias wrote:
  ---
  If samplers occupy zero locations we can run into a lot of issues. See
 #82921.
  I briefly tested this with my own code (which was previously crashing
 and
  misbehaving) and also ran other apps and everything seems to work fine.
  I'm not used to contributing code in this fashion, so please forgive me
 if I'm
  making some mistake. Thanks.
 
   src/glsl/glsl_types.cpp | 2 ++
   1 file changed, 2 insertions(+)
 
  diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
  index 66e9b13..cc05193 100644
  --- a/src/glsl/glsl_types.cpp
  +++ b/src/glsl/glsl_types.cpp
  @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
 return size;
  case GLSL_TYPE_ARRAY:
 return this-length * this-fields.array-uniform_locations();
  +   case GLSL_TYPE_SAMPLER:
  +  return 1;
  default:
 break;
  }
 




 --
 Micael Dias




-- 
Micael Dias
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-22 Thread Tapani Pälli
On 08/22/2014 08:31 AM, Tapani Pälli wrote:
 On 08/22/2014 02:25 AM, Micael Dias wrote:
 ---
 If samplers occupy zero locations we can run into a lot of issues. See 
 #82921.
 I briefly tested this with my own code (which was previously crashing and
 misbehaving) and also ran other apps and everything seems to work fine.
 I'm not used to contributing code in this fashion, so please forgive me if 
 I'm
 making some mistake. Thanks.
 Thanks for the patch, I sent a bit different fix to be sure all possible
 types will consume at least 1 loc, this is just to be future-proof.

I was just pointed out that your patch is more correct though :) (Not
all opaque types deserve a location, only some.)

  src/glsl/glsl_types.cpp | 2 ++
  1 file changed, 2 insertions(+)

 diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
 index 66e9b13..cc05193 100644
 --- a/src/glsl/glsl_types.cpp
 +++ b/src/glsl/glsl_types.cpp
 @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
return size;
 case GLSL_TYPE_ARRAY:
return this-length * this-fields.array-uniform_locations();
 +   case GLSL_TYPE_SAMPLER:
 +  return 1;
 default:
break;
 }
 // Tapani

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

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


Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-22 Thread Dave Airlie
In the future for ARB_bindless_texture we might want this to be 2, I'm
not sure if we should just do that now.

Dave.

On 22 August 2014 09:25, Micael Dias kam1k...@gmail.com wrote:
 ---
 If samplers occupy zero locations we can run into a lot of issues. See #82921.
 I briefly tested this with my own code (which was previously crashing and
 misbehaving) and also ran other apps and everything seems to work fine.
 I'm not used to contributing code in this fashion, so please forgive me if I'm
 making some mistake. Thanks.

  src/glsl/glsl_types.cpp | 2 ++
  1 file changed, 2 insertions(+)

 diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
 index 66e9b13..cc05193 100644
 --- a/src/glsl/glsl_types.cpp
 +++ b/src/glsl/glsl_types.cpp
 @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
return size;
 case GLSL_TYPE_ARRAY:
return this-length * this-fields.array-uniform_locations();
 +   case GLSL_TYPE_SAMPLER:
 +  return 1;
 default:
break;
 }
 --
 2.1.0

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


Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-22 Thread Micael
Is this because of the 64 bit handles? If so, I think I agree with you.
According to the ARB_bindless_texture spec changes:
When used as shader inputs, outputs, uniform block members, or
temporaries, the value of the sampler is a 64-bit unsigned integer handle
and never refers to a texture image unit.

However, should we consume 2 locs only if ARB_bindless_texture is present,
or always?


On Fri, Aug 22, 2014 at 8:36 AM, Dave Airlie airl...@gmail.com wrote:

 In the future for ARB_bindless_texture we might want this to be 2, I'm
 not sure if we should just do that now.

 Dave.

 On 22 August 2014 09:25, Micael Dias kam1k...@gmail.com wrote:
  ---
  If samplers occupy zero locations we can run into a lot of issues. See
 #82921.
  I briefly tested this with my own code (which was previously crashing and
  misbehaving) and also ran other apps and everything seems to work fine.
  I'm not used to contributing code in this fashion, so please forgive me
 if I'm
  making some mistake. Thanks.
 
   src/glsl/glsl_types.cpp | 2 ++
   1 file changed, 2 insertions(+)
 
  diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
  index 66e9b13..cc05193 100644
  --- a/src/glsl/glsl_types.cpp
  +++ b/src/glsl/glsl_types.cpp
  @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
 return size;
  case GLSL_TYPE_ARRAY:
 return this-length * this-fields.array-uniform_locations();
  +   case GLSL_TYPE_SAMPLER:
  +  return 1;
  default:
 break;
  }
  --
  2.1.0
 
  ___
  mesa-dev mailing list
  mesa-dev@lists.freedesktop.org
  http://lists.freedesktop.org/mailman/listinfo/mesa-dev




-- 
Micael Dias
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-22 Thread Ian Romanick
I'm not sure this is correct, and I think we need a more complex fix.
As Dave points out, bindless will make it even more complex.

In a non-bindless, static-sampler-array-indexing world, applications
assume that samplers will use zero uniform locations.  The sampler
information is baked into the instructions, and it isn't represented
anywhere else in GPU memory.  As a result, I would not be surprised to
see previously working applications fail to link (due to using too many
uniforms) with this change.

It seems that the only time a sampler needs non-zero space is when it is
part of any array samplers (or array of structures containing samplers,
etc.) or is bindless.  In the array cases, it is probably only necessary
when the index is dynamic.  I think the array splitting and structure
splitting passes may make that moot.

The 82921 bug seems to be an orthognal issue.  There is a difference
between the API visible locations assigned to a uniform and the GPU
visible locations where the uniform is stored.  My guess is that we're
using the same accounting for both in places where we should not.

On 08/21/2014 04:25 PM, Micael Dias wrote:
 ---
 If samplers occupy zero locations we can run into a lot of issues. See #82921.
 I briefly tested this with my own code (which was previously crashing and
 misbehaving) and also ran other apps and everything seems to work fine.
 I'm not used to contributing code in this fashion, so please forgive me if I'm
 making some mistake. Thanks.
 
  src/glsl/glsl_types.cpp | 2 ++
  1 file changed, 2 insertions(+)
 
 diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
 index 66e9b13..cc05193 100644
 --- a/src/glsl/glsl_types.cpp
 +++ b/src/glsl/glsl_types.cpp
 @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
return size;
 case GLSL_TYPE_ARRAY:
return this-length * this-fields.array-uniform_locations();
 +   case GLSL_TYPE_SAMPLER:
 +  return 1;
 default:
break;
 }
 

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


[Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-21 Thread Micael Dias
---
If samplers occupy zero locations we can run into a lot of issues. See #82921.
I briefly tested this with my own code (which was previously crashing and
misbehaving) and also ran other apps and everything seems to work fine.
I'm not used to contributing code in this fashion, so please forgive me if I'm
making some mistake. Thanks.

 src/glsl/glsl_types.cpp | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
index 66e9b13..cc05193 100644
--- a/src/glsl/glsl_types.cpp
+++ b/src/glsl/glsl_types.cpp
@@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
   return size;
case GLSL_TYPE_ARRAY:
   return this-length * this-fields.array-uniform_locations();
+   case GLSL_TYPE_SAMPLER:
+  return 1;
default:
   break;
}
-- 
2.1.0

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


Re: [Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location

2014-08-21 Thread Tapani Pälli
On 08/22/2014 02:25 AM, Micael Dias wrote:
 ---
 If samplers occupy zero locations we can run into a lot of issues. See #82921.
 I briefly tested this with my own code (which was previously crashing and
 misbehaving) and also ran other apps and everything seems to work fine.
 I'm not used to contributing code in this fashion, so please forgive me if I'm
 making some mistake. Thanks.

Thanks for the patch, I sent a bit different fix to be sure all possible
types will consume at least 1 loc, this is just to be future-proof.

  src/glsl/glsl_types.cpp | 2 ++
  1 file changed, 2 insertions(+)

 diff --git a/src/glsl/glsl_types.cpp b/src/glsl/glsl_types.cpp
 index 66e9b13..cc05193 100644
 --- a/src/glsl/glsl_types.cpp
 +++ b/src/glsl/glsl_types.cpp
 @@ -691,6 +691,8 @@ glsl_type::uniform_locations() const
return size;
 case GLSL_TYPE_ARRAY:
return this-length * this-fields.array-uniform_locations();
 +   case GLSL_TYPE_SAMPLER:
 +  return 1;
 default:
break;
 }

// Tapani

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