Am 24.09.2014 23:23, schrieb Ilia Mirkin:
> On Wed, Sep 24, 2014 at 5:17 PM, Roland Scheidegger <srol...@vmware.com> 
> wrote:
>> I don't really qualified to review, IIRC I mentioned it was tricky to
>> see if it's right when you pushed it first, and this has not changed.
>> Some comment inline though...
>>
>>
>> Am 24.09.2014 20:30, schrieb Ilia Mirkin:
>>> Marek/Roland -- do either of those comments count as a R-b? I'd like
>>> to push this out tonight, pending a full piglit run.
>>>
>>> On Wed, Sep 24, 2014 at 1:35 PM, Roland Scheidegger <srol...@vmware.com> 
>>> wrote:
>>>> Yes cubemaps should have array_size == 6 always in gallium. You just
>>>> have to be careful whenever translating things from mesa to gallium as
>>>> things like that won't be true in core mesa of course (similar to 1d
>>>> array textures having height and so on) due to OpenGL weirdness for
>>>> historical reasons.
>>>>
>>>> Roland
>>>>
>>>>
>>>> Am 24.09.2014 19:19, schrieb Marek Olšák:
>>>>> Interesting, I didn't know about that. Nevermind. st/mesa indeed sets it 
>>>>> to 6.
>>>>>
>>>>> Marek
>>>>>
>>>>> On Wed, Sep 24, 2014 at 6:26 PM, Ilia Mirkin <imir...@alum.mit.edu> wrote:
>>>>>> On Wed, Sep 24, 2014 at 12:20 PM, Marek Olšák <mar...@gmail.com> wrote:
>>>>>>> Cubemaps have array_size == 1, but you can still set the target to 2D
>>>>>>
>>>>>> Are you *sure* about that? Everything I'm seeing indicates that
>>>>>> cubemaps have array_size == 6. For example this code in nv50_tex.c:
>>>>>>
>>>>>>    depth = MAX2(mt->base.base.array_size, mt->base.base.depth0);
>>>>>> ...
>>>>>>    case PIPE_TEXTURE_CUBE:
>>>>>>       depth /= 6;
>>>>>> ...
>>>>>>
>>>>>>> and set first_layer <= last_layer <= 6 in the sample view. Instead of
>>>>>>> checking array_size, maybe NumLayers should be used instead. Just
>>>>>>> guessing.
>>>>>>>
>>>>>>> Marek
>>>>>>>
>>>>>>> On Wed, Sep 24, 2014 at 5:05 PM, Ilia Mirkin <imir...@alum.mit.edu> 
>>>>>>> wrote:
>>>>>>>> The disguise of cubemap's layeredness is insufficient to trip up this
>>>>>>>> code :) They still get their NumLayers set, and the resources still
>>>>>>>> have an array size. Perhaps there's a scenario I'm not considering?
>>>>>>>>
>>>>>>>> On Wed, Sep 24, 2014 at 5:23 AM, Marek Olšák <mar...@gmail.com> wrote:
>>>>>>>>> Maybe something similar also needs to be done for cubemaps, because
>>>>>>>>> they are just layered textures in disguise?
>>>>>>>>>
>>>>>>>>> Marek
>>>>>>>>>
>>>>>>>>> On Wed, Sep 24, 2014 at 7:01 AM, Ilia Mirkin <imir...@alum.mit.edu> 
>>>>>>>>> wrote:
>>>>>>>>>> For 3d textures, NumLayers is set to 1, which is not what we want. 
>>>>>>>>>> This
>>>>>>>>>> fixes the newly added gl-layer-render-storage test (which constructs
>>>>>>>>>> immutable 3d textures). Fixes regression introduced in d82bd7eb060.
>>>>>>>>>>
>>>>>>>>>> Bugzilla: 
>>>>>>>>>> https://urldefense.proofpoint.com/v1/url?u=https://bugs.freedesktop.org/show_bug.cgi?id%3D84145&k=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0A&r=F4msKE2WxRzA%2BwN%2B25muztFm5TSPwE8HKJfWfR2NgfY%3D%0A&m=p4L3w5mFWeprslDAPtBcySi4H8PhKEdqz0pOU77lcjg%3D%0A&s=5599aec76e1694c8ec71dcfe6209603bf8b152884c942363fd84e9d56edaaa72
>>>>>>>>>> Signed-off-by: Ilia Mirkin <imir...@alum.mit.edu>
>>>>>>>>>> ---
>>>>>>>>>>  src/mesa/state_tracker/st_atom_texture.c | 2 +-
>>>>>>>>>>  src/mesa/state_tracker/st_cb_fbo.c       | 3 ++-
>>>>>>>>>>  src/mesa/state_tracker/st_texture.c      | 3 ++-
>>>>>>>>>>  3 files changed, 5 insertions(+), 3 deletions(-)
>>>>>>>>>>
>>>>>>>>>> diff --git a/src/mesa/state_tracker/st_atom_texture.c 
>>>>>>>>>> b/src/mesa/state_tracker/st_atom_texture.c
>>>>>>>>>> index ed9a444..19072ae 100644
>>>>>>>>>> --- a/src/mesa/state_tracker/st_atom_texture.c
>>>>>>>>>> +++ b/src/mesa/state_tracker/st_atom_texture.c
>>>>>>>>>> @@ -223,7 +223,7 @@ static unsigned last_level(struct 
>>>>>>>>>> st_texture_object *stObj)
>>>>>>>>>>
>>>>>>>>>>  static unsigned last_layer(struct st_texture_object *stObj)
>>>>>>>>>>  {
>>>>>>>>>> -   if (stObj->base.Immutable)
>>>>>>>>>> +   if (stObj->base.Immutable && stObj->pt->array_size > 1)
>>>>>>>>>>        return MIN2(stObj->base.MinLayer + stObj->base.NumLayers - 1,
>>>>>>>>>>                    stObj->pt->array_size - 1);
>>>>>>>>>>     return stObj->pt->array_size - 1;
>>>>>>>>>> diff --git a/src/mesa/state_tracker/st_cb_fbo.c 
>>>>>>>>>> b/src/mesa/state_tracker/st_cb_fbo.c
>>>>>>>>>> index 470ab27..7b6a444 100644
>>>>>>>>>> --- a/src/mesa/state_tracker/st_cb_fbo.c
>>>>>>>>>> +++ b/src/mesa/state_tracker/st_cb_fbo.c
>>>>>>>>>> @@ -451,7 +451,8 @@ st_update_renderbuffer_surface(struct st_context 
>>>>>>>>>> *st,
>>>>>>>>>>     }
>>>>>>>>>>
>>>>>>>>>>     /* Adjust for texture views */
>>>>>>>>>> -   if (strb->is_rtt) {
>>>>>>>>>> +   if (strb->is_rtt && resource->array_size > 1 &&
>>>>>>>>>> +       strb->Base.TexImage->TexObject->Immutable) {
>>>>>>>>>>        struct gl_texture_object *tex = 
>>>>>>>>>> strb->Base.TexImage->TexObject;
>>>>>>>>>>        first_layer += tex->MinLayer;
>>>>>>>>>>        if (!strb->rtt_layered)
>>>>>>>>>> diff --git a/src/mesa/state_tracker/st_texture.c 
>>>>>>>>>> b/src/mesa/state_tracker/st_texture.c
>>>>>>>>>> index c84aa45..2cd95ec 100644
>>>>>>>>>> --- a/src/mesa/state_tracker/st_texture.c
>>>>>>>>>> +++ b/src/mesa/state_tracker/st_texture.c
>>>>>>>>>> @@ -263,7 +263,8 @@ st_texture_image_map(struct st_context *st, 
>>>>>>>>>> struct st_texture_image *stImage,
>>>>>>>>>>     if (stObj->base.Immutable) {
>>>>>>>>>>        level += stObj->base.MinLevel;
>>>>>>>>>>        z += stObj->base.MinLayer;
>>>>>>>>>> -      d = MIN2(d, stObj->base.NumLayers);
>>>>>>>>>> +      if (stObj->pt->array_size > 1)
>>>>>>>>>> +         d = MIN2(d, stObj->base.NumLayers);
>>>>>>>>>>     }
>>>>>>>>>>
>>>>>>>>>>     z += stImage->base.Face;
>> This is pretty confusing, so for a cubemap you get the initial z
>> (presumably zero), add the MinLayer for the view, then also the Face
>> from the initial image? This isn't new but all the translation from mesa
>> seems really tricky here and elsewhere.
>> The fix though is probably correct but really I can't tell...
>> But as long as it fixes things go for it...
> 
> I think the key is that mesa (supposedly) prevents illegal situations
> from happening. The above didn't actually fix anything, but I audited
> all NumLayers usages to ensure that they were done only for array
> textures, and this was one of the usages [that my previous patch
> introduced].
> 
> I don't think your comment is directly related to my patch, but
> imagine the following scenario:
> 
> 2d array with 10 layers, cast as a cube map view for layers 2..7. Then
> you want to get the 1 (-x? I forget) face from it. That'll end up
> being layer 3 in the original texture. Which is what the above code
> will end up doing, I believe.
> 

That makes sense indeed. I am just always confused because array
textures and cube maps are treated so differently, even though the
storage representation really ought to be the same. All due to
historical reasons...

Roland


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

Reply via email to