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@ixit.cz> Signed-off-by: Axel Davy <axel.davy@ens.fr> Signed-off-by: Xavier Bouchoux <xavierb@gmail.com> Cc: "10.4" <mesa-stable@lists.freedesktop.org>tags/10.5-branchpoint
@@ -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 } */ | |||
@@ -492,9 +492,12 @@ NineBaseTexture9_UpdateSamplerView( struct NineBaseTexture9 *This, | |||
swizzle[2] = PIPE_SWIZZLE_RED; | |||
swizzle[3] = PIPE_SWIZZLE_RED; | |||
} | |||
} 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). | |||
* 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])) |
@@ -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 = pf; |
@@ -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; |
@@ -38,6 +38,8 @@ | |||
#define DBG_CHANNEL DBG_SURFACE | |||
#define is_ATI1_ATI2(format) (format == PIPE_FORMAT_RGTC1_UNORM || format == PIPE_FORMAT_RGTC2_UNORM) | |||
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; | |||
} else { | |||
pLockedRect->Pitch = This->stride; | |||
pLockedRect->pBits = NineSurface9_GetSystemMemPointer(This, | |||
box.x, | |||
box.y); | |||
} | |||
} else { | |||
DBG("mapping pipe_resource %p (level=%u usage=%x)\n", | |||
resource, This->level, usage); |
@@ -65,6 +65,10 @@ NineVolumeTexture9_ctor( struct NineVolumeTexture9 *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_3D; | |||
info->format = pf; |