Commit 35187471 authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

wined3d: Pixel format cleanup.

parent d23b83a0
......@@ -798,6 +798,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
IWineD3DSurfaceImpl *object; /*NOTE: impl ref allowed since this is a create function */
unsigned int pow2Width, pow2Height;
unsigned int Size = 1;
const PixelFormatDesc *tableEntry = getFormatDescEntry(Format);
TRACE("(%p) Create surface\n",This);
/** FIXME: Check ranges on the inputs are valid
......@@ -861,13 +862,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
Size = 0;
} else if (Format == WINED3DFMT_DXT1) {
/* DXT1 is half byte per pixel */
Size = ((max(pow2Width,4) * D3DFmtGetBpp(This, Format)) * max(pow2Height,4)) >> 1;
Size = ((max(pow2Width,4) * tableEntry->bpp) * max(pow2Height,4)) >> 1;
} else if (Format == WINED3DFMT_DXT2 || Format == WINED3DFMT_DXT3 ||
Format == WINED3DFMT_DXT4 || Format == WINED3DFMT_DXT5) {
Size = ((max(pow2Width,4) * D3DFmtGetBpp(This, Format)) * max(pow2Height,4));
Size = ((max(pow2Width,4) * tableEntry->bpp) * max(pow2Height,4));
} else {
Size = (pow2Width * D3DFmtGetBpp(This, Format)) * pow2Height;
Size = (pow2Width * tableEntry->bpp) * pow2Height;
}
/** Create and initialise the surface resource **/
......@@ -881,15 +882,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
object->currentDesc.MultiSampleQuality = MultisampleQuality;
/* Setup some glformat defaults */
if (WINED3DFMT_UNKNOWN != Format) {
object->glDescription.glFormat = D3DFmt2GLFmt(This, object->resource.format);
object->glDescription.glFormatInternal = D3DFmt2GLIntFmt(This, object->resource.format);
object->glDescription.glType = D3DFmt2GLType(This, object->resource.format);
} else {
object->glDescription.glFormat = 0;
object->glDescription.glFormatInternal = 0;
object->glDescription.glType = 0;
}
object->glDescription.glFormat = tableEntry->glFormat;
object->glDescription.glFormatInternal = tableEntry->glInternal;
object->glDescription.glType = tableEntry->glType;
object->glDescription.textureName = 0;
object->glDescription.level = Level;
......@@ -908,7 +903,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateSurface(IWineD3DDevice *iface, U
if (WINED3DFMT_UNKNOWN != Format) {
object->bytesPerPixel = D3DFmtGetBpp(This, Format);
object->bytesPerPixel = tableEntry->bpp;
object->pow2Size = (pow2Width * object->bytesPerPixel) * pow2Height;
} else {
object->bytesPerPixel = 0;
......@@ -1148,8 +1143,9 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
IWineD3DVolumeImpl *object; /** NOTE: impl ref allowed since this is a create function **/
const PixelFormatDesc *formatDesc = getFormatDescEntry(Format);
D3DCREATERESOURCEOBJECTINSTANCE(object, Volume, WINED3DRTYPE_VOLUME, ((Width * D3DFmtGetBpp(This, Format)) * Height * Depth))
D3DCREATERESOURCEOBJECTINSTANCE(object, Volume, WINED3DRTYPE_VOLUME, ((Width * formatDesc->bpp) * Height * Depth))
TRACE("(%p) : W(%d) H(%d) D(%d), Usage(%ld), Fmt(%u,%s), Pool(%s)\n", This, Width, Height,
Depth, Usage, Format, debug_d3dformat(Format), debug_d3dpool(Pool));
......@@ -1157,7 +1153,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_CreateVolume(IWineD3DDevice *iface,
object->currentDesc.Width = Width;
object->currentDesc.Height = Height;
object->currentDesc.Depth = Depth;
object->bytesPerPixel = D3DFmtGetBpp(This, Format);
object->bytesPerPixel = formatDesc->bpp;
/** Note: Volume textures cannot be dxtn, hence no need to check here **/
object->lockable = TRUE;
......@@ -2043,6 +2039,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EnumDisplayModes(IWineD3DDevice *iface,
DEVMODEW DevModeW;
int i;
const PixelFormatDesc *formatDesc = getFormatDescEntry(pixelformat);
TRACE("(%p)->(%lx,%d,%d,%d,%p,%p)\n", This, Flags, Width, Height, pixelformat, context, callback);
......@@ -2050,7 +2047,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_EnumDisplayModes(IWineD3DDevice *iface,
/* Ignore some modes if a description was passed */
if ( (Width > 0) && (Width != DevModeW.dmPelsWidth)) continue;
if ( (Height > 0) && (Height != DevModeW.dmPelsHeight)) continue;
if ( (pixelformat != WINED3DFMT_UNKNOWN) && ( D3DFmtGetBpp(NULL, pixelformat) != DevModeW.dmBitsPerPel) ) continue;
if ( (pixelformat != WINED3DFMT_UNKNOWN) && ( formatDesc->bpp != DevModeW.dmBitsPerPel) ) continue;
TRACE("Enumerating %ldx%ld@%s\n", DevModeW.dmPelsWidth, DevModeW.dmPelsHeight, debug_d3dformat(pixelformat_for_depth(DevModeW.dmBitsPerPel)));
......@@ -2065,6 +2062,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U
DEVMODEW devmode;
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
LONG ret;
const PixelFormatDesc *formatDesc = getFormatDescEntry(pMode->Format);
TRACE("(%p)->(%d,%p) Mode=%dx%dx@%d, %s\n", This, iSwapChain, pMode, pMode->Width, pMode->Height, pMode->RefreshRate, debug_d3dformat(pMode->Format));
......@@ -2075,7 +2073,7 @@ static HRESULT WINAPI IWineD3DDeviceImpl_SetDisplayMode(IWineD3DDevice *iface, U
*/
devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
devmode.dmBitsPerPel = D3DFmtGetBpp(This, pMode->Format) * 8;
devmode.dmBitsPerPel = formatDesc->bpp * 8;
if(devmode.dmBitsPerPel == 24) devmode.dmBitsPerPel = 32;
devmode.dmPelsWidth = pMode->Width;
devmode.dmPelsHeight = pMode->Height;
......
......@@ -967,6 +967,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) {
DWORD *masks;
HRESULT hr;
RGBQUAD col[256];
const PixelFormatDesc *formatEntry = getFormatDescEntry(This->resource.format);
TRACE("(%p)->(%p)\n",This,pHDC);
......@@ -1049,9 +1050,9 @@ HRESULT WINAPI IWineD3DSurfaceImpl_GetDC(IWineD3DSurface *iface, HDC *pHDC) {
case WINED3DFMT_A16B16G16R16:
usage = 0;
b_info->bmiHeader.biCompression = BI_BITFIELDS;
masks[0] = get_bitmask_red(This->resource.format);
masks[1] = get_bitmask_green(This->resource.format);
masks[2] = get_bitmask_blue(This->resource.format);
masks[0] = formatEntry->redMask;
masks[1] = formatEntry->greenMask;
masks[2] = formatEntry->blueMask;
break;
default:
......@@ -1186,14 +1187,12 @@ typedef enum {
HRESULT d3dfmt_get_conv(IWineD3DSurfaceImpl *This, BOOL need_alpha_ck, GLenum *format, GLenum *internal, GLenum *type, CONVERT_TYPES *convert, int *target_bpp) {
BOOL colorkey_active = need_alpha_ck && (This->CKeyFlags & DDSD_CKSRCBLT);
const PixelFormatDesc *formatEntry = getFormatDescEntry(This->resource.format);
/* Default values: From the surface */
*format = D3DFmt2GLFmt(This->resource.wineD3DDevice,
This->resource.format);
*internal = D3DFmt2GLIntFmt(This->resource.wineD3DDevice,
This->resource.format);
*type = D3DFmt2GLType(This->resource.wineD3DDevice,
This->resource.format);
*format = formatEntry->glFormat;
*internal = formatEntry->glInternal;
*type = formatEntry->glType;
*convert = NO_CONVERSION;
*target_bpp = This->bytesPerPixel;
......@@ -1873,6 +1872,7 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetContainer(IWineD3DSurface *iface, IWineD3D
HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORMAT format) {
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
const PixelFormatDesc *formatEntry = getFormatDescEntry(format);
if (This->resource.format != WINED3DFMT_UNKNOWN) {
FIXME("(%p) : The foramt of the surface must be WINED3DFORMAT_UNKNOWN\n", This);
......@@ -1884,29 +1884,23 @@ HRESULT WINAPI IWineD3DSurfaceImpl_SetFormat(IWineD3DSurface *iface, WINED3DFORM
This->resource.size = 0;
} else if (format == WINED3DFMT_DXT1) {
/* DXT1 is half byte per pixel */
This->resource.size = ((max(This->pow2Width, 4) * D3DFmtGetBpp(This->resource.wineD3DDevice, format)) * max(This->pow2Height, 4)) >> 1;
This->resource.size = ((max(This->pow2Width, 4) * formatEntry->bpp) * max(This->pow2Height, 4)) >> 1;
} else if (format == WINED3DFMT_DXT2 || format == WINED3DFMT_DXT3 ||
format == WINED3DFMT_DXT4 || format == WINED3DFMT_DXT5) {
This->resource.size = ((max(This->pow2Width, 4) * D3DFmtGetBpp(This->resource.wineD3DDevice, format)) * max(This->pow2Height, 4));
This->resource.size = ((max(This->pow2Width, 4) * formatEntry->bpp) * max(This->pow2Height, 4));
} else {
This->resource.size = (This->pow2Width * D3DFmtGetBpp(This->resource.wineD3DDevice, format)) * This->pow2Height;
This->resource.size = (This->pow2Width * formatEntry->bpp) * This->pow2Height;
}
/* Setup some glformat defaults */
if (format != WINED3DFMT_UNKNOWN) {
This->glDescription.glFormat = D3DFmt2GLFmt(This->resource.wineD3DDevice, format);
This->glDescription.glFormatInternal = D3DFmt2GLIntFmt(This->resource.wineD3DDevice, format);
This->glDescription.glType = D3DFmt2GLType(This->resource.wineD3DDevice, format);
} else {
This->glDescription.glFormat = 0;
This->glDescription.glFormatInternal = 0;
This->glDescription.glType = 0;
}
This->glDescription.glFormat = formatEntry->glFormat;
This->glDescription.glFormatInternal = formatEntry->glInternal;
This->glDescription.glType = formatEntry->glType;
if (format != WINED3DFMT_UNKNOWN) {
This->bytesPerPixel = D3DFmtGetBpp(This->resource.wineD3DDevice, format);
This->bytesPerPixel = formatEntry->bpp;
This->pow2Size = (This->pow2Width * This->bytesPerPixel) * This->pow2Height;
} else {
This->bytesPerPixel = 0;
......
......@@ -462,6 +462,7 @@ IWineGDISurfaceImpl_Blt(IWineD3DSurface *iface,
WINED3DFORMAT dfmt = WINED3DFMT_UNKNOWN, sfmt = WINED3DFMT_UNKNOWN;
int bpp, srcheight, srcwidth, dstheight, dstwidth, width;
int x, y;
const PixelFormatDesc *sEntry, *dEntry;
LPBYTE dbuf, sbuf;
TRACE("(%p)->(%p,%p,%p,%lx,%p)\n", This, DestRect, Src, SrcRect, Flags, DDBltFx);
......@@ -494,6 +495,8 @@ IWineGDISurfaceImpl_Blt(IWineD3DSurface *iface,
dfmt = This->resource.format;
slock = dlock;
sfmt = dfmt;
sEntry = getFormatDescEntry(sfmt);
dEntry = sEntry;
}
else
{
......@@ -502,13 +505,15 @@ IWineGDISurfaceImpl_Blt(IWineD3DSurface *iface,
IWineD3DSurface_LockRect(SrcSurface, &slock, NULL, D3DLOCK_READONLY);
sfmt = Src->resource.format;
}
sEntry = getFormatDescEntry(sfmt);
dfmt = This->resource.format;
dEntry = getFormatDescEntry(dfmt);
IWineD3DSurface_LockRect(iface, &dlock,NULL,0);
}
if (!DDBltFx || !(DDBltFx->dwDDFX)) Flags &= ~DDBLT_DDFX;
if (isFourcc(sfmt) && isFourcc(dfmt))
if (sEntry->isFourcc && dEntry->isFourcc)
{
if (sfmt != dfmt)
{
......@@ -521,8 +526,7 @@ IWineGDISurfaceImpl_Blt(IWineD3DSurface *iface,
goto release;
}
if (isFourcc(sfmt) &&
(!isFourcc(dfmt)))
if (sEntry->isFourcc && !dEntry->isFourcc)
{
FIXME("DXTC decompression not supported right now\n");
goto release;
......@@ -897,9 +901,9 @@ IWineGDISurfaceImpl_Blt(IWineD3DSurface *iface,
}
else
{
keymask = get_bitmask_red(Src->resource.format) |
get_bitmask_green(Src->resource.format) |
get_bitmask_blue(Src->resource.format);
keymask = sEntry->redMask |
sEntry->greenMask |
sEntry->blueMask;
}
Flags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE);
}
......@@ -1086,6 +1090,7 @@ IWineGDISurfaceImpl_BltFast(IWineD3DSurface *iface,
RECT rsrc2;
RECT lock_src, lock_dst, lock_union;
BYTE *sbuf, *dbuf;
const PixelFormatDesc *sEntry, *dEntry;
if (TRACE_ON(d3d_surface))
{
......@@ -1169,8 +1174,10 @@ IWineGDISurfaceImpl_BltFast(IWineD3DSurface *iface,
/* Since slock was originally copied from this surface's description, we can just reuse it */
assert(This->resource.allocatedMemory != NULL);
sbuf = (BYTE *)This->resource.allocatedMemory + lock_src.top * pitch + lock_src.left * bpp;
dbuf = (BYTE *)This->resource.allocatedMemory + lock_dst.top * pitch + lock_dst.left * bpp;
sbuf = (BYTE *)This->resource.allocatedMemory + lock_src.top * pitch + lock_src.left * bpp;
dbuf = (BYTE *)This->resource.allocatedMemory + lock_dst.top * pitch + lock_dst.left * bpp;
sEntry = getFormatDescEntry(Src->resource.format);
dEntry = sEntry;
}
else
{
......@@ -1182,10 +1189,13 @@ IWineGDISurfaceImpl_BltFast(IWineD3DSurface *iface,
sbuf = slock.pBits;
dbuf = dlock.pBits;
TRACE("Dst is at %p, Src is at %p\n", dbuf, sbuf);
sEntry = getFormatDescEntry(Src->resource.format);
dEntry = getFormatDescEntry(This->resource.format);
}
/* Handle first the FOURCC surfaces... */
if (isFourcc(Src->resource.format) && isFourcc(This->resource.format))
if (sEntry->isFourcc && dEntry->isFourcc)
{
TRACE("Fourcc -> Fourcc copy\n");
if (trans)
......@@ -1202,8 +1212,7 @@ IWineGDISurfaceImpl_BltFast(IWineD3DSurface *iface,
memcpy(dbuf, sbuf, This->resource.size);
goto error;
}
if ((isFourcc(Src->resource.format)) &&
(!isFourcc(This->resource.format)))
if (sEntry->isFourcc && !dEntry->isFourcc)
{
/* TODO: Use the libtxc_dxtn.so shared library to do
* software decompression
......@@ -1360,6 +1369,7 @@ const char* filename)
IWineD3DSurfaceImpl *This = (IWineD3DSurfaceImpl *)iface;
static char *output = NULL;
static int size = 0;
const PixelFormatDesc *formatEntry = getFormatDescEntry(This->resource.format);
if (This->pow2Width > size) {
output = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->pow2Width * 3);
......@@ -1404,9 +1414,9 @@ const char* filename)
pix_width = This->bytesPerPixel;
red_shift = get_shift(get_bitmask_red(This->resource.format));
green_shift = get_shift(get_bitmask_green(This->resource.format));
blue_shift = get_shift(get_bitmask_blue(This->resource.format));
red_shift = get_shift(formatEntry->redMask);
green_shift = get_shift(formatEntry->greenMask);
blue_shift = get_shift(formatEntry->blueMask);
for (y = 0; y < This->pow2Height; y++) {
unsigned char *src = (unsigned char *) This->resource.allocatedMemory + (y * 1 * IWineD3DSurface_GetPitch(iface));
......@@ -1421,11 +1431,11 @@ const char* filename)
}
src += 1 * pix_width;
comp = color & get_bitmask_red(This->resource.format);
comp = color & formatEntry->redMask;
output[3 * x + 0] = red_shift > 0 ? comp >> red_shift : comp << -red_shift;
comp = color & get_bitmask_green(This->resource.format);
comp = color & formatEntry->greenMask;
output[3 * x + 1] = green_shift > 0 ? comp >> green_shift : comp << -green_shift;
comp = color & get_bitmask_blue(This->resource.format);
comp = color & formatEntry->blueMask;
output[3 * x + 2] = blue_shift > 0 ? comp >> blue_shift : comp << -blue_shift;
}
fwrite(output, 3 * This->pow2Width, 1, f);
......@@ -1467,7 +1477,7 @@ IWineGDISurfaceImpl_PrivateSetup(IWineD3DSurface *iface)
This->resource.allocatedMemory = NULL;
/* We don't mind the nonpow2 stuff in GDI */
This->resource.size = This->currentDesc.Width * D3DFmtGetBpp(This->resource.wineD3DDevice, This->resource.format) * This->currentDesc.Width;
This->resource.size = This->currentDesc.Width * getFormatDescEntry(This->resource.format)->bpp * This->currentDesc.Width;
This->pow2Size = This->resource.size;
This->pow2Width = This->currentDesc.Width;
This->pow2Height = This->currentDesc.Height;
......
......@@ -27,6 +27,108 @@
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
/*****************************************************************************
* Pixel format array
*/
static const PixelFormatDesc formats[] = {
/*{WINED3DFORMAT ,alphamask ,redmask ,greenmask ,bluemask ,bpp ,isFourcc ,internal ,format ,type }*/
{WINED3DFMT_UNKNOWN ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,0 ,0 ,0 },
/* FourCC formats, kept here to have WINED3DFMT_R8G8B8(=20) at position 20 */
{WINED3DFMT_UYVY ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
{WINED3DFMT_YUY2 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
{WINED3DFMT_DXT1 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,0 },
{WINED3DFMT_DXT2 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,0 },
{WINED3DFMT_DXT3 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,0 },
{WINED3DFMT_DXT4 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,0 },
{WINED3DFMT_DXT5 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,TRUE ,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,0 },
{WINED3DFMT_MULTI2_ARGB ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
{WINED3DFMT_G8R8_G8B8 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
{WINED3DFMT_R8G8_B8G8 ,0x0 ,0x0 ,0x0 ,0x0 ,1/*?*/ ,TRUE ,0 ,0 ,0 },
/* IEEE formats */
{WINED3DFMT_R32F ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_G32R32F ,0x0 ,0x0 ,0x0 ,0x0 ,8 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_A32B32G32R32F,0x0 ,0x0 ,0x0 ,0x0 ,16 ,FALSE ,0 ,0 ,0 },
/* Hmm? */
{WINED3DFMT_CxV8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
/* Float */
{WINED3DFMT_R16F ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_G16R16F ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_A16B16G16R16F,0x0 ,0x0 ,0x0 ,0x0 ,8 ,FALSE ,0 ,0 ,0 },
/* Palettized formats */
{WINED3DFMT_A8P8 ,0x0000ff00 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_P8 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX ,GL_UNSIGNED_BYTE },
/* Standard ARGB formats. Keep WINED3DFMT_R8G8B8(=20) at position 20 */
{WINED3DFMT_R8G8B8 ,0x0 ,0x00ff0000 ,0x0000ff00 ,0x000000ff ,3 ,FALSE ,GL_RGB8 ,GL_RGB ,GL_UNSIGNED_BYTE },
{WINED3DFMT_A8R8G8B8 ,0xff000000 ,0x00ff0000 ,0x0000ff00 ,0x000000ff ,4 ,FALSE ,GL_RGBA8 ,GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV },
{WINED3DFMT_X8R8G8B8 ,0x0 ,0x00ff0000 ,0x0000ff00 ,0x000000ff ,4 ,FALSE ,GL_RGB8 ,GL_BGRA ,GL_UNSIGNED_INT_8_8_8_8_REV },
{WINED3DFMT_R5G6B5 ,0x0 ,0x0000F800 ,0x000007e0 ,0x0000001f ,2 ,FALSE ,GL_RGB5 ,GL_RGB ,GL_UNSIGNED_SHORT_5_6_5 },
{WINED3DFMT_X1R5G5B5 ,0x0 ,0x00007c00 ,0x000003e0 ,0x0000001f ,2 ,FALSE ,GL_RGB5_A1 ,GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV },
{WINED3DFMT_A1R5G5B5 ,0x00008000 ,0x00007c00 ,0x000003e0 ,0x0000001f ,2 ,FALSE ,GL_RGB5_A1 ,GL_BGRA ,GL_UNSIGNED_SHORT_1_5_5_5_REV },
{WINED3DFMT_A4R4G4B4 ,0x0000f000 ,0x00000f00 ,0x000000f0 ,0x0000000f ,2 ,FALSE ,GL_RGBA4 ,GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV },
{WINED3DFMT_R3G3B2 ,0x0 ,0x000000e0 ,0x0000001c ,0x00000003 ,1 ,FALSE ,GL_R3_G3_B2 ,GL_RGB ,GL_UNSIGNED_BYTE_2_3_3_REV },
{WINED3DFMT_A8 ,0x000000ff ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_ALPHA8 ,GL_ALPHA ,GL_ALPHA },
{WINED3DFMT_A8R3G3B2 ,0x0000ff00 ,0x000000e0 ,0x0000001c ,0x00000003 ,2 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_X4R4G4B4 ,0x0 ,0x00000f00 ,0x000000f0 ,0x0000000f ,2 ,FALSE ,GL_RGB4 ,GL_BGRA ,GL_UNSIGNED_SHORT_4_4_4_4_REV },
{WINED3DFMT_A2B10G10R10 ,0xb0000000 ,0x000003ff ,0x000ffc00 ,0x3ff00000 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_A8B8G8R8 ,0xff000000 ,0x000000ff ,0x0000ff00 ,0x00ff0000 ,4 ,FALSE ,GL_RGBA8 ,GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV },
{WINED3DFMT_X8B8G8R8 ,0x0 ,0x000000ff ,0x0000ff00 ,0x00ff0000 ,4 ,FALSE ,GL_RGB8 ,GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV },
{WINED3DFMT_G16R16 ,0x0 ,0x0000ffff ,0xffff0000 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_A2R10G10B10 ,0xb0000000 ,0x3ff00000 ,0x000ffc00 ,0x000003ff ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_A16B16G16R16,0x0 ,0x0000ffff ,0xffff0000 ,0x0 ,8 ,FALSE ,GL_RGBA16_EXT ,GL_RGBA ,GL_UNSIGNED_SHORT },
/* Luminance */
{WINED3DFMT_L8 ,0x0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_LUMINANCE8 ,GL_LUMINANCE ,GL_UNSIGNED_BYTE },
{WINED3DFMT_A8L8 ,0x0000ff00 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_LUMINANCE8_ALPHA8 ,GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE },
{WINED3DFMT_A4L4 ,0x000000f0 ,0x0 ,0x0 ,0x0 ,1 ,FALSE ,GL_LUMINANCE4_ALPHA4 ,GL_LUMINANCE_ALPHA ,GL_UNSIGNED_BYTE },
/* Bump mapping stuff */
{WINED3DFMT_V8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX ,GL_UNSIGNED_BYTE },
{WINED3DFMT_L6V5U5 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_COLOR_INDEX8_EXT ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT_5_5_5_1 },
{WINED3DFMT_X8L8V8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_RGBA8 ,GL_BGRA ,GL_UNSIGNED_BYTE },
{WINED3DFMT_Q8W8V8U8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_RGBA8 ,GL_RGBA ,GL_UNSIGNED_INT_8_8_8_8_REV/*?*/},
{WINED3DFMT_V16U16 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT },
{WINED3DFMT_W11V11U10 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_A2W10V10U10 ,0xb0000000 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
/* Depth stencil formats */
{WINED3DFMT_D16_LOCKABLE,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT },
{WINED3DFMT_D32 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_INT },
{WINED3DFMT_D15S1 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT },
{WINED3DFMT_D24S8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_INT },
{WINED3DFMT_D24X8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_INT },
{WINED3DFMT_D24X4S4 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_INT },
{WINED3DFMT_D16 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT },
{WINED3DFMT_L16 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,GL_LUMINANCE16_EXT ,GL_LUMINANCE ,GL_UNSIGNED_SHORT },
{WINED3DFMT_D32F_LOCKABLE,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_D24FS8 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
/* Is this a vertex buffer? */
{WINED3DFMT_VERTEXDATA ,0x0 ,0x0 ,0x0 ,0x0 ,0 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_INDEX16 ,0x0 ,0x0 ,0x0 ,0x0 ,2 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_INDEX32 ,0x0 ,0x0 ,0x0 ,0x0 ,4 ,FALSE ,0 ,0 ,0 },
{WINED3DFMT_Q16W16V16U16,0x0 ,0x0 ,0x0 ,0x0 ,8 ,FALSE ,GL_COLOR_INDEX ,GL_COLOR_INDEX ,GL_UNSIGNED_SHORT }
};
const PixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt)
{
/* First check if the format is at the position of its value.
* This will catch the argb formats before the loop is entered
*/
if(fmt < (sizeof(formats) / sizeof(formats[0])) && formats[fmt].format == fmt) {
return &formats[fmt];
} else {
unsigned int i;
for(i = 0; i < (sizeof(formats) / sizeof(formats[0])); i++) {
if(formats[i].format == fmt) {
return &formats[i];
}
}
}
FIXME("Can't find format %s(%d) in the format lookup table\n", debug_d3dformat(fmt), fmt);
if(fmt == WINED3DFMT_UNKNOWN) {
ERR("Format table corrupt - Can't find WINED3DFMT_UNKNOWN\n");
return NULL;
}
/* Get the caller a valid pointer */
return getFormatDescEntry(WINED3DFMT_UNKNOWN);
}
/*****************************************************************************
* Trace formatting of useful values
*/
const char* debug_d3dformat(WINED3DFORMAT fmt) {
......@@ -1635,276 +1737,6 @@ void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords)
}
#define GLINFO_LOCATION ((IWineD3DImpl *)(This->wineD3D))->gl_info
GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
GLint retVal = 0;
if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
switch (fmt) {
case WINED3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
case WINED3DFMT_DXT2: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
case WINED3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
case WINED3DFMT_DXT4: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
case WINED3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
default:
/* stupid compiler */
break;
}
}
if (retVal == 0) {
switch (fmt) {
/* Paletted */
case WINED3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break;
case WINED3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break;
/* Luminance */
case WINED3DFMT_L8: retVal = GL_LUMINANCE8; break;
case WINED3DFMT_L16: retVal = GL_LUMINANCE16_EXT; break;
case WINED3DFMT_A8L8: retVal = GL_LUMINANCE8_ALPHA8; break;
case WINED3DFMT_A4L4: retVal = GL_LUMINANCE4_ALPHA4; break;
/* Bump */
case WINED3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break;
case WINED3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_L6V5U5: retVal = GL_COLOR_INDEX8_EXT; break;
case WINED3DFMT_X8L8V8U8: retVal = GL_RGBA8; break;
case WINED3DFMT_Q8W8V8U8: retVal = GL_RGBA8; break; /* almost but not quite... */
case WINED3DFMT_Q16W16V16U16: retVal = GL_COLOR_INDEX; break; /* almost but not quite... */
/* color buffer */
case WINED3DFMT_R3G3B2: retVal = GL_R3_G3_B2; break;
case WINED3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
case WINED3DFMT_R8G8B8: retVal = GL_RGB8; break;
case WINED3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break;
case WINED3DFMT_X1R5G5B5: retVal = GL_RGB5_A1; break;
case WINED3DFMT_A4R4G4B4: retVal = GL_RGBA4; break;
case WINED3DFMT_X4R4G4B4: retVal = GL_RGB4; break;
case WINED3DFMT_A8R8G8B8: retVal = GL_RGBA8; break;
case WINED3DFMT_A8B8G8R8: retVal = GL_RGBA8; break;
case WINED3DFMT_A2R10G10B10: retVal = GL_RGBA8; break;
case WINED3DFMT_X8R8G8B8: retVal = GL_RGB8; break;
case WINED3DFMT_A16B16G16R16: retVal = GL_RGBA16_EXT; break;
/* to see */
case WINED3DFMT_A8: retVal = GL_ALPHA8; break;
/* Depth + Stencil NOTE: OpenGL doesn't support depth-stencil surfaces so the formats are the closes bits match for the data */
case WINED3DFMT_D24S8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D24FS8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D24X8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D24X4S4: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D32: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D16: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D15S1: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D16_LOCKABLE: retVal = GL_COLOR_INDEX; break;
default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = GL_RGB8;
}
}
TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
GLenum retVal = 0;
if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
switch (fmt) {
case WINED3DFMT_DXT1: retVal = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; break;
case WINED3DFMT_DXT2: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
case WINED3DFMT_DXT3: retVal = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; break;
case WINED3DFMT_DXT4: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
case WINED3DFMT_DXT5: retVal = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break;
default:
/* stupid compiler */
break;
}
}
if (retVal == 0) {
switch (fmt) {
/* Paletted */
case WINED3DFMT_P8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_A8P8: retVal = GL_COLOR_INDEX; break;
/* Luminance */
case WINED3DFMT_L8: retVal = GL_LUMINANCE; break;
case WINED3DFMT_L16: retVal = GL_LUMINANCE; break;
case WINED3DFMT_A8L8: retVal = GL_LUMINANCE_ALPHA; break;
case WINED3DFMT_A4L4: retVal = GL_LUMINANCE_ALPHA; break;
/* Bump */
case WINED3DFMT_V8U8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_L6V5U5: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_X8L8V8U8: retVal = GL_BGRA; break;
case WINED3DFMT_Q8W8V8U8: retVal = GL_RGBA; break;
case WINED3DFMT_Q16W16V16U16: retVal = GL_COLOR_INDEX; break;
/* color buffer */
case WINED3DFMT_R3G3B2: retVal = GL_RGB; break;
case WINED3DFMT_R5G6B5: retVal = GL_RGB; break;
case WINED3DFMT_R8G8B8: retVal = GL_RGB; break;
case WINED3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
case WINED3DFMT_X1R5G5B5: retVal = GL_BGRA; break;
case WINED3DFMT_A4R4G4B4: retVal = GL_BGRA; break;
case WINED3DFMT_X4R4G4B4: retVal = GL_BGRA; break;
case WINED3DFMT_A8R8G8B8: retVal = GL_BGRA; break;
case WINED3DFMT_A8B8G8R8: retVal = GL_RGBA; break;
case WINED3DFMT_A2R10G10B10: retVal = GL_BGRA; break;
case WINED3DFMT_X8R8G8B8: retVal = GL_BGRA; break;
case WINED3DFMT_A16B16G16R16: retVal = GL_RGBA; break;
/* to see */
case WINED3DFMT_A8: retVal = GL_ALPHA; break;
/* Depth + Stencil */
case WINED3DFMT_D24S8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D24FS8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D24X8: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D24X4S4: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D32: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D16: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D15S1: retVal = GL_COLOR_INDEX; break;
case WINED3DFMT_D16_LOCKABLE: retVal = GL_COLOR_INDEX; break;
default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = GL_BGR;
}
}
TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
GLenum D3DFmt2GLType(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
GLenum retVal = 0;
if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
switch (fmt) {
case WINED3DFMT_DXT1: retVal = 0; break;
case WINED3DFMT_DXT2: retVal = 0; break;
case WINED3DFMT_DXT3: retVal = 0; break;
case WINED3DFMT_DXT4: retVal = 0; break;
case WINED3DFMT_DXT5: retVal = 0; break;
default:
/* stupid compiler */
break;
}
}
if (retVal == 0) {
switch (fmt) {
/* Paletted */
case WINED3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break;
case WINED3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break;
/* Luminance */
case WINED3DFMT_L8: retVal = GL_UNSIGNED_BYTE; break;
case WINED3DFMT_L16: retVal = GL_UNSIGNED_SHORT; break;
case WINED3DFMT_A8L8: retVal = GL_UNSIGNED_BYTE; break;
case WINED3DFMT_A4L4: retVal = GL_UNSIGNED_BYTE; break;
/* Bump */
case WINED3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break;
case WINED3DFMT_V16U16: retVal = GL_UNSIGNED_SHORT; break;
case WINED3DFMT_L6V5U5: retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
case WINED3DFMT_X8L8V8U8: retVal = GL_UNSIGNED_BYTE; break;
/* Color buffer */
case WINED3DFMT_R3G3B2: retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
case WINED3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break;
case WINED3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break;
case WINED3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
case WINED3DFMT_X1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
case WINED3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
case WINED3DFMT_X4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
case WINED3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
case WINED3DFMT_A8B8G8R8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
case WINED3DFMT_A2R10G10B10: retVal = GL_UNSIGNED_INT_2_10_10_10_REV; break;
case WINED3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
case WINED3DFMT_A16B16G16R16: retVal = GL_UNSIGNED_SHORT; break;
/* to see */
case WINED3DFMT_A8: retVal = GL_ALPHA; break;
/* Depth + Stencil */
case WINED3DFMT_D24S8: retVal = GL_UNSIGNED_INT; break;
case WINED3DFMT_D24FS8: retVal = GL_UNSIGNED_INT; break;
case WINED3DFMT_D24X8: retVal = GL_UNSIGNED_INT; break;
case WINED3DFMT_D24X4S4: retVal = GL_UNSIGNED_INT; break;
case WINED3DFMT_D32: retVal = GL_UNSIGNED_INT; break;
case WINED3DFMT_D16: retVal = GL_UNSIGNED_SHORT; break;
case WINED3DFMT_D15S1: retVal = GL_UNSIGNED_SHORT; break;
case WINED3DFMT_D16_LOCKABLE: retVal = GL_UNSIGNED_SHORT; break;
/* compressed textures */
case WINED3DFMT_DXT1: retVal = 0; break;
case WINED3DFMT_DXT2: retVal = 0; break;
case WINED3DFMT_DXT3: retVal = 0; break;
case WINED3DFMT_DXT4: retVal = 0; break;
case WINED3DFMT_DXT5: retVal = 0; break;
default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = GL_UNSIGNED_BYTE;
}
}
TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt) {
SHORT retVal;
switch (fmt) {
/* color buffer */
case WINED3DFMT_R3G3B2: retVal = 1; break;
case WINED3DFMT_R5G6B5: retVal = 2; break;
case WINED3DFMT_R8G8B8: retVal = 3; break;
case WINED3DFMT_A1R5G5B5: retVal = 2; break;
case WINED3DFMT_X1R5G5B5: retVal = 2; break;
case WINED3DFMT_A4R4G4B4: retVal = 2; break;
case WINED3DFMT_X4R4G4B4: retVal = 2; break;
case WINED3DFMT_A8R8G8B8: retVal = 4; break;
case WINED3DFMT_A8B8G8R8: retVal = 4; break;
case WINED3DFMT_A2R10G10B10: retVal = 4; break;
case WINED3DFMT_X8R8G8B8: retVal = 4; break;
case WINED3DFMT_A16B16G16R16: retVal = 8; break;
/* Paletted */
case WINED3DFMT_P8: retVal = 1; break;
case WINED3DFMT_A8P8: retVal = 2; break;
/* depth/stencil buffer */
case WINED3DFMT_D16_LOCKABLE: retVal = 2; break;
case WINED3DFMT_D16: retVal = 2; break;
case WINED3DFMT_D32: retVal = 4; break;
case WINED3DFMT_D15S1: retVal = 2; break;
case WINED3DFMT_D24X4S4: retVal = 4; break;
case WINED3DFMT_D24S8: retVal = 4; break;
case WINED3DFMT_D24FS8: retVal = 4; break;
case WINED3DFMT_D24X8: retVal = 4; break;
/* Luminance */
case WINED3DFMT_L8: retVal = 1; break;
case WINED3DFMT_L16: retVal = 2; break;
case WINED3DFMT_A4L4: retVal = 1; break;
case WINED3DFMT_A8L8: retVal = 2; break;
/* Bump */
case WINED3DFMT_V8U8: retVal = 2; break;
case WINED3DFMT_L6V5U5: retVal = 2; break;
case WINED3DFMT_V16U16: retVal = 4; break;
case WINED3DFMT_X8L8V8U8: retVal = 4; break;
case WINED3DFMT_Q8W8V8U8: retVal = 4; break;
case WINED3DFMT_Q16W16V16U16: retVal = 8; break;
/* Compressed */
case WINED3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */
case WINED3DFMT_DXT2: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
case WINED3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
case WINED3DFMT_DXT4: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
case WINED3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
/* to see */
case WINED3DFMT_A8: retVal = 1; break;
/* unknown */
case WINED3DFMT_UNKNOWN:
/* Guess at the highest value of the above */
TRACE("WINED3DFMT_UNKNOWN - Guessing at 8 bytes/pixel %u\n", fmt);
retVal = 8;
break;
default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = 8;
}
TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
/* Convertes a D3D format into a OpenGL configuration format */
int D3DFmtMakeGlCfg(D3DFORMAT BackBufferFormat, D3DFORMAT StencilBufferFormat, int *attribs, int* nAttribs, BOOL alternate){
......@@ -2086,187 +1918,6 @@ WINED3DFORMAT pixelformat_for_depth(DWORD depth) {
}
}
LONG get_bitmask_red(WINED3DFORMAT fmt)
{
switch (fmt) {
case WINED3DFMT_R8G8B8:
case WINED3DFMT_A8R8G8B8:
case WINED3DFMT_X8R8G8B8:
return 0x00ff0000;
case WINED3DFMT_X1R5G5B5:
case WINED3DFMT_A1R5G5B5:
return 0x7C00;
case WINED3DFMT_A4R4G4B4:
case WINED3DFMT_X4R4G4B4:
return 0xF00;
case WINED3DFMT_R3G3B2:
case WINED3DFMT_A8R3G3B2:
return 0xE0;
case WINED3DFMT_A2R10G10B10:
return 0x3F0000;
break;
case WINED3DFMT_A2B10G10R10:
return 0x3FF;
case WINED3DFMT_A8B8G8R8:
case WINED3DFMT_X8B8G8R8:
return 0xff;
case WINED3DFMT_R5G6B5:
return 0xF800;
case WINED3DFMT_P8:
/* No fixed mask for this format */
return 0;
#if 0
case WINED3DFMT_A16B16G16R16:
return 0x00000000ffff;
break;
#endif
default:
ERR("Unknown bitmask for format %d\n", fmt);
return 0;
}
}
LONG get_bitmask_green(WINED3DFORMAT fmt)
{
switch (fmt) {
case WINED3DFMT_R8G8B8:
case WINED3DFMT_A8R8G8B8:
case WINED3DFMT_X8R8G8B8:
return 0x0000ff00;
case WINED3DFMT_X1R5G5B5:
case WINED3DFMT_A1R5G5B5:
return 0x3E0;
case WINED3DFMT_A4R4G4B4:
case WINED3DFMT_X4R4G4B4:
return 0xF0;
case WINED3DFMT_R3G3B2:
case WINED3DFMT_A8R3G3B2:
return 0x1C;
case WINED3DFMT_A2B10G10R10:
return 0xFFC00;
case WINED3DFMT_A8B8G8R8:
case WINED3DFMT_X8B8G8R8:
return 0xFF00;
break;
case WINED3DFMT_A2R10G10B10:
return 0xFFC00;
break;
case WINED3DFMT_R5G6B5:
return 0x7E0;
case WINED3DFMT_P8:
/* No fixed mask for this format */
return 0;
#if 0
case WINED3DFMT_A16B16G16R16:
return 0x0000ffff0000;
break;
#endif
default:
ERR("Unknown bitmask for format %d\n", fmt);
return 0;
}
}
LONG get_bitmask_blue(WINED3DFORMAT fmt)
{
switch (fmt) {
case WINED3DFMT_R8G8B8:
case WINED3DFMT_A8R8G8B8:
case WINED3DFMT_X8R8G8B8:
return 0x000000ff;
case WINED3DFMT_X1R5G5B5:
case WINED3DFMT_A1R5G5B5:
return 0x1f;
case WINED3DFMT_A4R4G4B4:
case WINED3DFMT_X4R4G4B4:
return 0xF;
case WINED3DFMT_R3G3B2:
case WINED3DFMT_A8R3G3B2:
return 0x3;
case WINED3DFMT_A2B10G10R10:
return 0x3F0000;
case WINED3DFMT_A8B8G8R8:
case WINED3DFMT_X8B8G8R8:
return 0xFF0000;
case WINED3DFMT_A2R10G10B10:
return 0x3FF;
case WINED3DFMT_R5G6B5:
return 0x1F;
case WINED3DFMT_P8:
/* No fixed mask for this format */
return 0;
#if 0
case WINED3DFMT_A16B16G16R16:
return 0xffff00000000;
break;
#endif
default:
ERR("Unknown bitmask for format %d\n", fmt);
return 0;
}
}
LONG get_bitmask_alpha(WINED3DFORMAT fmt)
{
switch (fmt) {
case WINED3DFMT_A8R8G8B8:
return 0xff000000;
case WINED3DFMT_A1R5G5B5:
return 0x8000;
case WINED3DFMT_A4R4G4B4:
return 0xF000;
case WINED3DFMT_A8R3G3B2:
return 0xff00;
case WINED3DFMT_A2B10G10R10:
return 0xb0000000;
case WINED3DFMT_A8B8G8R8:
return 0xFF000000;
case WINED3DFMT_A2R10G10B10:
return 0xb0000000;
default:
return 0;
}
}
void multiply_matrix(D3DMATRIX *dest, D3DMATRIX *src1, D3DMATRIX *src2) {
D3DMATRIX temp;
......@@ -2317,19 +1968,6 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) {
return size;
}
BOOL isFourcc(WINED3DFORMAT fmt) {
return (fmt == WINED3DFMT_UYVY) ||
(fmt == WINED3DFMT_YUY2) ||
(fmt == WINED3DFMT_DXT1) ||
(fmt == WINED3DFMT_DXT2) ||
(fmt == WINED3DFMT_DXT3) ||
(fmt == WINED3DFMT_DXT4) ||
(fmt == WINED3DFMT_DXT5) ||
(fmt == WINED3DFMT_MULTI2_ARGB) ||
(fmt == WINED3DFMT_G8R8_G8B8) ||
(fmt == WINED3DFMT_R8G8_B8G8);
}
/***********************************************************************
* CalculateTexRect
*
......
......@@ -283,28 +283,28 @@ static HRESULT WINAPI IWineD3DVolumeImpl_SetContainer(IWineD3DVolume *iface, IWi
static HRESULT WINAPI IWineD3DVolumeImpl_LoadTexture(IWineD3DVolume *iface, GLenum gl_level) {
IWineD3DVolumeImpl *This = (IWineD3DVolumeImpl *)iface;
IWineD3DDeviceImpl *myDevice = This->resource.wineD3DDevice;
const PixelFormatDesc *formatEntry = getFormatDescEntry(This->resource.format);
TRACE("Calling glTexImage3D %x level=%d, intfmt=%x, w=%d, h=%d,d=%d, 0=%d, glFmt=%x, glType=%x, Mem=%p\n",
GL_TEXTURE_3D,
gl_level,
D3DFmt2GLIntFmt(myDevice, This->resource.format),
formatEntry->glInternal,
This->currentDesc.Width,
This->currentDesc.Height,
This->currentDesc.Depth,
0,
D3DFmt2GLFmt(myDevice, This->resource.format),
D3DFmt2GLType(myDevice, This->resource.format),
formatEntry->glFormat,
formatEntry->glType,
This->resource.allocatedMemory);
glTexImage3D(GL_TEXTURE_3D,
gl_level,
D3DFmt2GLIntFmt(myDevice, This->resource.format),
formatEntry->glInternal,
This->currentDesc.Width,
This->currentDesc.Height,
This->currentDesc.Depth,
0,
D3DFmt2GLFmt(myDevice, This->resource.format),
D3DFmt2GLType(myDevice, This->resource.format),
formatEntry->glFormat,
formatEntry->glType,
This->resource.allocatedMemory);
checkGLcall("glTexImage3D");
return WINED3D_OK;
......
......@@ -1169,11 +1169,6 @@ GLenum StencilFunc(DWORD func);
void set_tex_op(IWineD3DDevice *iface, BOOL isAlpha, int Stage, D3DTEXTUREOP op, DWORD arg1, DWORD arg2, DWORD arg3);
void set_texture_matrix(const float *smat, DWORD flags, BOOL calculatedCoords);
SHORT D3DFmtGetBpp(IWineD3DDeviceImpl* This, D3DFORMAT fmt);
GLenum D3DFmt2GLFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt);
GLenum D3DFmt2GLType(IWineD3DDeviceImpl *This, D3DFORMAT fmt);
GLint D3DFmt2GLIntFmt(IWineD3DDeviceImpl* This, D3DFORMAT fmt);
int D3DFmtMakeGlCfg(D3DFORMAT BackBufferFormat, D3DFORMAT StencilBufferFormat, int *attribs, int* nAttribs, BOOL alternate);
/* Math utils */
......@@ -1574,10 +1569,17 @@ DWORD IWineD3DPaletteImpl_Size(DWORD dwFlags);
/* DirectDraw utility functions */
extern WINED3DFORMAT pixelformat_for_depth(DWORD depth);
LONG get_bitmask_red(WINED3DFORMAT fmt);
LONG get_bitmask_green(WINED3DFORMAT fmt);
LONG get_bitmask_blue(WINED3DFORMAT fmt);
LONG get_bitmask_alpha(WINED3DFORMAT fmt);
BOOL isFourcc(WINED3DFORMAT fmt);
/*****************************************************************************
* Pixel format management
*/
typedef struct {
WINED3DFORMAT format;
DWORD alphaMask, redMask, greenMask, blueMask;
UINT bpp;
BOOL isFourcc;
GLint glInternal, glFormat, glType;
} PixelFormatDesc;
const PixelFormatDesc *getFormatDescEntry(WINED3DFORMAT fmt);
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment