[Mesa-dev] [PATCH 2/2] st/mesa: Prevent huge lastlevel values from being computed.

Stéphane Marchesin stephane.marchesin at gmail.com
Tue Sep 4 15:20:39 PDT 2012


On Tue, Sep 4, 2012 at 3:08 PM, Brian Paul <brianp at vmware.com> wrote:
> On 09/04/2012 01:15 PM, Stéphane Marchesin wrote:
>>
>> The current computation for the lastlevel is based on the level size and
>> can
>> lead to writing past the end of the texture array. Instead we clamp
>> according
>> to hardware limits.
>> ---
>>   src/mesa/state_tracker/st_cb_texture.c |   28
>> +++++++++++++++++++++++++++-
>>   1 files changed, 27 insertions(+), 1 deletions(-)
>>
>> diff --git a/src/mesa/state_tracker/st_cb_texture.c
>> b/src/mesa/state_tracker/st_cb_texture.c
>> index ed3bbc7..51c76e3 100644
>> --- a/src/mesa/state_tracker/st_cb_texture.c
>> +++ b/src/mesa/state_tracker/st_cb_texture.c
>> @@ -67,6 +67,24 @@
>>
>>   #define DBG if (0) printf
>>
>> +static enum pipe_cap
>> +pipe_to_param(enum pipe_texture_target target)
>> +{
>> +   switch(target) {
>> +   case PIPE_TEXTURE_1D:
>> +   case PIPE_TEXTURE_2D:
>> +   case PIPE_TEXTURE_RECT:
>> +      return PIPE_CAP_MAX_TEXTURE_2D_LEVELS;
>> +   case PIPE_TEXTURE_3D:
>> +   case PIPE_TEXTURE_2D_ARRAY:
>> +      return PIPE_CAP_MAX_TEXTURE_3D_LEVELS;
>> +   case PIPE_TEXTURE_CUBE:
>> +      return PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS;
>> +   default:
>> +      assert(0);
>> +      return 0;
>> +   }
>> +}
>>
>>   static enum pipe_texture_target
>>   gl_target_to_pipe(GLenum target)
>> @@ -333,6 +351,9 @@ guess_and_alloc_texture(struct st_context *st,
>>      GLuint bindings;
>>      GLuint ptWidth, ptHeight, ptDepth, ptLayers;
>>      enum pipe_format fmt;
>> +   enum pipe_texture_target pipe_target =
>> gl_target_to_pipe(stObj->base.Target);
>> +   struct pipe_context *pipe = st->pipe;
>> +   struct pipe_screen *screen = pipe->screen;
>>
>>      DBG("%s\n", __FUNCTION__);
>>
>> @@ -374,7 +395,12 @@ guess_and_alloc_texture(struct st_context *st,
>>         GLuint l2width = util_logbase2(width);
>>         GLuint l2height = util_logbase2(height);
>>         GLuint l2depth = util_logbase2(depth);
>> +      int target_param = pipe_to_param(pipe_target);
>> +      int max_level = screen->get_param(screen, target_param);
>
>
> I think you could use the _mesa_max_texture_levels() function here.
>
>
>
>>         lastLevel = MAX2(MAX2(l2width, l2height), l2depth);
>> +
>> +      /* Clamp the last level against what the hw can do */
>> +      lastLevel = MIN2(lastLevel, max_level - 1);
>>      }
>>
>>      /* Save the level=0 dimensions */
>> @@ -391,7 +417,7 @@ guess_and_alloc_texture(struct st_context *st,
>>
>> &ptWidth,&ptHeight,&ptDepth,&ptLayers);
>>
>>      stObj->pt = st_texture_create(st,
>> -                                 gl_target_to_pipe(stObj->base.Target),
>> +                                 pipe_target,
>>                                    fmt,
>>                                    lastLevel,
>>                                    ptWidth,
>
>
> Do you have a test case for this?  I'd like to understand the problem a bit
> beter.

I described the problem in the thread for the intel version of the
patch, let's have the discussion there.

Stéphane


More information about the mesa-dev mailing list