[Mesa-dev] [PATCH] glsl: uniform sampler should occupy 1 location
Tapani Pälli
tapani.palli at intel.com
Wed Aug 27 04:15:04 PDT 2014
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 <kam1kaz3 at gmail.com
>> <mailto:kam1kaz3 at gmail.com>> wrote:
>>
>> On Fri, Aug 22, 2014 at 9:23 PM, Ian Romanick <idr at freedesktop.org
>> <mailto:idr at 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 at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list