diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index b45a1e8f5a1..6f21aed4373 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -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; diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c index 5a045ff7a47..dc9caa4101e 100644 --- a/dlls/wined3d/surface.c +++ b/dlls/wined3d/surface.c @@ -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; diff --git a/dlls/wined3d/surface_gdi.c b/dlls/wined3d/surface_gdi.c index 5691b4d22dc..b26f3c9c64b 100644 --- a/dlls/wined3d/surface_gdi.c +++ b/dlls/wined3d/surface_gdi.c @@ -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; diff --git a/dlls/wined3d/utils.c b/dlls/wined3d/utils.c index b0fb8c81416..92ea934b256 100644 --- a/dlls/wined3d/utils.c +++ b/dlls/wined3d/utils.c @@ -26,6 +26,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 */ @@ -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 * diff --git a/dlls/wined3d/volume.c b/dlls/wined3d/volume.c index a050d7f1ec4..82a1d870d60 100644 --- a/dlls/wined3d/volume.c +++ b/dlls/wined3d/volume.c @@ -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; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index e8322a28521..5dcda2f9e0c 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -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