[Mesa-dev] [PATCH 11/53] st/nine: Return D3DERR_INVALIDCALL when trying to create a texture of bad format

Axel Davy davy at clipper.ens.fr
Wed Jan 7 09:19:01 PST 2015


On Wed, 7 Jan 2015, Ilia Mirkin wrote:

> On Wed, Jan 7, 2015 at 11:36 AM, Axel Davy <axel.davy at ens.fr> wrote:
>> Reviewed-by: David Heidelberg <david at ixit.cz>
>> Signed-off-by: Axel Davy <axel.davy at ens.fr>
>> ---
>>  src/gallium/state_trackers/nine/cubetexture9.c   |  8 ++++++++
>>  src/gallium/state_trackers/nine/texture9.c       |  9 ++++++++-
>>  src/gallium/state_trackers/nine/volumetexture9.c | 10 +++++++++-
>>  3 files changed, 25 insertions(+), 2 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/nine/cubetexture9.c b/src/gallium/state_trackers/nine/cubetexture9.c
>> index 2c607c0..43db8cb 100644
>> --- a/src/gallium/state_trackers/nine/cubetexture9.c
>> +++ b/src/gallium/state_trackers/nine/cubetexture9.c
>> @@ -38,6 +38,8 @@ NineCubeTexture9_ctor( struct NineCubeTexture9 *This,
>>                         HANDLE *pSharedHandle )
>>  {
>>      struct pipe_resource *info = &This->base.base.info;
>> +    struct pipe_screen *screen = pParams->device->screen;
>> +    enum pipe_format pf;
>>      unsigned i;
>>      D3DSURFACE_DESC sfdesc;
>>      HRESULT hr;
>> @@ -55,6 +57,12 @@ NineCubeTexture9_ctor( struct NineCubeTexture9 *This,
>>      if (Usage & D3DUSAGE_AUTOGENMIPMAP)
>>          Levels = 0;
>>
>> +    pf = d3d9_to_pipe_format(Format);
>> +    if (pf == PIPE_FORMAT_NONE ||
>> +        !screen->is_format_supported(screen, pf, PIPE_TEXTURE_CUBE, 0, PIPE_BIND_SAMPLER_VIEW)) {
>> +        return D3DERR_INVALIDCALL;
>> +    }
>> +
>>      info->screen = pParams->device->screen;
>>      info->target = PIPE_TEXTURE_CUBE;
>>      info->format = d3d9_to_pipe_format(Format);
>
> info->format = pf; here as well for parity with the other code?

Oups, yes

>
>> diff --git a/src/gallium/state_trackers/nine/texture9.c b/src/gallium/state_trackers/nine/texture9.c
>> index 8852142..4d7e950 100644
>> --- a/src/gallium/state_trackers/nine/texture9.c
>> +++ b/src/gallium/state_trackers/nine/texture9.c
>> @@ -47,6 +47,7 @@ NineTexture9_ctor( struct NineTexture9 *This,
>>      struct pipe_screen *screen = pParams->device->screen;
>>      struct pipe_resource *info = &This->base.base.info;
>>      struct pipe_resource *resource;
>> +    enum pipe_format pf;
>>      unsigned l;
>>      D3DSURFACE_DESC sfdesc;
>>      HRESULT hr;
>> @@ -92,9 +93,15 @@ NineTexture9_ctor( struct NineTexture9 *This,
>>      if (Usage & D3DUSAGE_AUTOGENMIPMAP)
>>          Levels = 0;
>>
>> +    pf = d3d9_to_pipe_format(Format);
>> +    if (Format != D3DFMT_NULL && (pf == PIPE_FORMAT_NONE ||
>
> None of the others have this check... is null valid here but not for
> cube/volume?

This format is a hack supported by all three vendors that allows
rendering to nothing without memory usage. We choosed to support
it only for textures, probably the only location where it makes sense.

In NineAdapter9_CheckDeviceFormat you can see we only advertise
support for this format for textures.


>
>  -ilia
>


More information about the mesa-dev mailing list