[Mesa-dev] [PATCH 15/53] st/nine: Add ATI1 and ATI2 support
Axel Davy
axel.davy at ens.fr
Wed Jan 7 14:18:25 PST 2015
On 07/01/2015 18:42, Ilia Mirkin wrote :
> On Wed, Jan 7, 2015 at 11:36 AM, Axel Davy <axel.davy at ens.fr> wrote:
>> Adds ATI1 and ATI2 support to nine.
>>
>> They map to PIPE_FORMAT_RGTC1_UNORM and PIPE_FORMAT_RGTC2_UNORM,
>> but need special handling.
>>
>> Reviewed-by: David Heidelberg <david at ixit.cz>
>> Signed-off-by: Axel Davy <axel.davy at ens.fr>
>> Signed-off-by: Xavier Bouchoux <xavierb at gmail.com>
>>
>> Cc: "10.4" <mesa-stable at lists.freedesktop.org>
>> ---
>> src/gallium/state_trackers/nine/adapter9.c | 3 +++
>> src/gallium/state_trackers/nine/basetexture9.c | 9 ++++++---
>> src/gallium/state_trackers/nine/cubetexture9.c | 4 ++++
>> src/gallium/state_trackers/nine/nine_pipe.h | 2 ++
>> src/gallium/state_trackers/nine/surface9.c | 19 +++++++++++++++----
>> src/gallium/state_trackers/nine/volumetexture9.c | 4 ++++
>> 6 files changed, 34 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/gallium/state_trackers/nine/adapter9.c b/src/gallium/state_trackers/nine/adapter9.c
>> index 871a9a3..481f863 100644
>> --- a/src/gallium/state_trackers/nine/adapter9.c
>> +++ b/src/gallium/state_trackers/nine/adapter9.c
>> @@ -302,6 +302,9 @@ NineAdapter9_CheckDeviceFormat( struct NineAdapter9 *This,
>> return D3DERR_NOTAVAILABLE;
>> }
>>
>> + /* we support ATI1 and ATI2 hack only for 2D textures */
>> + if (RType != D3DRTYPE_TEXTURE && (CheckFormat == D3DFMT_ATI1 || CheckFormat == D3DFMT_ATI2))
>> + return D3DERR_NOTAVAILABLE;
>> /* if (Usage & D3DUSAGE_NONSECURE) { don't know the implications of this } */
>> /* if (Usage & D3DUSAGE_SOFTWAREPROCESSING) { we can always support this } */
>>
>> diff --git a/src/gallium/state_trackers/nine/basetexture9.c b/src/gallium/state_trackers/nine/basetexture9.c
>> index ffccafd..ea9af94 100644
>> --- a/src/gallium/state_trackers/nine/basetexture9.c
>> +++ b/src/gallium/state_trackers/nine/basetexture9.c
>> @@ -486,9 +486,12 @@ NineBaseTexture9_UpdateSamplerView( struct NineBaseTexture9 *This,
>> swizzle[1] = PIPE_SWIZZLE_ZERO;
>> swizzle[2] = PIPE_SWIZZLE_ZERO;
>> swizzle[3] = PIPE_SWIZZLE_ONE;
>> - } else if (resource->format != PIPE_FORMAT_A8_UNORM) {
>> - /* A8 is the only exception that should have 0.0 as default values
>> - * for RGB. It is already what gallium does. All the other ones
>> + } else if (resource->format != PIPE_FORMAT_A8_UNORM &&
>> + resource->format != PIPE_FORMAT_RGTC1_UNORM) {
>> + /* exceptions:
>> + * A8 should have 0.0 as default values for RGB.
>> + * ATI1/RGTC1 should be r 0 0 1 (tested on windows).
> But RGTC2 is rg11??
I'll double check
>
>> + * It is already what gallium does. All the other ones
>> * should have 1.0 for non-defined values */
>> for (i = 0; i < 4; i++) {
>> if (SWIZZLE_TO_REPLACE(desc->swizzle[i]))
>> diff --git a/src/gallium/state_trackers/nine/cubetexture9.c b/src/gallium/state_trackers/nine/cubetexture9.c
>> index 43db8cb..32635ad 100644
>> --- a/src/gallium/state_trackers/nine/cubetexture9.c
>> +++ b/src/gallium/state_trackers/nine/cubetexture9.c
>> @@ -63,6 +63,10 @@ NineCubeTexture9_ctor( struct NineCubeTexture9 *This,
>> return D3DERR_INVALIDCALL;
>> }
>>
>> + /* We support ATI1 and ATI2 hacks only for 2D textures */
>> + if (Format == D3DFMT_ATI1 || Format == D3DFMT_ATI2)
>> + return D3DERR_INVALIDCALL;
>> +
>> info->screen = pParams->device->screen;
>> info->target = PIPE_TEXTURE_CUBE;
>> info->format = d3d9_to_pipe_format(Format);
>> diff --git a/src/gallium/state_trackers/nine/nine_pipe.h b/src/gallium/state_trackers/nine/nine_pipe.h
>> index 06e4dc9..41792f0 100644
>> --- a/src/gallium/state_trackers/nine/nine_pipe.h
>> +++ b/src/gallium/state_trackers/nine/nine_pipe.h
>> @@ -185,6 +185,8 @@ d3d9_to_pipe_format(D3DFORMAT format)
>> case D3DFMT_DXT3: return PIPE_FORMAT_DXT3_RGBA;
>> case D3DFMT_DXT4: return PIPE_FORMAT_DXT5_RGBA; /* XXX */
>> case D3DFMT_DXT5: return PIPE_FORMAT_DXT5_RGBA;
>> + case D3DFMT_ATI1: return PIPE_FORMAT_RGTC1_UNORM;
>> + case D3DFMT_ATI2: return PIPE_FORMAT_RGTC2_UNORM;
>> case D3DFMT_UYVY: return PIPE_FORMAT_UYVY;
>> case D3DFMT_YUY2: return PIPE_FORMAT_YUYV; /* XXX check */
>> case D3DFMT_NV12: return PIPE_FORMAT_NV12;
>> diff --git a/src/gallium/state_trackers/nine/surface9.c b/src/gallium/state_trackers/nine/surface9.c
>> index 5928892..b3c7c18 100644
>> --- a/src/gallium/state_trackers/nine/surface9.c
>> +++ b/src/gallium/state_trackers/nine/surface9.c
>> @@ -38,6 +38,8 @@
>>
>> #define DBG_CHANNEL DBG_SURFACE
>>
>> +#define is_ATI1_ATI2(format) (format == PIPE_FORMAT_RGTC1_UNORM || format == PIPE_FORMAT_RGTC2_UNORM)
> The macro is only used once... is it really worth keeping around?
I thought that it would make code easier to read there.
>
>> +
>> HRESULT
>> NineSurface9_ctor( struct NineSurface9 *This,
>> struct NineUnknownParams *pParams,
>> @@ -382,10 +384,19 @@ NineSurface9_LockRect( struct NineSurface9 *This,
>>
>> if (This->data) {
>> DBG("returning system memory\n");
>> -
>> - pLockedRect->Pitch = This->stride;
>> - pLockedRect->pBits = NineSurface9_GetSystemMemPointer(This,
>> - box.x, box.y);
>> + /* ATI1 and ATI2 need special handling, because of d3d9 bug.
>> + * We must advertise to the application as if it is uncompressed
>> + * and bpp 8, and the app has a workaround to work with the fact
>> + * that it is actually compressed. */
>> + if (is_ATI1_ATI2(This->base.info.format)) {
>> + pLockedRect->Pitch = This->desc.Height;
>> + pLockedRect->pBits = This->data + box.y * This->desc.Height + box.x;
> Does this work for ATI2? I would imagine there should be a *2 in there
> somewhere...
Yes, this is very surprising I know... The format of these two formats
are buggy there, and we have to reproduce this bug (that apps workaround)
>
> -ilia
>
More information about the mesa-dev
mailing list