diff --git a/dlls/d3d8/d3d8_main.c b/dlls/d3d8/d3d8_main.c index b6a7bbc904b..b96ba0de19b 100644 --- a/dlls/d3d8/d3d8_main.c +++ b/dlls/d3d8/d3d8_main.c @@ -50,6 +50,7 @@ IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion) IDirect3D8Impl *object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D8Impl)); object->lpVtbl = &Direct3D8_Vtbl; + object->direct3d8 = object; object->ref = 1; TRACE("SDKVersion = %x, Created Direct3D object at %p\n", SDKVersion, object); diff --git a/dlls/d3d8/d3d8_private.h b/dlls/d3d8/d3d8_private.h index 1dac87132f9..2b06208c329 100644 --- a/dlls/d3d8/d3d8_private.h +++ b/dlls/d3d8/d3d8_private.h @@ -249,6 +249,7 @@ struct IDirect3D8Impl /* IDirect3D8 fields */ GL_Info gl_info; + IDirect3D8Impl *direct3d8; }; /* IUnknown: */ diff --git a/dlls/d3d8/device.c b/dlls/d3d8/device.c index 62bdb8c930a..bec7a837b66 100644 --- a/dlls/d3d8/device.c +++ b/dlls/d3d8/device.c @@ -2813,8 +2813,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD /* If Alpha arg1 is texture then handle the special case when there changes between a texture and no texture - See comments in set_tex_op */ if ((This->StateBlock->texture_state[Stage][D3DTSS_ALPHAARG1] == D3DTA_TEXTURE) && - ((oldTxt == NULL) && (pTexture != NULL)) || - ((pTexture == NULL) && (oldTxt != NULL))) + (((oldTxt == NULL) && (pTexture != NULL)) || ((pTexture == NULL) && (oldTxt != NULL)))) { reapplyFlags |= REAPPLY_ALPHAOP; } @@ -3096,6 +3095,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 ifa glDisable(GL_TEXTURE_GEN_S); glDisable(GL_TEXTURE_GEN_T); glDisable(GL_TEXTURE_GEN_R); + checkGLcall("glDisable(GL_TEXTURE_GEN_S,T,R)"); break; case D3DTSS_TCI_CAMERASPACEPOSITION: diff --git a/dlls/d3d8/directx.c b/dlls/d3d8/directx.c index c7764421878..46d8d74c8de 100644 --- a/dlls/d3d8/directx.c +++ b/dlls/d3d8/directx.c @@ -320,6 +320,15 @@ HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat (LPDIRECT3D8 iface, RType, debug_d3dressourcetype(RType), CheckFormat, debug_d3dformat(CheckFormat)); + if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { + switch (CheckFormat) { + case D3DFMT_DXT1: + case D3DFMT_DXT3: + case D3DFMT_DXT5: + return D3D_OK; + } + } + switch (CheckFormat) { case D3DFMT_UYVY: case D3DFMT_YUY2: diff --git a/dlls/d3d8/utils.c b/dlls/d3d8/utils.c index 35d979df5bd..4727233266a 100644 --- a/dlls/d3d8/utils.c +++ b/dlls/d3d8/utils.c @@ -409,22 +409,8 @@ SHORT D3DFmtGetBpp(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { } GLint D3DFmt2GLIntFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { - GLint retVal; + GLint retVal = 0; - switch (fmt) { - case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break; - case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break; - - case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break; - case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break; - case D3DFMT_X8R8G8B8: retVal = GL_RGB8; break; - case D3DFMT_R8G8B8: retVal = GL_RGB8; break; - case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */ - case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break; - default: - FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); - retVal = GL_RGB8; - } #if defined(GL_EXT_texture_compression_s3tc) if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { switch (fmt) { @@ -437,6 +423,22 @@ GLint D3DFmt2GLIntFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) { } } #endif + if (retVal == 0) { + switch (fmt) { + case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break; + case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break; + + case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break; + case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break; + case D3DFMT_X8R8G8B8: retVal = GL_RGB8; break; + case D3DFMT_R8G8B8: retVal = GL_RGB8; break; + case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */ + case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; 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; }