On Wed, Jan 7, 2015 at 11:36 AM, Axel Davy <axel.d...@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 <da...@ixit.cz> > Signed-off-by: Axel Davy <axel.d...@ens.fr> > Signed-off-by: Xavier Bouchoux <xavi...@gmail.com> > > Cc: "10.4" <mesa-sta...@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?? > + * 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? > + > 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... -ilia _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev