-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, i'm back again (only a 4 days break). This patch inlcude the beginnig of merge of my 4 prototypes tree. Changelog: - - implemented render to surfaces (and render to new rendertargets) using glx pbuffers (with a usefull debug code to display rendered surface into window drawable) - - better cubetextures - - splitted utilities functions into utils.c and added more - - more readable debug again - - a better caps code (not perfect but i'll use glx code later) - - use of the new caps code - - begin of UpdateTexture - - begin of Cursor support - - cleaning most of deprecated #if 0/#endif - - correct some lockable/unlockable behavior - - correct some returns code Now, i have to take some days to read my huge list of late mails ;) Regards, Raphael PS: lionel can you send an updated version of dinput patch ? else i'll try to send it. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.1 (GNU/Linux) iD8DBQE+zVJZp7NA3AmQTU4RAi2/AJ42dPqT2qzymvVCTa1HYuswFCcnvgCfQsCh o6rEegcQePdc9tZeKx9esu8= =DsrQ -----END PGP SIGNATURE-----
Index: basetexture.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/basetexture.c,v retrieving revision 1.6 diff -u -r1.6 basetexture.c --- basetexture.c 17 May 2003 18:33:02 -0000 1.6 +++ basetexture.c 22 May 2003 22:24:10 -0000 @@ -123,6 +123,21 @@ return 0; } +BOOL WINAPI IDirect3DBaseTexture8Impl_IsDirty(LPDIRECT3DBASETEXTURE8 iface) { + ICOM_THIS(IDirect3DBaseTexture8Impl,iface); + return This->Dirty; +} + +BOOL WINAPI IDirect3DBaseTexture8Impl_SetDirty(LPDIRECT3DBASETEXTURE8 iface, BOOL dirty) { + BOOL old; + ICOM_THIS(IDirect3DBaseTexture8Impl,iface); + + old = This->Dirty; + This->Dirty = dirty; + return old; +} + + ICOM_VTABLE(IDirect3DBaseTexture8) Direct3DBaseTexture8_Vtbl = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE Index: cubetexture.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/cubetexture.c,v retrieving revision 1.8 diff -u -r1.8 cubetexture.c --- cubetexture.c 17 May 2003 18:33:02 -0000 1.8 +++ cubetexture.c 22 May 2003 22:24:10 -0000 @@ -140,7 +140,7 @@ if (i == 0 && This->surfaces[0][i]->textureName != 0 && This->Dirty == FALSE) { glEnable(GL_TEXTURE_CUBE_MAP_ARB); #if defined(GL_VERSION_1_3) - glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, This->surfaces[0][i]->textureName); + glBindTexture(GL_TEXTURE_CUBE_MAP, This->surfaces[0][i]->textureName); #else glBindTexture(GL_TEXTURE_CUBE_MAP_ARB, This->surfaces[0][i]->textureName); #endif @@ -173,10 +173,17 @@ } for (j = 0; j < 6; j++) { - TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, glFmt=%x, glType=%lx, Mem=%p\n", - cube_targets[j], i, fmt2glintFmt(This->format), - This->surfaces[j][i]->myDesc.Width, This->surfaces[j][i]->myDesc.Height, - 0, fmt2glFmt(This->format), fmt2glType(This->format), + IDirect3DSurface8Impl_CreateGLTexture((LPDIRECT3DSURFACE8) This->surfaces[j][i], cube_targets[j], i); +#if 0 + TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, glFmt=%x, glType=%x, Mem=%p\n", + cube_targets[j], + i, + fmt2glintFmt(This->format), + This->surfaces[j][i]->myDesc.Width, + This->surfaces[j][i]->myDesc.Height, + 0, + fmt2glFmt(This->format), + fmt2glType(This->format), This->surfaces[j][i]->allocatedMemory); glTexImage2D(cube_targets[j], i, @@ -188,6 +195,7 @@ fmt2glType(This->format), This->surfaces[j][i]->allocatedMemory); checkGLcall("glTexImage2D"); +#endif } /* Removed glTexParameterf now TextureStageStates are initialized at startup */ This->Dirty = FALSE; Index: device.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/device.c,v retrieving revision 1.59 diff -u -r1.59 device.c --- device.c 22 May 2003 03:35:24 -0000 1.59 +++ device.c 22 May 2003 22:24:16 -0000 @@ -78,122 +78,6 @@ #define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w); -const char* debug_d3ddevicetype(D3DDEVTYPE devtype) { - switch (devtype) { -#define DEVTYPE_TO_STR(dev) case dev: return #dev - DEVTYPE_TO_STR(D3DDEVTYPE_HAL); - DEVTYPE_TO_STR(D3DDEVTYPE_REF); - DEVTYPE_TO_STR(D3DDEVTYPE_SW); -#undef DEVTYPE_TO_STR - default: - FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype); - return "unrecognized"; - } -} - -const char* debug_d3dusage(DWORD usage) { - switch (usage) { -#define D3DUSAGE_TO_STR(u) case u: return #u - D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET); - D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL); - D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY); - D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING); - D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP); - D3DUSAGE_TO_STR(D3DUSAGE_POINTS); - D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES); - D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES); - D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC); -#undef D3DUSAGE_TO_STR - case 0: return "none"; - default: - FIXME("Unrecognized %lu Usage!\n", usage); - return "unrecognized"; - } -} - -const char* debug_d3dformat(D3DFORMAT fmt) { - switch (fmt) { -#define FMT_TO_STR(fmt) case fmt: return #fmt - FMT_TO_STR(D3DFMT_UNKNOWN); - FMT_TO_STR(D3DFMT_R8G8B8); - FMT_TO_STR(D3DFMT_A8R8G8B8); - FMT_TO_STR(D3DFMT_X8R8G8B8); - FMT_TO_STR(D3DFMT_R5G6B5); - FMT_TO_STR(D3DFMT_X1R5G5B5); - FMT_TO_STR(D3DFMT_A1R5G5B5); - FMT_TO_STR(D3DFMT_A4R4G4B4); - FMT_TO_STR(D3DFMT_R3G3B2); - FMT_TO_STR(D3DFMT_A8); - FMT_TO_STR(D3DFMT_A8R3G3B2); - FMT_TO_STR(D3DFMT_X4R4G4B4); - FMT_TO_STR(D3DFMT_A8P8); - FMT_TO_STR(D3DFMT_P8); - FMT_TO_STR(D3DFMT_L8); - FMT_TO_STR(D3DFMT_A8L8); - FMT_TO_STR(D3DFMT_A4L4); - FMT_TO_STR(D3DFMT_V8U8); - FMT_TO_STR(D3DFMT_L6V5U5); - FMT_TO_STR(D3DFMT_X8L8V8U8); - FMT_TO_STR(D3DFMT_Q8W8V8U8); - FMT_TO_STR(D3DFMT_V16U16); - FMT_TO_STR(D3DFMT_W11V11U10); - FMT_TO_STR(D3DFMT_UYVY); - FMT_TO_STR(D3DFMT_YUY2); - FMT_TO_STR(D3DFMT_DXT1); - FMT_TO_STR(D3DFMT_DXT2); - FMT_TO_STR(D3DFMT_DXT3); - FMT_TO_STR(D3DFMT_DXT4); - FMT_TO_STR(D3DFMT_DXT5); - FMT_TO_STR(D3DFMT_D16_LOCKABLE); - FMT_TO_STR(D3DFMT_D32); - FMT_TO_STR(D3DFMT_D15S1); - FMT_TO_STR(D3DFMT_D24S8); - FMT_TO_STR(D3DFMT_D16); - FMT_TO_STR(D3DFMT_D24X8); - FMT_TO_STR(D3DFMT_D24X4S4); - FMT_TO_STR(D3DFMT_VERTEXDATA); - FMT_TO_STR(D3DFMT_INDEX16); - FMT_TO_STR(D3DFMT_INDEX32); -#undef FMT_TO_STR - default: - FIXME("Unrecognized %u D3DFORMAT!\n", fmt); - return "unrecognized"; - } -} - -const char* debug_d3dressourcetype(D3DRESOURCETYPE res) { - switch (res) { -#define RES_TO_STR(res) case res: return #res; - RES_TO_STR(D3DRTYPE_SURFACE); - RES_TO_STR(D3DRTYPE_VOLUME); - RES_TO_STR(D3DRTYPE_TEXTURE); - RES_TO_STR(D3DRTYPE_VOLUMETEXTURE); - RES_TO_STR(D3DRTYPE_CUBETEXTURE); - RES_TO_STR(D3DRTYPE_VERTEXBUFFER); - RES_TO_STR(D3DRTYPE_INDEXBUFFER); -#undef RES_TO_STR - default: - FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res); - return "unrecognized"; - } -} - -const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) { - switch (PrimitiveType) { -#define PRIM_TO_STR(prim) case prim: return #prim; - PRIM_TO_STR(D3DPT_POINTLIST); - PRIM_TO_STR(D3DPT_LINELIST); - PRIM_TO_STR(D3DPT_LINESTRIP); - PRIM_TO_STR(D3DPT_TRIANGLELIST); - PRIM_TO_STR(D3DPT_TRIANGLESTRIP); - PRIM_TO_STR(D3DPT_TRIANGLEFAN); -#undef PRIM_TO_STR - default: - FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); - return "unrecognized"; - } -} - /* Routine common to the draw primitive and draw indexed primitive routines */ void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface, int PrimitiveType, @@ -346,6 +230,12 @@ glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ); checkGLcall("glOrtho"); } else { + double X, Y, height, width; + X = This->StateBlock->viewport.X; + Y = This->StateBlock->viewport.Y; + height = This->StateBlock->viewport.Height; + width = This->StateBlock->viewport.Width; + glMatrixMode(GL_MODELVIEW); checkGLcall("glMatrixMode"); glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]); @@ -353,6 +243,18 @@ glMultMatrixf((float *) &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]); checkGLcall("glMultMatrixf"); +#if 0 + /** + * OpenGL seems to map font between pixels + * well with this it seems better but not perfect + * anyone have a better idea ? + */ + glTranslatef(0.8f / width, -0.8f / height, 0.0f); + /** + * + */ +#endif + glMatrixMode(GL_PROJECTION); checkGLcall("glMatrixMode"); glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_PROJECTION].u.m[0][0]); @@ -529,9 +431,9 @@ } /* Now use the appropriate set of texture indexes */ - for (textureNo = 0; textureNo < This->TextureUnits; ++textureNo) { + for (textureNo = 0; textureNo < GL_LIMITS(textures); ++textureNo) { - if (!(This->isMultiTexture) && textureNo > 0) { + if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0) { FIXME("Program using multiple concurrent textures which this opengl implementation doesnt support\n"); continue ; } @@ -552,7 +454,7 @@ /* If texture transform flags in effect, values passed through to vertex depend on the D3DTSS_TEXTURETRANSFORMFLAGS */ - if (coordsToUse>0 && + if (coordsToUse > 0 && This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXTURETRANSFORMFLAGS] != D3DTTFF_DISABLE) { /* This indicates how many coords to use regardless of the @@ -589,7 +491,7 @@ switch (coordsToUse) { /* Supply the provided texture coords */ case D3DFVF_TEXTUREFORMAT1: VTRACE(("tex:%d, s=%f\n", textureNo, s[coordIdx])); - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glMultiTexCoord1f(GL_TEXTURE0 + textureNo, s[coordIdx]); #else @@ -601,7 +503,7 @@ break; case D3DFVF_TEXTUREFORMAT2: VTRACE(("tex:%d, s=%f, t=%f\n", textureNo, s[coordIdx], t[coordIdx])); - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glMultiTexCoord2f(GL_TEXTURE0 + textureNo, s[coordIdx], t[coordIdx]); #else @@ -613,7 +515,7 @@ break; case D3DFVF_TEXTUREFORMAT3: VTRACE(("tex:%d, s=%f, t=%f, r=%f\n", textureNo, s[coordIdx], t[coordIdx], r[coordIdx])); - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glMultiTexCoord3f(GL_TEXTURE0 + textureNo, s[coordIdx], t[coordIdx], r[coordIdx]); #else @@ -625,7 +527,7 @@ break; case D3DFVF_TEXTUREFORMAT4: VTRACE(("tex:%d, s=%f, t=%f, r=%f, q=%f\n", textureNo, s[coordIdx], t[coordIdx], r[coordIdx], q[coordIdx])); - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glMultiTexCoord4f(GL_TEXTURE0 + textureNo, s[coordIdx], t[coordIdx], r[coordIdx], q[coordIdx]); #else @@ -696,18 +598,18 @@ #if defined(GL_VERSION_1_4) glSecondaryColor3fv((float*) &vertex_shader->output.oD[1]); checkGLcall("glSecondaryColor3fv"); -#else - if (checkGLSupport(EXT_SECONDARY_COLOR)) { - /*specularColor = D3DCOLOR_COLORVALUE(vertex_shader->output.oD[1]);*/ - /*GLExtCall(glSecondaryColor3fvEXT)((float*) &vertex_shader->output.oD[1]);*/ - /*checkGLcall("glSecondaryColor3fvEXT");*/ +#elif defined(GL_EXT_secondary_color) + if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { + /*specularColor = D3DCOLORTOCOLORVALUE(vertex_shader->output.oD[1]);*/ + glSecondaryColor3fvEXT((float*) &vertex_shader->output.oD[1]); + checkGLcall("glSecondaryColor3fvEXT"); } #endif /** reupdate textures coords binding using vertex_shader->output.oT[0->3] */ for (textureNo = 0; textureNo < 4; ++textureNo) { float s, t, r, q; - if (!(This->isMultiTexture) && textureNo > 0) { + if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0) { FIXME("Program using multiple concurrent textures which this opengl implementation doesnt support\n"); continue ; } @@ -722,7 +624,7 @@ if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { VTRACE(("Skip tex coords, as being system generated\n")); } else { - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glMultiTexCoord2f(GL_TEXTURE0 + textureNo, s, t); #else @@ -745,7 +647,7 @@ if (This->UpdateStateBlock->texture_state[textureNo][D3DTSS_TEXCOORDINDEX] > 7) { VTRACE(("Skip tex coords, as being system generated\n")); } else { - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glMultiTexCoord3f(GL_TEXTURE0 + textureNo, s, t, r); #else @@ -846,30 +748,34 @@ /* no such functionality in the fixed function GL pipeline */ /* FIXME: Wont get here as will drop to slow method */ /* FIXME("Cannot handle blending data here in openGl\n");*/ - if (checkGLSupport(ARB_VERTEX_BLEND)) { - FIXME("TODO\n"); - } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) { - FIXME("TODO\n"); +#if 0 + if (GL_SUPPORT(ARB_VERTEX_BLEND)) { + /*FIXME("TODO\n");*/ + } else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) { + /*FIXME("TODO\n");*/ /* GLExtCall(glVertexWeightPointerEXT)(numBlends, GL_FLOAT, skip, curPos); checkGLcall("glVertexWeightPointerEXT(numBlends, ...)"); glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT); checkGLcall("glEnableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)"); */ - curPos += numBlends * sizeof(float); } else { FIXME("unsupported blending in openGl\n"); } +#endif + curPos += numBlends * sizeof(float); } else { - if (checkGLSupport(ARB_VERTEX_BLEND)) { +#if 0 + if (GL_SUPPORT(ARB_VERTEX_BLEND)) { FIXME("TODO\n"); - } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) { + } else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) { FIXME("TODO\n"); /* glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT); checkGLcall("glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)"); */ } +#endif } @@ -914,14 +820,14 @@ checkGLcall("glSecondaryColorPointer(4, GL_UNSIGNED_BYTE, skip, curPos)"); glEnableClientState(GL_SECONDARY_COLOR_ARRAY); checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY)"); -#else -# if 0 +#elif defined(GL_EXT_secondary_color) /* FIXME: check for GL_EXT_secondary_color */ - glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, skip, curPos); - checkGLcall("glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, skip, curPos)"); - glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); - checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)"); -# endif + if (GL_SUPPORT(EXT_SECONDARY_COLOR)) { + glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, skip, curPos); + checkGLcall("glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, skip, curPos)"); + glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT); + checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)"); + } #endif curPos += sizeof(DWORD); } else { @@ -971,9 +877,9 @@ } /* Now use the appropriate set of texture indexes */ - for (textureNo = 0; textureNo < This->TextureUnits; ++textureNo) { + for (textureNo = 0; textureNo < GL_LIMITS(textures); ++textureNo) { - if (!(This->isMultiTexture) && textureNo > 0) { + if (!GL_SUPPORT(ARB_MULTITEXTURE) && textureNo > 0) { FIXME("Program using multiple concurrent textures which this opengl implementation doesnt support\n"); continue ; } @@ -1079,167 +985,6 @@ TRACE("glEnd\n"); } -/* - * Simple utility routines used for dx -> gl mapping of byte formats - */ -SHORT bytesPerPixel(D3DFORMAT fmt) { - SHORT retVal; - - switch (fmt) { - /* color buffer */ - case D3DFMT_P8: retVal = 1; break; - case D3DFMT_A4R4G4B4: retVal = 2; break; - case D3DFMT_R5G6B5: retVal = 2; break; - case D3DFMT_X1R5G5B5: retVal = 2; break; - case D3DFMT_A1R5G5B5: retVal = 2; break; - case D3DFMT_R8G8B8: retVal = 3; break; - case D3DFMT_X8R8G8B8: retVal = 4; break; - case D3DFMT_A8R8G8B8: retVal = 4; break; - /* depth/stencil buffer */ - case D3DFMT_D16_LOCKABLE: retVal = 2; break; - case D3DFMT_D16: retVal = 2; break; - case D3DFMT_D15S1: retVal = 2; break; - case D3DFMT_D24X4S4: retVal = 4; break; - case D3DFMT_D24S8: retVal = 4; break; - case D3DFMT_D24X8: retVal = 4; break; - case D3DFMT_D32: retVal = 4; break; - /* unknown */ - case D3DFMT_UNKNOWN: - /* Guess at the highest value of the above */ - TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt); - retVal = 4; - break; - - default: - FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); - retVal = 4; - } - TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal); - return retVal; -} - -GLint fmt2glintFmt(D3DFORMAT fmt) { - GLint retVal; - - switch (fmt) { - 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; -} -GLenum fmt2glFmt(D3DFORMAT fmt) { - GLenum retVal; - - switch (fmt) { - case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break; - case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break; - case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break; - case D3DFMT_R8G8B8: retVal = GL_BGR; break; - case D3DFMT_R5G6B5: retVal = GL_RGB; break; - case D3DFMT_A1R5G5B5: retVal = GL_BGRA; 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; -} -DWORD fmt2glType(D3DFORMAT fmt) { - GLenum retVal; - - switch (fmt) { - case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break; - case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_BYTE; break; - case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_BYTE; break; - case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break; - case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break; - case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; 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; -} - -int SOURCEx_RGB_EXT(DWORD arg) { - switch(arg) { - case D3DTSS_COLORARG0: return GL_SOURCE2_RGB_EXT; - case D3DTSS_COLORARG1: return GL_SOURCE0_RGB_EXT; - case D3DTSS_COLORARG2: return GL_SOURCE1_RGB_EXT; - case D3DTSS_ALPHAARG0: - case D3DTSS_ALPHAARG1: - case D3DTSS_ALPHAARG2: - default: - FIXME("Invalid arg %ld\n", arg); - return GL_SOURCE0_RGB_EXT; - } -} -int OPERANDx_RGB_EXT(DWORD arg) { - switch(arg) { - case D3DTSS_COLORARG0: return GL_OPERAND2_RGB_EXT; - case D3DTSS_COLORARG1: return GL_OPERAND0_RGB_EXT; - case D3DTSS_COLORARG2: return GL_OPERAND1_RGB_EXT; - case D3DTSS_ALPHAARG0: - case D3DTSS_ALPHAARG1: - case D3DTSS_ALPHAARG2: - default: - FIXME("Invalid arg %ld\n", arg); - return GL_OPERAND0_RGB_EXT; - } -} -int SOURCEx_ALPHA_EXT(DWORD arg) { - switch(arg) { - case D3DTSS_ALPHAARG0: return GL_SOURCE2_ALPHA_EXT; - case D3DTSS_ALPHAARG1: return GL_SOURCE0_ALPHA_EXT; - case D3DTSS_ALPHAARG2: return GL_SOURCE1_ALPHA_EXT; - case D3DTSS_COLORARG0: - case D3DTSS_COLORARG1: - case D3DTSS_COLORARG2: - default: - FIXME("Invalid arg %ld\n", arg); - return GL_SOURCE0_ALPHA_EXT; - } -} -int OPERANDx_ALPHA_EXT(DWORD arg) { - switch(arg) { - case D3DTSS_ALPHAARG0: return GL_OPERAND2_ALPHA_EXT; - case D3DTSS_ALPHAARG1: return GL_OPERAND0_ALPHA_EXT; - case D3DTSS_ALPHAARG2: return GL_OPERAND1_ALPHA_EXT; - case D3DTSS_COLORARG0: - case D3DTSS_COLORARG1: - case D3DTSS_COLORARG2: - default: - FIXME("Invalid arg %ld\n", arg); - return GL_OPERAND0_ALPHA_EXT; - } -} -GLenum StencilOp(DWORD op) { - switch(op) { - case D3DSTENCILOP_KEEP : return GL_KEEP; - case D3DSTENCILOP_ZERO : return GL_ZERO; - case D3DSTENCILOP_REPLACE : return GL_REPLACE; - case D3DSTENCILOP_INCRSAT : return GL_INCR; - case D3DSTENCILOP_DECRSAT : return GL_DECR; - case D3DSTENCILOP_INVERT : return GL_INVERT; - case D3DSTENCILOP_INCR : FIXME("Unsupported stencil op D3DSTENCILOP_INCR\n"); - return GL_INCR; /* Fixme - needs to support wrap */ - case D3DSTENCILOP_DECR : FIXME("Unsupported stencil op D3DSTENCILOP_DECR\n"); - return GL_DECR; /* Fixme - needs to support wrap */ - default: - FIXME("Invalid stencil op %ld\n", op); - return GL_ALWAYS; - } -} - /** * @nodoc: todo */ @@ -1305,7 +1050,6 @@ } } - /* Apply the current values to the specified texture stage */ void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage) { ICOM_THIS(IDirect3DDevice8Impl,iface); @@ -1313,7 +1057,7 @@ float col[4]; /* Make appropriate texture active */ - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glActiveTexture(GL_TEXTURE0 + Stage); #else @@ -1330,13 +1074,8 @@ } /* Note the D3DRS value applies to all textures, but GL has one - per texture, so apply it now ready to be used! */ -#if 0 - col[0] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR]>> 16) & 0xFF) / 255.0; - col[1] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR] >> 8 ) & 0xFF) / 255.0; - col[2] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR] >> 0 ) & 0xFF) / 255.0; - col[3] = ((This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR] >> 24 ) & 0xFF) / 255.0; -#endif + * per texture, so apply it now ready to be used! + */ D3DCOLORTOGLFLOAT4(This->StateBlock->renderstate[D3DRS_TEXTUREFACTOR], col); glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]); checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);"); @@ -1371,7 +1110,8 @@ ULONG ref = --This->ref; TRACE("(%p) : ReleaseRef to %ld\n", This, This->ref); if (ref == 0) { - HeapFree(GetProcessHeap(), 0, This); + IDirect3DDevice8Impl_CleanRender(iface); + HeapFree(GetProcessHeap(), 0, This); } return ref; } @@ -1447,20 +1187,39 @@ return D3D_OK; } HRESULT WINAPI IDirect3DDevice8Impl_SetCursorProperties(LPDIRECT3DDEVICE8 iface, UINT XHotSpot, UINT YHotSpot, IDirect3DSurface8* pCursorBitmap) { + IDirect3DSurface8Impl* pSur = (IDirect3DSurface8Impl*) pCursorBitmap; ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); return D3D_OK; + TRACE("(%p) : Spot Pos(%u,%u)\n", This, XHotSpot, YHotSpot); + + if (D3DFMT_A8R8G8B8 != pSur->myDesc.Format) { + ERR("(%p) : surface(%p) have a invalid format\n", This, pCursorBitmap); + return D3DERR_INVALIDCALL; + } + if (32 != pSur->myDesc.Height || 32 != pSur->myDesc.Width) { + ERR("(%p) : surface(%p) have a invalid size\n", This, pCursorBitmap); + return D3DERR_INVALIDCALL; + } + + This->xHotSpot = XHotSpot; + This->yHotSpot = YHotSpot; + return D3D_OK; } -void WINAPI IDirect3DDevice8Impl_SetCursorPosition(LPDIRECT3DDEVICE8 iface, UINT XScreenSpace, UINT YScreenSpace,DWORD Flags) { +void WINAPI IDirect3DDevice8Impl_SetCursorPosition(LPDIRECT3DDEVICE8 iface, UINT XScreenSpace, UINT YScreenSpace, DWORD Flags) { ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); return; + TRACE("(%p) : SetPos to (%u,%u)\n", This, XScreenSpace, YScreenSpace); + This->xScreenSpace = XScreenSpace; + This->yScreenSpace = YScreenSpace; + return; } BOOL WINAPI IDirect3DDevice8Impl_ShowCursor(LPDIRECT3DDEVICE8 iface, BOOL bShow) { ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); return D3D_OK; + TRACE("(%p) : visible(%d)\n", This, bShow); + This->bCursorVisible = bShow; + return D3D_OK; } HRESULT WINAPI IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain8** pSwapChain) { ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); + FIXME("(%p) : stub\n", This); *pSwapChain = NULL; return D3D_OK; } @@ -1474,7 +1233,7 @@ ENTER_GL(); - glXSwapBuffers(This->display, This->win); + glXSwapBuffers(This->display, This->drawable); checkGLcall("glXSwapBuffers"); LEAVE_GL(); @@ -1501,16 +1260,18 @@ FIXME("(%p) : stub\n", This); return D3D_OK; } -void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags,CONST D3DGAMMARAMP* pRamp) { +void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags, CONST D3DGAMMARAMP* pRamp) { ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); return; + FIXME("(%p) : stub\n", This); + return; } void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3DGAMMARAMP* pRamp) { ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); return; + FIXME("(%p) : stub\n", This); + return; } HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, - D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture8** ppTexture) { + D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture8** ppTexture) { IDirect3DTexture8Impl *object; int i; UINT tmpW; @@ -1523,7 +1284,6 @@ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl)); object->lpVtbl = &Direct3DTexture8_Vtbl; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->device);*/ object->ResourceType = D3DRTYPE_TEXTURE; object->ref = 1; object->width = Width; @@ -1532,7 +1292,6 @@ object->usage = Usage; object->format = Format; - /* Calculate levels for mip mapping */ if (Levels == 0) { object->levels++; @@ -1553,9 +1312,15 @@ { IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]); object->surfaces[i]->Container = (IUnknown*) object; - /*IUnknown_AddRef(object->surfaces[i]->Container);*/ object->surfaces[i]->myDesc.Usage = Usage; - object->surfaces[i]->myDesc.Pool = Pool ; + object->surfaces[i]->myDesc.Pool = Pool; + /** + * As writen in msdn in IDirect3DTexture8::LockRect + * Textures created in D3DPOOL_DEFAULT are not lockable. + */ + if (D3DPOOL_DEFAULT == Pool) { + object->surfaces[i]->lockable = FALSE; + } TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[i], object->surfaces[i]->allocatedMemory); tmpW = max(1, tmpW / 2); @@ -1565,7 +1330,9 @@ *ppTexture = (LPDIRECT3DTEXTURE8) object; return D3D_OK; } -HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture8** ppVolumeTexture) { +HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, + UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, + D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture8** ppVolumeTexture) { IDirect3DVolumeTexture8Impl *object; int i; @@ -1581,7 +1348,6 @@ object->lpVtbl = &Direct3DVolumeTexture8_Vtbl; object->ResourceType = D3DRTYPE_VOLUMETEXTURE; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ref = 1; object->width = Width; @@ -1613,7 +1379,7 @@ for (i = 0; i < object->levels; i++) { - IDirect3DVolume8Impl *volume; + IDirect3DVolume8Impl* volume; /* Create the volume - No entry point for this seperately?? */ volume = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVolume8Impl)); @@ -1621,10 +1387,8 @@ volume->lpVtbl = &Direct3DVolume8_Vtbl; volume->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) volume->Device);*/ volume->ResourceType = D3DRTYPE_VOLUME; volume->Container = (IUnknown*) object; - /*IUnknown_AddRef(volume->Container);*/ volume->ref = 1; volume->myDesc.Width = Width; @@ -1634,12 +1398,13 @@ volume->myDesc.Type = D3DRTYPE_VOLUME; volume->myDesc.Pool = Pool; volume->myDesc.Usage = Usage; - volume->bytesPerPixel = bytesPerPixel(Format); + volume->bytesPerPixel = D3DFmtGetBpp(Format); volume->myDesc.Size = (Width * volume->bytesPerPixel) * Height * Depth; volume->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, volume->myDesc.Size); - TRACE("(%p) : Volume at w(%d) h(%d) d(%d) fmt(%u,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Depth, Format, debug_d3dformat(Format), - volume, volume->allocatedMemory, volume->myDesc.Size); + TRACE("(%p) : Volume at w(%d) h(%d) d(%d) fmt(%u,%s) surf@%p, surfmem@%p, %d bytes\n", + This, Width, Height, Depth, Format, debug_d3dformat(Format), + volume, volume->allocatedMemory, volume->myDesc.Size); tmpW = max(1, tmpW / 2); tmpH = max(1, tmpH / 2); @@ -1649,7 +1414,8 @@ *ppVolumeTexture = (LPDIRECT3DVOLUMETEXTURE8) object; return D3D_OK; } -HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8** ppCubeTexture) { +HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage, + D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8** ppCubeTexture) { IDirect3DCubeTexture8Impl *object; ICOM_THIS(IDirect3DDevice8Impl,iface); @@ -1662,7 +1428,6 @@ object->lpVtbl = &Direct3DCubeTexture8_Vtbl; object->ref = 1; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ResourceType = D3DRTYPE_CUBETEXTURE; object->edgeLength = EdgeLength; @@ -1688,10 +1453,15 @@ for (j = 0; j < 6; j++) { IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]); object->surfaces[j][i]->Container = (IUnknown*) object; - /*IUnknown_AddRef(object->surfaces[j][i]->Container);*/ object->surfaces[j][i]->myDesc.Usage = Usage; object->surfaces[j][i]->myDesc.Pool = Pool; - /*object->surfaces[j][i]->myDesc.Format = Format;*/ + /** + * As writen in msdn in IDirect3DCubeTexture8::LockRect + * Textures created in D3DPOOL_DEFAULT are not lockable. + */ + if (D3DPOOL_DEFAULT == Pool) { + object->surfaces[j][i]->lockable = FALSE; + } TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[j][i], object->surfaces[j][i]->allocatedMemory); tmpW = max(1, tmpW / 2); @@ -1711,7 +1481,6 @@ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DVertexBuffer8Impl)); object->lpVtbl = &Direct3DVertexBuffer8_Vtbl; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ResourceType = D3DRTYPE_VERTEXBUFFER; object->ref = 1; object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, Size); @@ -1736,7 +1505,6 @@ object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DIndexBuffer8Impl)); object->lpVtbl = &Direct3DIndexBuffer8_Vtbl; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ref = 1; object->ResourceType = D3DRTYPE_INDEXBUFFER; @@ -1756,7 +1524,6 @@ } HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface) { IDirect3DSurface8Impl *object; - ICOM_THIS(IDirect3DDevice8Impl,iface); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DSurface8Impl)); @@ -1767,10 +1534,8 @@ *ppSurface = (LPDIRECT3DSURFACE8) object; object->lpVtbl = &Direct3DSurface8_Vtbl; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ResourceType = D3DRTYPE_SURFACE; object->Container = (IUnknown*) This; - /*IUnknown_AddRef(object->Container);*/ object->ref = 1; object->myDesc.Width = Width; @@ -1780,12 +1545,12 @@ object->myDesc.Usage = D3DUSAGE_RENDERTARGET; object->myDesc.Pool = D3DPOOL_DEFAULT; object->myDesc.MultiSampleType = MultiSample; - object->bytesPerPixel = bytesPerPixel(Format); + object->bytesPerPixel = D3DFmtGetBpp(Format); object->myDesc.Size = (Width * object->bytesPerPixel) * Height; object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); object->lockable = Lockable; object->locked = FALSE; - + TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) lockable(%d) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), Lockable, *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; } @@ -1802,10 +1567,8 @@ *ppSurface = (LPDIRECT3DSURFACE8) object; object->lpVtbl = &Direct3DSurface8_Vtbl; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ResourceType = D3DRTYPE_SURFACE; object->Container = (IUnknown*) This; - /*IUnknown_AddRef(object->Container);*/ object->ref = 1; object->myDesc.Width = Width; @@ -1815,12 +1578,12 @@ object->myDesc.Usage = D3DUSAGE_DEPTHSTENCIL; object->myDesc.Pool = D3DPOOL_DEFAULT; object->myDesc.MultiSampleType = MultiSample; - object->bytesPerPixel = bytesPerPixel(Format); + object->bytesPerPixel = D3DFmtGetBpp(Format); object->myDesc.Size = (Width * object->bytesPerPixel) * Height; object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); object->lockable = (D3DFMT_D16_LOCKABLE == Format) ? TRUE : FALSE; object->locked = FALSE; - + TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; } @@ -1833,10 +1596,8 @@ *ppSurface = (LPDIRECT3DSURFACE8) object; object->lpVtbl = &Direct3DSurface8_Vtbl; object->Device = This; - /*IDirect3DDevice8Impl_AddRef((LPDIRECT3DDEVICE8) object->Device);*/ object->ResourceType = D3DRTYPE_SURFACE; object->Container = (IUnknown*) This; - /*IUnknown_AddRef(object->Container);*/ object->ref = 1; object->myDesc.Width = Width; @@ -1845,7 +1606,7 @@ object->myDesc.Type = D3DRTYPE_SURFACE; object->myDesc.Usage = 0; object->myDesc.Pool = D3DPOOL_SYSTEMMEM; - object->bytesPerPixel = bytesPerPixel(Format); + object->bytesPerPixel = D3DFmtGetBpp(Format); object->myDesc.Size = (Width * object->bytesPerPixel) * Height; object->allocatedMemory = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, object->myDesc.Size); object->lockable = TRUE; @@ -1854,10 +1615,11 @@ TRACE("(%p) : w(%d) h(%d) fmt(%d,%s) surf@%p, surfmem@%p, %d bytes\n", This, Width, Height, Format, debug_d3dformat(Format), *ppSurface, object->allocatedMemory, object->myDesc.Size); return D3D_OK; } -HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pSourceSurface,CONST RECT* pSourceRectsArray,UINT cRects, - IDirect3DSurface8* pDestinationSurface,CONST POINT* pDestPointsArray) { +HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, + IDirect3DSurface8* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects, + IDirect3DSurface8* pDestinationSurface, CONST POINT* pDestPointsArray) { - HRESULT rc = D3D_OK; + HRESULT rc = D3D_OK; IDirect3DBaseTexture8* texture = NULL; @@ -1865,13 +1627,15 @@ IDirect3DSurface8Impl* dst = (IDirect3DSurface8Impl*) pDestinationSurface; ICOM_THIS(IDirect3DDevice8Impl,iface); - TRACE("(%p) srcsur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", This, + TRACE("(%p) pSrcSur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", This, pSourceSurface, pSourceRectsArray, cRects, pDestinationSurface, pDestPointsArray); /* Note: Not sure about the d3dfmt_unknown bit, but seems to avoid a problem inside a sample and doesnt seem to break anything as far as I can tell */ if (src->myDesc.Format != dst->myDesc.Format && (dst->myDesc.Format != D3DFMT_UNKNOWN)) { - TRACE("Formats do not match %x / %x\n", src->myDesc.Format, dst->myDesc.Format); + TRACE("Formats do not match (%x,%s) / (%x,%s)\n", + src->myDesc.Format, debug_d3dformat(src->myDesc.Format), + dst->myDesc.Format, debug_d3dformat(dst->myDesc.Format)); rc = D3DERR_INVALIDCALL; } else if (dst->myDesc.Format == D3DFMT_UNKNOWN) { @@ -1881,23 +1645,10 @@ /* Convert container as well */ IDirect3DSurface8Impl_GetContainer((LPDIRECT3DSURFACE8) dst, &IID_IDirect3DBaseTexture8, (void**) &texture); /* FIXME: Which refid? */ if (texture != NULL) { - - switch (IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) texture)) { - case D3DRTYPE_TEXTURE: - ((IDirect3DTexture8Impl *)texture)->format = src->myDesc.Format; - break; - case D3DRTYPE_VOLUMETEXTURE: - ((IDirect3DVolumeTexture8Impl *)texture)->format = src->myDesc.Format; - break; - case D3DRTYPE_CUBETEXTURE: - ((IDirect3DCubeTexture8Impl *)texture)->format = src->myDesc.Format; - break; - default: - FIXME("Unhandled texture type\n"); - } - + ((IDirect3DBaseTexture8Impl*) texture)->format = src->myDesc.Format; /** Releasing texture after GetContainer */ - IDirect3DBaseTexture8_Release(texture); + IDirect3DBaseTexture8_Release(texture); + texture = NULL; } } @@ -1916,7 +1667,7 @@ memcpy(lrDst.pBits, lrSrc.pBits, src->myDesc.Size); IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src); - IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst); + rc = IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst); TRACE("Unlocked src and dst\n"); } else { @@ -1930,15 +1681,7 @@ if (NULL != pSourceRectsArray && NULL != pDestPointsArray) { - int bytesPerPixel = ((IDirect3DSurface8Impl *)pSourceSurface)->bytesPerPixel; -#if 0 - int pitchFrom = ((IDirect3DSurface8Impl *)pSourceSurface)->myDesc.Width * bytesPerPixel; - int pitchTo = ((IDirect3DSurface8Impl *)pDestinationSurface)->myDesc.Width * bytesPerPixel; - char *copyfrom = ((IDirect3DSurface8Impl *)pSourceSurface)->allocatedMemory; - char *copyto = ((IDirect3DSurface8Impl *)pDestinationSurface)->allocatedMemory; - char *from; - char *to; -#endif + int bytesPerPixel = ((IDirect3DSurface8Impl*) pSourceSurface)->bytesPerPixel; int i; /* Copy rect by rect */ for (i = 0; i < cRects; i++) { @@ -1976,7 +1719,7 @@ } IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src); - IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst); + rc = IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst); TRACE("Unlocked src and dst\n"); } @@ -1988,44 +1731,76 @@ } } - /* Set dirty */ - if (rc == D3D_OK) { - IDirect3DSurface8Impl_GetContainer((LPDIRECT3DSURFACE8) dst, &IID_IDirect3DBaseTexture8, (void**) &texture); /* FIXME: Which refid? */ - if (texture != NULL) { - - switch (IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) texture)) { - case D3DRTYPE_TEXTURE: - { - IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)texture; - pTexture->Dirty = TRUE; - } - break; - case D3DRTYPE_VOLUMETEXTURE: - { - IDirect3DVolumeTexture8Impl *pTexture = (IDirect3DVolumeTexture8Impl *)texture; - pTexture->Dirty = TRUE; - } - break; - case D3DRTYPE_CUBETEXTURE: - { - IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)texture; - pTexture->Dirty = TRUE; - } - break; - default: - FIXME("Unhandled texture type\n"); - } - - /** Releasing texture after GetContainer */ - IDirect3DBaseTexture8_Release(texture); - } - } - - return D3D_OK; + return rc; } HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture, IDirect3DBaseTexture8* pDestinationTexture) { + IDirect3DBaseTexture8Impl* src = (IDirect3DBaseTexture8Impl*) pSourceTexture; + IDirect3DBaseTexture8Impl* dst = (IDirect3DBaseTexture8Impl*) pDestinationTexture; + D3DRESOURCETYPE srcType; + D3DRESOURCETYPE dstType; + ICOM_THIS(IDirect3DDevice8Impl,iface); - FIXME("(%p) : stub\n", This); + TRACE("(%p) : first try\n", This); + + srcType = IDirect3DBaseTexture8Impl_GetType(pSourceTexture); + dstType = IDirect3DBaseTexture8Impl_GetType(pDestinationTexture); + + if (srcType != dstType) { + return D3DERR_INVALIDCALL; + } + if (D3DPOOL_SYSTEMMEM != IDirect3DResource8Impl_GetPool((LPDIRECT3DRESOURCE8) src)) { + return D3DERR_INVALIDCALL; + } + if (D3DPOOL_DEFAULT != IDirect3DResource8Impl_GetPool((LPDIRECT3DRESOURCE8) dst)) { + return D3DERR_INVALIDCALL; + } + if (IDirect3DBaseTexture8Impl_IsDirty(pSourceTexture)) { + /** Only copy Dirty textures */ + DWORD srcLevelCnt = IDirect3DBaseTexture8Impl_GetLevelCount(pSourceTexture); + DWORD dstLevelCnt = IDirect3DBaseTexture8Impl_GetLevelCount(pDestinationTexture); + DWORD skipLevels = (dstLevelCnt < srcLevelCnt) ? srcLevelCnt - dstLevelCnt : 0; + UINT i, j; + + for (i = skipLevels; i < srcLevelCnt; ++i) { + HRESULT hr; + + switch (srcType) { + case D3DRTYPE_TEXTURE: + { + IDirect3DSurface8* srcSur = NULL; + IDirect3DSurface8* dstSur = NULL; + hr = IDirect3DTexture8Impl_GetSurfaceLevel((LPDIRECT3DTEXTURE8) src, i, &srcSur); + hr = IDirect3DTexture8Impl_GetSurfaceLevel((LPDIRECT3DTEXTURE8) dst, i - skipLevels, &dstSur); + /*IDirect3DDevice8_CopyRects*/ + IDirect3DSurface8Impl_Release(srcSur); + IDirect3DSurface8Impl_Release(dstSur); + } + break; + case D3DRTYPE_VOLUMETEXTURE: + { + FIXME("D3DRTYPE_VOLUMETEXTURE reload currently not implemented\n"); + } + break; + case D3DRTYPE_CUBETEXTURE: + { + IDirect3DSurface8* srcSur = NULL; + IDirect3DSurface8* dstSur = NULL; + for (j = 0; j < 5; ++j) { + hr = IDirect3DCubeTexture8Impl_GetCubeMapSurface((LPDIRECT3DCUBETEXTURE8) src, j, i, &srcSur); + hr = IDirect3DCubeTexture8Impl_GetCubeMapSurface((LPDIRECT3DCUBETEXTURE8) dst, j, i - skipLevels, &srcSur); + /*IDirect3DDevice8_CopyRects*/ + IDirect3DSurface8Impl_Release(srcSur); + IDirect3DSurface8Impl_Release(dstSur); + } + } + break; + default: + break; + } + } + IDirect3DBaseTexture8Impl_SetDirty(pSourceTexture, FALSE); + } + return D3D_OK; } HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) { @@ -2089,10 +1864,6 @@ vcheckGLcall("glReadPixels"); } } - /* - glReadPixels(0, 0, This->PresentParms.BackBufferWidth, This->PresentParms.BackBufferHeight, - GL_BGRA, GL_UNSIGNED_BYTE, lockedRect.pBits); - */ glPixelStorei(GL_PACK_SWAP_BYTES, prev_store); vcheckGLcall("glPixelStorei"); glReadBuffer(prev_read); @@ -2104,34 +1875,47 @@ return hr; } HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget, IDirect3DSurface8* pNewZStencil) { + HRESULT hr; + ICOM_THIS(IDirect3DDevice8Impl,iface); - if ((IDirect3DSurface8Impl*) pRenderTarget == This->frontBuffer && (IDirect3DSurface8Impl*) pNewZStencil == This->depthStencilBuffer) { + if ((IDirect3DSurface8Impl*) pRenderTarget == This->renderTarget && (IDirect3DSurface8Impl*) pNewZStencil == This->stencilBufferTarget) { TRACE("Trying to do a NOP SetRenderTarget operation\n"); return D3D_OK; } - - FIXME("(%p) : invalid stub expect crash newRender@%p newZStencil@%p\n", This, pRenderTarget, pNewZStencil); - return D3D_OK; + IDirect3DDevice8Impl_CleanRender(iface); + + if ((IDirect3DSurface8Impl*) pRenderTarget == This->frontBuffer && (IDirect3DSurface8Impl*) pNewZStencil == This->depthStencilBuffer) { + TRACE("retoring SetRenderTarget defaults\n"); + return D3D_OK; + } + + TRACE("(%p) : expect crash newRender@%p newZStencil@%p\n", This, pRenderTarget, pNewZStencil); + + hr = IDirect3DDevice8Impl_ActiveRender(iface, pRenderTarget, pNewZStencil); + + return hr; } + HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget) { ICOM_THIS(IDirect3DDevice8Impl,iface); - TRACE("(%p)->(%p)\n", This, This->frontBuffer); + TRACE("(%p)->(%p) default(%p)\n", This, This->renderTarget, This->frontBuffer); - *ppRenderTarget = (LPDIRECT3DSURFACE8) This->frontBuffer; + *ppRenderTarget = (LPDIRECT3DSURFACE8) This->renderTarget; IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppRenderTarget); return D3D_OK; } + HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppZStencilSurface) { ICOM_THIS(IDirect3DDevice8Impl,iface); - TRACE("(%p)->(%p)\n", This, ppZStencilSurface); + TRACE("(%p)->(%p) default(%p)\n", This, This->stencilBufferTarget, This->depthStencilBuffer); /* Note inc ref on returned surface */ - *ppZStencilSurface = (LPDIRECT3DSURFACE8) This->depthStencilBuffer; + *ppZStencilSurface = (LPDIRECT3DSURFACE8) This->stencilBufferTarget; IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) *ppZStencilSurface); return D3D_OK; @@ -2155,6 +1939,17 @@ printf("Hit Enter ...\n"); getchar(); */ + if (This->frontBuffer != This->renderTarget) { + IDirect3DBaseTexture8* cont = NULL; + HRESULT hr; + hr = IDirect3DSurface8_GetContainer((LPDIRECT3DSURFACE8) This->renderTarget, &IID_IDirect3DBaseTexture8, (void**) &cont); + if (SUCCEEDED(hr) && NULL != cont) { + IDirect3DBaseTexture8_PreLoad(cont); + IDirect3DBaseTexture8_Release(cont); + cont = NULL; + } + } + LEAVE_GL(); return D3D_OK; } @@ -2334,11 +2129,13 @@ */ /** store it */ conv_mat(lpmatrix, &This->StateBlock->transforms[d3dts]); - if (checkGLSupport(ARB_VERTEX_BLEND)) { +#if 0 + if (GL_SUPPORT(ARB_VERTEX_BLEND)) { FIXME("TODO\n"); - } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) { + } else if (GL_SUPPORT(EXT_VERTEX_WEIGHTING)) { FIXME("TODO\n"); } +#endif } /* @@ -2372,7 +2169,7 @@ enabled, since the call to enable it will not reset the position. */ /* Reset lights */ - for (k = 0; k < This->maxLights; k++) { + for (k = 0; k < GL_LIMITS(lights); k++) { glLightfv(GL_LIGHT0 + k, GL_POSITION, &This->lightPosn[k][0]); checkGLcall("glLightfv posn"); glLightfv(GL_LIGHT0 + k, GL_SPOT_DIRECTION, &This->lightDirn[k][0]); @@ -2380,13 +2177,13 @@ } /* Reset Clipping Planes if clipping is enabled */ - for (k = 0; k < This->clipPlanes; k++) { + for (k = 0; k < GL_LIMITS(clipplanes); k++) { glClipPlane(GL_CLIP_PLANE0 + k, This->StateBlock->clipplane[k]); checkGLcall("glClipPlane"); } /* Reapply texture transforms as based off modelview when applied */ - for (Stage = 0; Stage < This->TextureUnits; Stage++) { + for (Stage = 0; Stage < GL_LIMITS(textures); Stage++) { /* Only applicable if the transforms are not disabled */ if (This->UpdateStateBlock->texture_state[Stage][D3DTSS_TEXTURETRANSFORMFLAGS] != D3DTTFF_DISABLE) @@ -2660,7 +2457,7 @@ ICOM_THIS(IDirect3DDevice8Impl,iface); TRACE("(%p) : Idx(%ld), pLight(%p)\n", This, Index, pLight); - if (Index >= This->maxLights) { + if (Index >= GL_LIMITS(lights)) { TRACE("Cannot handle more lights than device supports\n"); return D3DERR_INVALIDCALL; } @@ -2801,7 +2598,7 @@ ICOM_THIS(IDirect3DDevice8Impl,iface); TRACE("(%p) : Idx(%ld), pLight(%p)\n", This, Index, pLight); - if (Index >= This->maxLights) { + if (Index >= GL_LIMITS(lights)) { TRACE("Cannot handle more lights than device supports\n"); return D3DERR_INVALIDCALL; } @@ -2813,7 +2610,7 @@ ICOM_THIS(IDirect3DDevice8Impl,iface); TRACE("(%p) : Idx(%ld), enable? %d\n", This, Index, Enable); - if (Index >= This->maxLights) { + if (Index >= GL_LIMITS(lights)) { TRACE("Cannot handle more lights than device supports\n"); return D3DERR_INVALIDCALL; } @@ -2841,7 +2638,7 @@ ICOM_THIS(IDirect3DDevice8Impl,iface); TRACE("(%p) : for idx(%ld)\n", This, Index); - if (Index >= This->maxLights) { + if (Index >= GL_LIMITS(lights)) { TRACE("Cannot handle more lights than device supports\n"); return D3DERR_INVALIDCALL; } @@ -2854,7 +2651,7 @@ TRACE("(%p) : for idx %ld, %p\n", This, Index, pPlane); /* Validate Index */ - if (Index >= This->clipPlanes ) { + if (Index >= GL_LIMITS(clipplanes)) { TRACE("Application has requested clipplane this device doesnt support\n"); return D3DERR_INVALIDCALL; } @@ -2893,7 +2690,7 @@ TRACE("(%p) : for idx %ld\n", This, Index); /* Validate Index */ - if (Index >= This->clipPlanes ) { + if (Index >= GL_LIMITS(clipplanes)) { TRACE("Application has requested clipplane this device doesnt support\n"); return D3DERR_INVALIDCALL; } @@ -3226,23 +3023,17 @@ /* Note the texture color applies to all textures whereas GL_TEXTURE_ENV_COLOR applies to active only */ float col[4]; -#if 0 - col[0] = ((Value >> 16) & 0xFF) / 255.0f; - col[1] = ((Value >> 8) & 0xFF) / 255.0f; - col[2] = ((Value >> 0) & 0xFF) / 255.0f; - col[3] = ((Value >> 24) & 0xFF) / 255.0f; -#endif D3DCOLORTOGLFLOAT4(Value, col); /* Set the default alpha blend color */ glBlendColor(col[0], col[1], col[2], col[3]); checkGLcall("glBlendColor"); /* And now the default texture color as well */ - for (i = 0; i < This->TextureUnits; i++) { + for (i = 0; i < GL_LIMITS(textures); i++) { /* Note the D3DRS value applies to all textures, but GL has one per texture, so apply it now ready to be used! */ - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glActiveTexture(GL_TEXTURE0 + i); #else @@ -3262,10 +3053,10 @@ case D3DRS_SPECULARENABLE : { if (Value) { - glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR); + glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR); checkGLcall("glLightModel (GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);"); } else { - glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR); + glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR); checkGLcall("glLightModel (GL_LIGHT_MODEL_COLOR_CONTROL,GL_SINGLE_COLOR);"); } } @@ -3420,12 +3211,6 @@ case D3DRS_FOGCOLOR : { float col[4]; -#if 0 - col[0] = ((Value >> 16) & 0xFF) / 255.0f; - col[1] = ((Value >> 8) & 0xFF) / 255.0f; - col[2] = ((Value >> 0) & 0xFF) / 255.0f; - col[3] = ((Value >> 24) & 0xFF) / 255.0f; -#endif D3DCOLORTOGLFLOAT4(Value, col); /* Set the default alpha blend color */ glFogfv(GL_FOG_COLOR, &col[0]); @@ -3466,7 +3251,8 @@ case D3DRS_FOGDENSITY : { - glFogf(GL_FOG_DENSITY, (float) Value); + float *f = (float*) &Value; + glFogfv(GL_FOG_DENSITY, f); checkGLcall("glFogf(GL_FOG_DENSITY, (float) Value)"); } break; @@ -3491,7 +3277,6 @@ } break; - case D3DRS_COLORVERTEX : case D3DRS_DIFFUSEMATERIALSOURCE : case D3DRS_SPECULARMATERIALSOURCE : @@ -3542,12 +3327,151 @@ } break; - /* Unhandled yet...! */ case D3DRS_LINEPATTERN : + { + D3DLINEPATTERN *pattern = (D3DLINEPATTERN *)&Value; + TRACE("Line pattern: repeat %d bits %x\n", pattern->wRepeatFactor, pattern->wLinePattern); + + if (pattern->wRepeatFactor) { + glLineStipple(pattern->wRepeatFactor, pattern->wLinePattern); + checkGLcall("glLineStipple(repeat, linepattern)\n"); + glEnable(GL_LINE_STIPPLE); + checkGLcall("glEnable(GL_LINE_STIPPLE);\n"); + } else { + glDisable(GL_LINE_STIPPLE); + checkGLcall("glDisable(GL_LINE_STIPPLE);\n"); + } + } + break; + + case D3DRS_ZBIAS : + { + if (Value) { + TRACE("ZBias value %f\n", *((float*)&Value)); + glPolygonOffset(0, -*((float*)&Value)); + checkGLcall("glPolygonOffset(0, -Value)"); + glEnable(GL_POLYGON_OFFSET_FILL); + checkGLcall("glEnable(GL_POLYGON_OFFSET_FILL);"); + glEnable(GL_POLYGON_OFFSET_LINE); + checkGLcall("glEnable(GL_POLYGON_OFFSET_LINE);"); + glEnable(GL_POLYGON_OFFSET_POINT); + checkGLcall("glEnable(GL_POLYGON_OFFSET_POINT);"); + } else { + glDisable(GL_POLYGON_OFFSET_FILL); + checkGLcall("glDisable(GL_POLYGON_OFFSET_FILL);"); + glDisable(GL_POLYGON_OFFSET_LINE); + checkGLcall("glDisable(GL_POLYGON_OFFSET_LINE);"); + glDisable(GL_POLYGON_OFFSET_POINT); + checkGLcall("glDisable(GL_POLYGON_OFFSET_POINT);"); + } + } + break; + + case D3DRS_NORMALIZENORMALS : + if (Value) { + glEnable(GL_NORMALIZE); + checkGLcall("glEnable(GL_NORMALIZE);"); + } else { + glDisable(GL_NORMALIZE); + checkGLcall("glDisable(GL_NORMALIZE);"); + } + break; + + case D3DRS_POINTSIZE : + TRACE("Set point size to %f\n", *((float*)&Value)); + glPointSize(*((float*)&Value)); + checkGLcall("glPointSize(...);\n"); + break; + + case D3DRS_POINTSIZE_MIN : +#if defined(GL_VERSION_1_4) + glPointParameterf(GL_POINT_SIZE_MIN, *((float*)&Value)); + checkGLcall("glPointParameterf(...);\n"); +#elif defined(GL_EXT_point_parameters) + glPointParameterfEXT(GL_POINT_SIZE_MIN_EXT, *((float*)&Value)); + checkGLcall("glPointParameterfEXT(...);\n"); +#elif defined(GL_ARB_point_parameters) + glPointParameterfARB(GL_POINT_SIZE_MIN_ARB, *((float*)&Value)); + checkGLcall("glPointParameterfARB(...);\n"); +#else + FIXME("D3DRS_POINTSIZE_MIN not supported on this opengl\n"); +#endif + break; + + case D3DRS_POINTSIZE_MAX : +#if defined(GL_VERSION_1_4) + glPointParameterf(GL_POINT_SIZE_MAX, *((float*)&Value)); + checkGLcall("glPointParameterf(...);\n"); +#elif defined(GL_EXT_point_parameters) + glPointParameterfEXT(GL_POINT_SIZE_MAX_EXT, *((float*)&Value)); + checkGLcall("glPointParameterfEXT(...);\n"); +#elif defined(GL_ARB_point_parameters) + glPointParameterfARB(GL_POINT_SIZE_MAX_ARB, *((float*)&Value)); + checkGLcall("glPointParameterfARB(...);\n"); +#else + FIXME("D3DRS_POINTSIZE_MAX not supported on this opengl\n"); +#endif + break; + + case D3DRS_POINTSCALE_A : + case D3DRS_POINTSCALE_B : + case D3DRS_POINTSCALE_C : + case D3DRS_POINTSCALEENABLE : + { + /* If enabled, supply the parameters, otherwise fall back to defaults */ + if (This->StateBlock->renderstate[D3DRS_POINTSCALEENABLE]) { + GLfloat att[3] = {1.0, 0.0, 0.0}; + att[0] = *((float*)&This->StateBlock->renderstate[D3DRS_POINTSCALE_A]); + att[1] = *((float*)&This->StateBlock->renderstate[D3DRS_POINTSCALE_B]); + att[2] = *((float*)&This->StateBlock->renderstate[D3DRS_POINTSCALE_C]); + +#if defined(GL_VERSION_1_4) + glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, att); + checkGLcall("glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, ...);\n"); +#elif defined(GL_EXT_point_parameters) + glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, att); + checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);\n"); +#elif defined(GL_ARB_point_parameters) + glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, att); + checkGLcall("glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, ...);\n"); +#else + TRACE("D3DRS_POINTSCALEENABLE not supported on this opengl\n"); +#endif + } else { + GLfloat att[3] = {1.0, 0.0, 0.0}; +#if defined(GL_VERSION_1_4) + glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, att); + checkGLcall("glPointParameterfv(GL_POINT_DISTANCE_ATTENUATION, ...);\n"); +#elif defined(GL_EXT_point_parameters) + glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, att); + checkGLcall("glPointParameterfvEXT(GL_DISTANCE_ATTENUATION_EXT, ...);\n"); +#elif defined(GL_ARB_point_parameters) + glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, att); + checkGLcall("glPointParameterfvARB(GL_POINT_DISTANCE_ATTENUATION_ARB, ...);\n"); +#else + TRACE("D3DRS_POINTSCALEENABLE not supported, but not on either\n"); +#endif + } + break; + } + + case D3DRS_COLORWRITEENABLE : + TRACE("Color mask: r(%d) g(%d) b(%d) a(%d)\n", + Value & D3DCOLORWRITEENABLE_RED?1:0, + Value & D3DCOLORWRITEENABLE_GREEN?1:0, + Value & D3DCOLORWRITEENABLE_BLUE?1:0, + Value & D3DCOLORWRITEENABLE_ALPHA?1:0); + glColorMask(Value & D3DCOLORWRITEENABLE_RED, + Value & D3DCOLORWRITEENABLE_GREEN, + Value & D3DCOLORWRITEENABLE_BLUE, + Value & D3DCOLORWRITEENABLE_ALPHA); + checkGLcall("glColorMask(...)\n"); + break; + + /* Unhandled yet...! */ case D3DRS_LASTPIXEL : case D3DRS_ZVISIBLE : case D3DRS_EDGEANTIALIAS : - case D3DRS_ZBIAS : case D3DRS_RANGEFOGENABLE : case D3DRS_WRAP0 : case D3DRS_WRAP1 : @@ -3559,22 +3483,13 @@ case D3DRS_WRAP7 : case D3DRS_FOGVERTEXMODE : case D3DRS_LOCALVIEWER : - case D3DRS_NORMALIZENORMALS : case D3DRS_SOFTWAREVERTEXPROCESSING : - case D3DRS_POINTSIZE : - case D3DRS_POINTSIZE_MIN : case D3DRS_POINTSPRITEENABLE : - case D3DRS_POINTSCALEENABLE : - case D3DRS_POINTSCALE_A : - case D3DRS_POINTSCALE_B : - case D3DRS_POINTSCALE_C : case D3DRS_MULTISAMPLEANTIALIAS : case D3DRS_MULTISAMPLEMASK : case D3DRS_PATCHEDGESTYLE : case D3DRS_PATCHSEGMENTS : case D3DRS_DEBUGMONITORTOKEN : - case D3DRS_POINTSIZE_MAX : - case D3DRS_COLORWRITEENABLE : case D3DRS_POSITIONORDER : case D3DRS_NORMALORDER : /*Put back later: FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); */ @@ -3676,7 +3591,7 @@ TRACE("(%p) : Stage(%ld), Texture (%p)\n", This, Stage, pTexture); /* Reject invalid texture units */ - if (Stage >= This->TextureUnits) { + if (Stage >= GL_LIMITS(textures)) { TRACE("Attempt to access invalid texture rejected\n"); return D3DERR_INVALIDCALL; } @@ -3692,7 +3607,7 @@ } /* Make appropriate texture active */ - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glActiveTexture(GL_TEXTURE0 + Stage); #else @@ -3721,7 +3636,6 @@ TRACE("Skipping setting texture as old == new\n"); reapplyStates = FALSE; } else { - /* Standard 2D texture */ TRACE("Standard 2d texture\n"); This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_2D; @@ -3730,76 +3644,19 @@ IDirect3DTexture8Impl_PreLoad((LPDIRECT3DTEXTURE8) pTexture); } } else if (textureType == D3DRTYPE_VOLUMETEXTURE) { -#if 0 - IDirect3DVolumeTexture8Impl *pTexture2 = (IDirect3DVolumeTexture8Impl *) pTexture; - int i; -#endif - /* Standard 3D (volume) texture */ TRACE("Standard 3d texture\n"); This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_3D; /* Load up the texture now */ IDirect3DVolumeTexture8Impl_PreLoad((LPDIRECT3DVOLUMETEXTURE8) pTexture); - -#if 0 - for (i=0; i<pTexture2->levels; i++) - { - - if (i==0 && pTexture2->volumes[i]->textureName != 0 && pTexture2->Dirty == FALSE) { - glBindTexture(GL_TEXTURE_3D, pTexture2->volumes[i]->textureName); - checkGLcall("glBindTexture"); - TRACE("Texture %p given name %d\n", pTexture2->volumes[i], pTexture2->volumes[i]->textureName); - - /* No need to walk through all mip-map levels, since already all assigned */ - i = pTexture2->levels; - } else { - if (i==0) { - - if (pTexture2->volumes[i]->textureName == 0) { - glGenTextures(1, &pTexture2->volumes[i]->textureName); - checkGLcall("glGenTextures"); - TRACE("Texture %p given name %d\n", pTexture2->volumes[i], pTexture2->volumes[i]->textureName); - } - - glBindTexture(GL_TEXTURE_3D, pTexture2->volumes[i]->textureName); - checkGLcall("glBindTexture"); - - glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, pTexture2->levels-1); - checkGLcall("glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, pTexture2->levels-1)"); - } - - TRACE("Calling glTexImage3D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, 0=%d, glFmt=%x, glType=%lx, Mem=%p\n", - GL_TEXTURE_3D, i, fmt2glintFmt(pTexture2->format), pTexture2->volumes[i]->myDesc.Width, - pTexture2->volumes[i]->myDesc.Height, pTexture2->volumes[i]->myDesc.Depth, - 0, fmt2glFmt(pTexture2->format),fmt2glType(pTexture2->format), - pTexture2->volumes[i]->allocatedMemory); - glTexImage3D(GL_TEXTURE_3D, i, - fmt2glintFmt(pTexture2->format), - pTexture2->volumes[i]->myDesc.Width, - pTexture2->volumes[i]->myDesc.Height, - pTexture2->volumes[i]->myDesc.Depth, - 0, - fmt2glFmt(pTexture2->format), - fmt2glType(pTexture2->format), - pTexture2->volumes[i]->allocatedMemory - ); - checkGLcall("glTexImage3D"); - - /* Removed glTexParameterf now TextureStageStates are initialized at startup */ - pTexture2->Dirty = FALSE; - } - } -#endif - } else if (textureType == D3DRTYPE_CUBETEXTURE) { - /* Standard Cube texture */ - FIXME("Standard Cube texture\n"); - - This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_CUBE_MAP_ARB; + /* Standard Cube texture */ + TRACE("Standard Cube texture\n"); + This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_CUBE_MAP_ARB; - /* Load up the texture now */ - IDirect3DCubeTexture8Impl_PreLoad((LPDIRECT3DCUBETEXTURE8) pTexture); + /* Load up the texture now */ + IDirect3DCubeTexture8Impl_PreLoad((LPDIRECT3DCUBETEXTURE8) pTexture); } else { FIXME("(%p) : Incorrect type for a texture : (%d,%s)\n", This, textureType, debug_d3dressourcetype(textureType)); } @@ -3835,7 +3692,7 @@ TRACE("(%p) : stub, Stage=%ld, Type=%d, Value=%ld\n", This, Stage, Type, Value); /* Reject invalid texture units */ - if (Stage >= This->TextureUnits) { + if (Stage >= GL_LIMITS(textures)) { TRACE("Attempt to access invalid texture rejected\n"); return D3DERR_INVALIDCALL; } @@ -3852,7 +3709,7 @@ /* Make appropriate texture active */ VTRACE(("Activating appropriate texture state %ld\n", Stage)); - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glActiveTexture(GL_TEXTURE0 + Stage); vcheckGLcall("glActiveTexture"); @@ -4108,7 +3965,7 @@ case D3DTOP_DOTPRODUCT3 : #if defined(GL_VERSION_1_3) - if (This->isDot3) { + if (GL_SUPPORT(ARB_TEXTURE_ENV_DOT3)) { glTexEnvi(GL_TEXTURE_ENV, Parm, GL_DOT3_RGBA); checkGLcall("glTexEnvi(GL_TEXTURE_ENV, comb_target, GL_DOT3_RGBA);"); break; @@ -4199,12 +4056,6 @@ case D3DTSS_BORDERCOLOR : { float col[4]; -#if 0 - col[0] = ((Value >> 16) & 0xFF) / 255.0; - col[1] = ((Value >> 8) & 0xFF) / 255.0; - col[2] = ((Value >> 0) & 0xFF) / 255.0; - col[3] = ((Value >> 24) & 0xFF) / 255.0; -#endif D3DCOLORTOGLFLOAT4(Value, col); TRACE("Setting border color for %x to %lx\n", This->StateBlock->textureDimensions[Stage], Value); glTexParameterfv(This->StateBlock->textureDimensions[Stage], GL_TEXTURE_BORDER_COLOR, &col[0]); @@ -4432,13 +4283,17 @@ FIXME("(%p) : Setting to (%u)\n", This, PaletteNumber); This->currentPalette = PaletteNumber; #if defined(GL_EXT_paletted_texture) - glColorTableEXT(GL_TEXTURE_2D, /* target */ - GL_RGBA, /* internal format */ - 256, /* table size */ - GL_RGBA, /* table format */ - GL_UNSIGNED_BYTE, /* table type */ - &This->palettes[PaletteNumber]); - checkGLcall("glColorTableEXT"); + if (GL_SUPPORT(EXT_PALETTED_TEXTURE)) { + glColorTableEXT(GL_TEXTURE_2D, /* target */ + GL_RGBA, /* internal format */ + 256, /* table size */ + GL_RGBA, /* table format */ + GL_UNSIGNED_BYTE, /* table type */ + &This->palettes[PaletteNumber]); + checkGLcall("glColorTableEXT"); + } else { + /* Delayed palette handling ... waiting for software emulation into preload code */ + } #endif return D3D_OK; } @@ -4984,3 +4839,224 @@ IDirect3DDevice8Impl_DrawTriPatch, IDirect3DDevice8Impl_DeletePatch }; + +HRESULT WINAPI IDirect3DDevice8Impl_CleanRender(LPDIRECT3DDEVICE8 iface) { + ICOM_THIS(IDirect3DDevice8Impl,iface); +#if defined(GL_VERSION_1_3) /* @see comments on ActiveRender */ +#if 0 + if (This->glCtx != This->render_ctx) { + glXDestroyContext(This->display, This->render_ctx); + This->render_ctx = This->glCtx; + } +#endif + if (This->win != This->drawable) { + glXDestroyPbuffer(This->display, This->drawable); + This->drawable = This->win; + } +#endif + return D3D_OK; +} + +HRESULT WINAPI IDirect3DDevice8Impl_ActiveRender(LPDIRECT3DDEVICE8 iface, + IDirect3DSurface8* RenderSurface, + IDirect3DSurface8* StencilSurface) { + + /** + * Currently only active for GLX >= 1.3 + * for others versions we'll have to use GLXPixmaps + * + * normally we must test GLX_VERSION_1_3 but nvidia headers are not correct + * as they implements GLX 1.3 but only define GLX_VERSION_1_2 + * so only check OpenGL version + */ +#if defined(GL_VERSION_1_3) + + GLXFBConfig* cfgs = NULL; + int nCfgs = 0; + int attribs[256]; + int nAttribs = 0; + D3DFORMAT BackBufferFormat = ((IDirect3DSurface8Impl*) RenderSurface)->myDesc.Format; + D3DFORMAT StencilBufferFormat = ((IDirect3DSurface8Impl*) StencilSurface)->myDesc.Format; + UINT Width = ((IDirect3DSurface8Impl*) RenderSurface)->myDesc.Width; + UINT Height = ((IDirect3DSurface8Impl*) RenderSurface)->myDesc.Height; + IDirect3DSurface8Impl* tmp; + + ICOM_THIS(IDirect3DDevice8Impl,iface); + +#define PUSH1(att) attribs[nAttribs++] = (att); +#define PUSH2(att,value) attribs[nAttribs++] = (att); attribs[nAttribs++] = (value); + + PUSH2(GLX_DRAWABLE_TYPE, GLX_WINDOW_BIT | GLX_WINDOW | GLX_PBUFFER_BIT); + PUSH2(GLX_X_RENDERABLE, TRUE); + PUSH2(GLX_DOUBLEBUFFER, TRUE); + + switch (BackBufferFormat) { + /* color buffer */ + case D3DFMT_P8: + PUSH2(GLX_RENDER_TYPE, GLX_COLOR_INDEX_BIT); + PUSH2(GLX_BUFFER_SIZE, 8); + PUSH2(GLX_DOUBLEBUFFER, TRUE); + break; + + case D3DFMT_R3G3B2: + PUSH2(GLX_RENDER_TYPE, GLX_RGBA_BIT); + PUSH2(GLX_RED_SIZE, 3); + PUSH2(GLX_GREEN_SIZE, 3); + PUSH2(GLX_BLUE_SIZE, 2); + break; + + case D3DFMT_A1R5G5B5: + PUSH2(GLX_ALPHA_SIZE, 1); + case D3DFMT_X1R5G5B5: + PUSH2(GLX_RED_SIZE, 5); + PUSH2(GLX_GREEN_SIZE, 5); + PUSH2(GLX_BLUE_SIZE, 5); + break; + + case D3DFMT_R5G6B5: + PUSH2(GLX_RED_SIZE, 5); + PUSH2(GLX_GREEN_SIZE, 6); + PUSH2(GLX_BLUE_SIZE, 5); + break; + + case D3DFMT_A4R4G4B4: + PUSH2(GLX_ALPHA_SIZE, 4); + case D3DFMT_X4R4G4B4: + PUSH2(GLX_RED_SIZE, 4); + PUSH2(GLX_GREEN_SIZE, 4); + PUSH2(GLX_BLUE_SIZE, 4); + break; + + case D3DFMT_A8R8G8B8: + PUSH2(GLX_ALPHA_SIZE, 8); + case D3DFMT_R8G8B8: + case D3DFMT_X8R8G8B8: + PUSH2(GLX_RED_SIZE, 8); + PUSH2(GLX_GREEN_SIZE, 8); + PUSH2(GLX_BLUE_SIZE, 8); + break; + + default: + break; + } + + switch (StencilBufferFormat) { + case D3DFMT_D16_LOCKABLE: + case D3DFMT_D16: + PUSH2(GLX_DEPTH_SIZE, 16); + break; + + case D3DFMT_D15S1: + PUSH2(GLX_DEPTH_SIZE, 15); + break; + + case D3DFMT_D24X8: + PUSH2(GLX_DEPTH_SIZE, 24); + break; + + case D3DFMT_D24X4S4: + PUSH2(GLX_DEPTH_SIZE, 24); + PUSH2(GLX_STENCIL_SIZE, 4); + break; + + case D3DFMT_D24S8: + PUSH2(GLX_DEPTH_SIZE, 24); + PUSH2(GLX_STENCIL_SIZE, 8); + break; + + case D3DFMT_D32: + PUSH2(GLX_DEPTH_SIZE, 32); + break; + + default: + break; + } + + PUSH1(None); + + cfgs = glXChooseFBConfig(This->display, DefaultScreen(This->display), attribs, &nCfgs); + if (NULL != cfgs) { +#if 0 + int i; + for (i = 0; i < nCfgs; ++i) { + TRACE("for (%u,%s)/(%u,%s) found config[%d]@%p\n", BackBufferFormat, debug_d3dformat(BackBufferFormat), StencilBufferFormat, debug_d3dformat(StencilBufferFormat), i, cfgs[i]); + } +#endif + + if (NULL != This->renderTarget) { + GLenum prev_read; + glFlush(); + vcheckGLcall("glFlush"); + +#if 0 + /** very very usefull debug code */ + glXSwapBuffers(This->display, This->drawable); + printf("Hit Enter to get next frame ...\n"); + getchar(); +#endif + + glGetIntegerv(GL_READ_BUFFER, &prev_read); + vcheckGLcall("glIntegerv"); + glReadBuffer(GL_BACK); + vcheckGLcall("glReadBuffer"); + { + long j; + for (j = 0; j < This->renderTarget->myDesc.Height; ++j) { + glReadPixels(0, + This->renderTarget->myDesc.Height - j - 1, + This->renderTarget->myDesc.Width, + 1, + D3DFmt2GLFmt(This->renderTarget->myDesc.Format), + D3DFmt2GLType(This->renderTarget->myDesc.Format), + This->renderTarget->allocatedMemory); + vcheckGLcall("glReadPixels"); + } + } + glReadBuffer(prev_read); + vcheckGLcall("glReadBuffer"); + } + + if (BackBufferFormat != This->renderTarget->myDesc.Format && + StencilBufferFormat != This->stencilBufferTarget->myDesc.Format) { + nAttribs = 0; + PUSH2(GLX_PBUFFER_WIDTH, Width); + PUSH2(GLX_PBUFFER_HEIGHT, Height); + PUSH1(None); + This->drawable = glXCreatePbuffer(This->display, cfgs[0], attribs); + + This->render_ctx = glXCreateNewContext(This->display, cfgs[0], GLX_RGBA_TYPE, This->glCtx, TRUE); + if (NULL == This->render_ctx) { + ERR("cannot create glxContext\n"); + } + + glFlush(); + glXSwapBuffers(This->display, This->drawable); + if (glXMakeContextCurrent(This->display, This->drawable, This->drawable, This->render_ctx) == False) { + TRACE("Error in setting current context: context %p drawable %ld (default %ld)!\n", This->glCtx, This->drawable, This->win); + } + checkGLcall("glXMakeContextCurrent"); + } + + tmp = This->renderTarget; + This->renderTarget = (IDirect3DSurface8Impl*) RenderSurface; + IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) This->renderTarget); + IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8) tmp); + + tmp = This->stencilBufferTarget; + This->stencilBufferTarget = (IDirect3DSurface8Impl*) StencilSurface; + IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) This->stencilBufferTarget); + IDirect3DSurface8Impl_Release((LPDIRECT3DSURFACE8) tmp); + + return D3D_OK; + + } else { + ERR("cannot get valides GLXFBConfig for (%u,%s)/(%u,%s)\n", BackBufferFormat, debug_d3dformat(BackBufferFormat), StencilBufferFormat, debug_d3dformat(StencilBufferFormat)); + } + +#undef PUSH1 +#undef PUSH2 + +#endif + + return D3DERR_INVALIDCALL; +} Index: directx.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/directx.c,v retrieving revision 1.34 diff -u -r1.34 directx.c --- directx.c 17 May 2003 18:33:02 -0000 1.34 +++ directx.c 22 May 2003 22:24:16 -0000 @@ -85,18 +85,6 @@ D3DFMT_X8R8G8B8 }; -inline static int get_bpp_from_format(D3DFORMAT fmt) { - switch (fmt) { - case D3DFMT_P8: return 8; - case D3DFMT_R3G3B2: return 8; - case D3DFMT_R5G6B5: return 16; - case D3DFMT_X1R5G5B5: return 16; - case D3DFMT_X4R4G4B4: return 16; - case D3DFMT_R8G8B8: return 24; - case D3DFMT_X8R8G8B8: return 32; - default: return 16; - } -} /* retrieve the X display to use on a given DC */ inline static Display *get_display( HDC hdc ) @@ -415,33 +403,91 @@ pCaps->CursorCaps = 0; - pCaps->DevCaps = D3DDEVCAPS_DRAWPRIMTLVERTEX | D3DDEVCAPS_HWTRANSFORMANDLIGHT | D3DDEVCAPS_PUREDEVICE; - - pCaps->PrimitiveMiscCaps = D3DPMISCCAPS_CULLCCW | D3DPMISCCAPS_CULLCW | D3DPMISCCAPS_COLORWRITEENABLE | D3DPMISCCAPS_CLIPTLVERTS | - D3DPMISCCAPS_CLIPPLANESCALEDPOINTS | D3DPMISCCAPS_MASKZ; /*NOT: D3DPMISCCAPS_TSSARGTEMP*/ - pCaps->RasterCaps = D3DPRASTERCAPS_DITHER | D3DPRASTERCAPS_PAT; - pCaps->ZCmpCaps = D3DPCMPCAPS_ALWAYS | D3DPCMPCAPS_EQUAL | D3DPCMPCAPS_GREATER | D3DPCMPCAPS_GREATEREQUAL | - D3DPCMPCAPS_LESS | D3DPCMPCAPS_LESSEQUAL | D3DPCMPCAPS_NEVER | D3DPCMPCAPS_NOTEQUAL; + pCaps->DevCaps = D3DDEVCAPS_DRAWPRIMTLVERTEX | + D3DDEVCAPS_HWTRANSFORMANDLIGHT | + D3DDEVCAPS_PUREDEVICE; + + pCaps->PrimitiveMiscCaps = D3DPMISCCAPS_CULLCCW | + D3DPMISCCAPS_CULLCW | + D3DPMISCCAPS_COLORWRITEENABLE | + D3DPMISCCAPS_CLIPTLVERTS | + D3DPMISCCAPS_CLIPPLANESCALEDPOINTS | + D3DPMISCCAPS_MASKZ; + /*NOT: D3DPMISCCAPS_TSSARGTEMP*/ + + pCaps->RasterCaps = D3DPRASTERCAPS_DITHER | + D3DPRASTERCAPS_PAT | + D3DPRASTERCAPS_FOGRANGE; + /* FIXME Add: + D3DPRASTERCAPS_FOGVERTEX + D3DPRASTERCAPS_FOGTABLE + D3DPRASTERCAPS_MIPMAPLODBIAS + D3DPRASTERCAPS_ZBIAS + D3DPRASTERCAPS_ANISOTROPY + D3DPRASTERCAPS_WFOG + D3DPRASTERCAPS_ZFOG + D3DPRASTERCAPS_COLORPERSPECTIVE + D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE + D3DPRASTERCAPS_ANTIALIASEDGES + D3DPRASTERCAPS_ZBUFFERLESSHSR + D3DPRASTERCAPS_WBUFFER */ + + pCaps->ZCmpCaps = D3DPCMPCAPS_ALWAYS | + D3DPCMPCAPS_EQUAL | + D3DPCMPCAPS_GREATER | + D3DPCMPCAPS_GREATEREQUAL | + D3DPCMPCAPS_LESS | + D3DPCMPCAPS_LESSEQUAL | + D3DPCMPCAPS_NEVER | + D3DPCMPCAPS_NOTEQUAL; pCaps->SrcBlendCaps = 0xFFFFFFFF; /*FIXME: Tidy up later */ pCaps->DestBlendCaps = 0xFFFFFFFF; /*FIXME: Tidy up later */ pCaps->AlphaCmpCaps = 0xFFFFFFFF; /*FIXME: Tidy up later */ - pCaps->ShadeCaps = D3DPSHADECAPS_SPECULARGOURAUDRGB | D3DPSHADECAPS_COLORGOURAUDRGB ; - pCaps->TextureCaps = D3DPTEXTURECAPS_ALPHA | D3DPTEXTURECAPS_ALPHAPALETTE | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_MIPCUBEMAP | D3DPTEXTURECAPS_CUBEMAP_POW2 | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_VOLUMEMAP | D3DPTEXTURECAPS_MIPMAP; - pCaps->TextureFilterCaps = D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MAGFPOINT | D3DPTFILTERCAPS_MINFLINEAR | D3DPTFILTERCAPS_MINFPOINT | - D3DPTFILTERCAPS_MIPFLINEAR | D3DPTFILTERCAPS_MIPFPOINT ; + + pCaps->ShadeCaps = D3DPSHADECAPS_SPECULARGOURAUDRGB | + D3DPSHADECAPS_COLORGOURAUDRGB; + + pCaps->TextureCaps = D3DPTEXTURECAPS_ALPHA | + D3DPTEXTURECAPS_ALPHAPALETTE | + D3DPTEXTURECAPS_POW2 | + D3DPTEXTURECAPS_VOLUMEMAP | + D3DPTEXTURECAPS_MIPMAP; +#if defined(GL_VERSION_1_3) || defined(GL_ARB_texture_cube_map) + pCaps->TextureCaps |= D3DPTEXTURECAPS_CUBEMAP | + D3DPTEXTURECAPS_MIPCUBEMAP | + D3DPTEXTURECAPS_CUBEMAP_POW2; +#endif + + pCaps->TextureFilterCaps = D3DPTFILTERCAPS_MAGFLINEAR | + D3DPTFILTERCAPS_MAGFPOINT | + D3DPTFILTERCAPS_MINFLINEAR | + D3DPTFILTERCAPS_MINFPOINT | + D3DPTFILTERCAPS_MIPFLINEAR | + D3DPTFILTERCAPS_MIPFPOINT; + pCaps->CubeTextureFilterCaps = 0; pCaps->VolumeTextureFilterCaps = 0; - pCaps->TextureAddressCaps = D3DPTADDRESSCAPS_BORDER | D3DPTADDRESSCAPS_CLAMP | D3DPTADDRESSCAPS_WRAP; + + pCaps->TextureAddressCaps = D3DPTADDRESSCAPS_BORDER | + D3DPTADDRESSCAPS_CLAMP | + D3DPTADDRESSCAPS_WRAP; #if defined(GL_VERSION_1_3) pCaps->TextureAddressCaps |= D3DPTADDRESSCAPS_MIRROR; #endif + /* FIXME: Add + D3DPTADDRESSCAPS_BORDER + D3DPTADDRESSCAPS_MIRRORONCE */ + pCaps->VolumeTextureAddressCaps = 0; - pCaps->LineCaps = D3DLINECAPS_TEXTURE | D3DLINECAPS_ZTEST; + pCaps->LineCaps = D3DLINECAPS_TEXTURE | + D3DLINECAPS_ZTEST; + /* FIXME: Add + D3DLINECAPS_BLEND + D3DLINECAPS_ALPHACMP + D3DLINECAPS_FOG */ - /*pCaps->MaxTextureWidth = 16384; - pCaps->MaxTextureHeight = 16384;*/ { GLint gl_tex_size; glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gl_tex_size); @@ -453,7 +499,6 @@ pCaps->MaxTextureRepeat = 32768; pCaps->MaxTextureAspectRatio = 32768; - pCaps->MaxAnisotropy = 0; pCaps->MaxVertexW = 1.0; pCaps->GuardBandLeft = 0; @@ -463,26 +508,52 @@ pCaps->ExtentsAdjust = 0; - pCaps->StencilCaps = D3DSTENCILCAPS_DECRSAT | D3DSTENCILCAPS_INCRSAT | - D3DSTENCILCAPS_INVERT | D3DSTENCILCAPS_KEEP | - D3DSTENCILCAPS_REPLACE | D3DSTENCILCAPS_ZERO /* | D3DSTENCILCAPS_DECR | D3DSTENCILCAPS_INCR */; + pCaps->StencilCaps = D3DSTENCILCAPS_DECRSAT | + D3DSTENCILCAPS_INCRSAT | + D3DSTENCILCAPS_INVERT | + D3DSTENCILCAPS_KEEP | + D3DSTENCILCAPS_REPLACE | + D3DSTENCILCAPS_ZERO; + /* FIXME: Add + D3DSTENCILCAPS_DECR + D3DSTENCILCAPS_INCR */ pCaps->FVFCaps = D3DFVFCAPS_PSIZE | 0x80000; - pCaps->TextureOpCaps = D3DTEXOPCAPS_ADD | D3DTEXOPCAPS_ADDSIGNED | D3DTEXOPCAPS_ADDSIGNED2X | - D3DTEXOPCAPS_MODULATE | D3DTEXOPCAPS_MODULATE2X | D3DTEXOPCAPS_MODULATE4X | - D3DTEXOPCAPS_SELECTARG1 | D3DTEXOPCAPS_SELECTARG2 | D3DTEXOPCAPS_DISABLE; + pCaps->TextureOpCaps = D3DTEXOPCAPS_ADD | + D3DTEXOPCAPS_ADDSIGNED | + D3DTEXOPCAPS_ADDSIGNED2X | + D3DTEXOPCAPS_MODULATE | + D3DTEXOPCAPS_MODULATE2X | + D3DTEXOPCAPS_MODULATE4X | + D3DTEXOPCAPS_SELECTARG1 | + D3DTEXOPCAPS_SELECTARG2 | + D3DTEXOPCAPS_DISABLE; #if defined(GL_VERSION_1_3) - pCaps->TextureOpCaps |= D3DTEXOPCAPS_DOTPRODUCT3 | D3DTEXOPCAPS_SUBTRACT; + pCaps->TextureOpCaps |= D3DTEXOPCAPS_DOTPRODUCT3 | + D3DTEXOPCAPS_SUBTRACT; #endif - /* FIXME: Add D3DTEXOPCAPS_ADDSMOOTH D3DTEXOPCAPS_BLENDCURRENTALPHA D3DTEXOPCAPS_BLENDDIFFUSEALPHA D3DTEXOPCAPS_BLENDFACTORALPHA - D3DTEXOPCAPS_BLENDTEXTUREALPHA D3DTEXOPCAPS_BLENDTEXTUREALPHAPM D3DTEXOPCAPS_BUMPENVMAP D3DTEXOPCAPS_BUMPENVMAPLUMINANCE - D3DTEXOPCAPS_LERP D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA - D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA D3DTEXOPCAPS_MULTIPLYADD - D3DTEXOPCAPS_PREMODULATE */ + /* FIXME: Add + D3DTEXOPCAPS_ADDSMOOTH + D3DTEXOPCAPS_BLENDCURRENTALPHA + D3DTEXOPCAPS_BLENDDIFFUSEALPHA + D3DTEXOPCAPS_BLENDFACTORALPHA + D3DTEXOPCAPS_BLENDTEXTUREALPHA + D3DTEXOPCAPS_BLENDTEXTUREALPHAPM + D3DTEXOPCAPS_BUMPENVMAP + D3DTEXOPCAPS_BUMPENVMAPLUMINANCE + D3DTEXOPCAPS_LERP + D3DTEXOPCAPS_MODULATEALPHA_ADDCOLOR + D3DTEXOPCAPS_MODULATECOLOR_ADDALPHA + D3DTEXOPCAPS_MODULATEINVALPHA_ADDCOLOR + D3DTEXOPCAPS_MODULATEINVCOLOR_ADDALPHA + D3DTEXOPCAPS_MULTIPLYADD + D3DTEXOPCAPS_PREMODULATE */ { GLint gl_max; + GLfloat gl_float; + #if defined(GL_VERSION_1_3) glGetIntegerv(GL_MAX_TEXTURE_UNITS, &gl_max); #else @@ -499,14 +570,34 @@ glGetIntegerv(GL_MAX_LIGHTS, &gl_max); pCaps->MaxActiveLights = min(MAX_ACTIVE_LIGHTS, gl_max); TRACE("GLCaps: GL_MAX_LIGHTS=%ld\n", pCaps->MaxActiveLights); - } - pCaps->VertexProcessingCaps = D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_TEXGEN; +#if defined(GL_ARB_vertex_blend) + glGetIntegerv(GL_MAX_VERTEX_UNITS_ARB, &gl_max); + pCaps->MaxVertexBlendMatrices = gl_max; + pCaps->MaxVertexBlendMatrixIndex = 1; +#else + pCaps->MaxVertexBlendMatrices = 0; + pCaps->MaxVertexBlendMatrixIndex = 1; +#endif + +#if defined(GL_EXT_texture_filter_anisotropic) + glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &gl_max); + pCaps->MaxAnisotropy = gl_max; +#else + pCaps->MaxAnisotropy = 0; +#endif - pCaps->MaxVertexBlendMatrices = 1; - pCaps->MaxVertexBlendMatrixIndex = 1; + glGetFloatv(GL_POINT_SIZE_RANGE, &gl_float); + pCaps->MaxPointSize = gl_float; + } - pCaps->MaxPointSize = 128.0; + pCaps->VertexProcessingCaps = D3DVTXPCAPS_DIRECTIONALLIGHTS | + D3DVTXPCAPS_MATERIALSOURCE7 | + D3DVTXPCAPS_POSITIONALLIGHTS | + D3DVTXPCAPS_TEXGEN; + /* FIXME: Add + D3DVTXPCAPS_LOCALVIEWER + D3DVTXPCAPS_TWEENING */ pCaps->MaxPrimitiveCount = 0xFFFFFFFF; pCaps->MaxVertexIndex = 0xFFFFFFFF; @@ -718,24 +809,39 @@ pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight, pPresentationParameters->BackBufferFormat, - D3DMULTISAMPLE_NONE, TRUE, + pPresentationParameters->MultiSampleType, + TRUE, (LPDIRECT3DSURFACE8*) &object->frontBuffer); IDirect3DDevice8Impl_CreateRenderTarget((LPDIRECT3DDEVICE8) object, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight, pPresentationParameters->BackBufferFormat, - D3DMULTISAMPLE_NONE, TRUE, + pPresentationParameters->MultiSampleType, + TRUE, (LPDIRECT3DSURFACE8*) &object->backBuffer); - if (pPresentationParameters->EnableAutoDepthStencil) - IDirect3DDevice8Impl_CreateDepthStencilSurface((LPDIRECT3DDEVICE8) object, - pPresentationParameters->BackBufferWidth, - pPresentationParameters->BackBufferHeight, - pPresentationParameters->AutoDepthStencilFormat, - D3DMULTISAMPLE_NONE, - (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer); - + if (pPresentationParameters->EnableAutoDepthStencil) { + IDirect3DDevice8Impl_CreateDepthStencilSurface((LPDIRECT3DDEVICE8) object, + pPresentationParameters->BackBufferWidth, + pPresentationParameters->BackBufferHeight, + pPresentationParameters->AutoDepthStencilFormat, + D3DMULTISAMPLE_NONE, + (LPDIRECT3DSURFACE8*) &object->depthStencilBuffer); + } else { + object->depthStencilBuffer = NULL; + } + + /* init the default renderTarget management */ + object->drawable = object->win; + object->render_ctx = object->glCtx; + object->renderTarget = object->frontBuffer; + IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) object->renderTarget); + object->stencilBufferTarget = object->depthStencilBuffer; + if (NULL != object->stencilBufferTarget) + IDirect3DSurface8Impl_AddRef((LPDIRECT3DSURFACE8) object->stencilBufferTarget); + + /* Now override the surface's Flip method (if in double buffering) ?COPIED from DDRAW!? ((x11_ds_private *) surface->private)->opengl_flip = TRUE; { @@ -768,25 +874,29 @@ checkGLcall("glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE);"); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT); - checkGLcall("glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);"); + checkGLcall("glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);"); - /* Initialize openGL extension related variables */ - object->isMultiTexture = FALSE; - object->isDot3 = FALSE; - object->TextureUnits = 1; + /* + * Initialize openGL extension related variables + * with Default values + */ + memset(&This->gl_info.supported, 0, sizeof(This->gl_info.supported)); + This->gl_info.max_textures = 1; + This->gl_info.vs_arb_version = VS_VERSION_NOT_SUPPORTED; + This->gl_info.vs_nv_version = VS_VERSION_NOT_SUPPORTED; /* Retrieve opengl defaults */ glGetIntegerv(GL_MAX_CLIP_PLANES, &gl_max); - object->clipPlanes = min(MAX_CLIPPLANES, gl_max); + This->gl_info.max_clipplanes = min(MAX_CLIPPLANES, gl_max); TRACE("ClipPlanes support - num Planes=%d\n", gl_max); glGetIntegerv(GL_MAX_LIGHTS, &gl_max); - object->maxLights = min(MAX_ACTIVE_LIGHTS, gl_max); + This->gl_info.max_lights = min(MAX_ACTIVE_LIGHTS, gl_max); TRACE("Lights support - max lights=%d\n", gl_max); /* Parse the gl supported features, in theory enabling parts of our code appropriately */ GL_Extensions = glGetString(GL_EXTENSIONS); - TRACE("GL_Extensions reported:\n"); + FIXME("GL_Extensions reported:\n"); if (NULL == GL_Extensions) { ERR(" GL_Extensions returns NULL\n"); @@ -800,17 +910,78 @@ GL_Extensions++; } memcpy(ThisExtn, Start, (GL_Extensions - Start)); - TRACE (" %s\n", ThisExtn); + FIXME("- %s\n", ThisExtn); + + /** + * ARB + */ + if (strcmp(ThisExtn, "GL_ARB_multisample") == 0) { + FIXME(" FOUND: ARB Multisample support\n"); + This->gl_info.supported[ARB_MULTISAMPLE] = TRUE; + } else if (strcmp(ThisExtn, "GL_ARB_multitexture") == 0) { + glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max); + FIXME(" FOUND: ARB Multitexture support - GL_MAX_TEXTURE_UNITS_ARB=%u\n", gl_max); + This->gl_info.supported[ARB_MULTITEXTURE] = TRUE; + This->gl_info.max_textures = min(8, gl_max); + } else if (strcmp(ThisExtn, "GL_ARB_texture_cube_map") == 0) { + FIXME(" FOUND: ARB Texture Cube Map support\n"); + This->gl_info.supported[ARB_TEXTURE_CUBE_MAP] = TRUE; + } else if (strcmp(ThisExtn, "GL_ARB_texture_compression") == 0) { + FIXME(" FOUND: ARB Texture Compression support\n"); + This->gl_info.supported[ARB_TEXTURE_COMPRESSION] = TRUE; + } else if (strcmp(ThisExtn, "GL_ARB_texture_env_dot3") == 0) { + FIXME(" FOUND: EXT Dot3 support\n"); + This->gl_info.supported[ARB_TEXTURE_ENV_DOT3] = TRUE; + } else if (strstr(ThisExtn, "GL_ARB_vertex_program")) { + This->gl_info.vs_arb_version = VS_VERSION_11; + FIXME(" FOUND: ARB Vertex Shader support - version=%02x\n", This->gl_info.vs_arb_version); + This->gl_info.supported[ARB_VERTEX_PROGRAM] = TRUE; + + /** + * EXT + */ + } else if (strcmp(ThisExtn, "GL_EXT_fog_coord") == 0) { + FIXME(" FOUND: EXT Fog coord support\n"); + This->gl_info.supported[EXT_FOG_COORD] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_paletted_texture") == 0) { + /* handle paletted texture extensions */ + FIXME(" FOUND: EXT Paletted texture support\n"); + This->gl_info.supported[EXT_PALETTED_TEXTURE] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_secondary_color") == 0) { + FIXME(" FOUND: EXT Secondary coord support\n"); + This->gl_info.supported[EXT_SECONDARY_COLOR] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_texture_compression_s3tc") == 0) { + FIXME(" FOUND: EXT Texture S3TC compression support\n"); + This->gl_info.supported[EXT_TEXTURE_COMPRESSION_S3TC] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_texture_lod") == 0) { + FIXME(" FOUND: EXT Texture LOD support\n"); + This->gl_info.supported[EXT_TEXTURE_LOD] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_texture_lod_bias") == 0) { + FIXME(" FOUND: EXT Texture LOD bias support\n"); + This->gl_info.supported[EXT_TEXTURE_LOD_BIAS] = TRUE; + } else if (strcmp(ThisExtn, "GL_EXT_vertex_weighting") == 0) { + FIXME(" FOUND: EXT Vertex weighting support\n"); + This->gl_info.supported[EXT_VERTEX_WEIGHTING] = TRUE; + + /** + * NVIDIA + */ + } else if (strstr(ThisExtn, "GL_NV_vertex_program")) { + This->gl_info.vs_nv_version = max(This->gl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program1_1")) ? VS_VERSION_11 : VS_VERSION_10); + This->gl_info.vs_nv_version = max(This->gl_info.vs_nv_version, (0 == strcmp(ThisExtn, "GL_NV_vertex_program2")) ? VS_VERSION_20 : VS_VERSION_10); + FIXME(" FOUND: NVIDIA (NV) Vertex Shader support - version=%02x\n", This->gl_info.vs_nv_version); + This->gl_info.supported[NV_VERTEX_PROGRAM] = TRUE; + + /** + * ATI + */ + /** TODO */ + } else if (strcmp(ThisExtn, "GL_EXT_vertex_shader") == 0) { + This->gl_info.vs_ati_version = VS_VERSION_11; + FIXME(" FOUND: ATI (EXT) Vertex Shader support - version=%02x\n", This->gl_info.vs_ati_version); + This->gl_info.supported[EXT_VERTEX_SHADER] = TRUE; + } - if (strcmp(ThisExtn, "GL_ARB_multitexture") == 0) { - glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max); - object->isMultiTexture = TRUE; - object->TextureUnits = min(8, gl_max); - TRACE("FOUND: Multitexture support - GL_MAX_TEXTURE_UNITS_ARB=%d\n", gl_max); - } else if (strcmp(ThisExtn, "GL_EXT_texture_env_dot3") == 0) { - object->isDot3 = TRUE; - TRACE("FOUND: Dot3 support\n"); - } if (*GL_Extensions == ' ') GL_Extensions++; } @@ -831,7 +1002,7 @@ GLX_Extensions++; } memcpy(ThisExtn, Start, (GLX_Extensions - Start)); - TRACE (" %s\n", ThisExtn); + TRACE ("- %s\n", ThisExtn); if (*GLX_Extensions == ' ') GLX_Extensions++; } } Index: resource.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/resource.c,v retrieving revision 1.5 diff -u -r1.5 resource.c --- resource.c 17 May 2003 18:33:02 -0000 1.5 +++ resource.c 22 May 2003 22:24:16 -0000 @@ -101,6 +101,30 @@ return This->ResourceType; } +D3DPOOL WINAPI IDirect3DResource8Impl_GetPool(LPDIRECT3DRESOURCE8 iface) { + ICOM_THIS(IDirect3DResource8Impl,iface); + + switch (This->ResourceType) { + case D3DRTYPE_SURFACE: + return ((IDirect3DSurface8Impl*) This)->myDesc.Pool; + case D3DRTYPE_TEXTURE: + return ((IDirect3DTexture8Impl*) This)->surfaces[0]->myDesc.Pool; + case D3DRTYPE_VOLUME: + return ((IDirect3DVolume8Impl*) This)->myDesc.Pool; + case D3DRTYPE_VOLUMETEXTURE: + return ((IDirect3DVolumeTexture8Impl*) This)->volumes[0]->myDesc.Pool; + case D3DRTYPE_CUBETEXTURE: + return ((IDirect3DCubeTexture8Impl*) This)->surfaces[0][0]->myDesc.Pool; + case D3DRTYPE_VERTEXBUFFER: + return ((IDirect3DVertexBuffer8Impl*) This)->currentDesc.Pool; + case D3DRTYPE_INDEXBUFFER: + return ((IDirect3DIndexBuffer8Impl*) This)->currentDesc.Pool; + default: + FIXME("(%p) Unrecognized type(%d,%s)\n", This, This->ResourceType, debug_d3dressourcetype(This->ResourceType)); + return D3DPOOL_DEFAULT; + } +} + ICOM_VTABLE(IDirect3DResource8) Direct3DResource8_Vtbl = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE Index: shader.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/shader.c,v retrieving revision 1.11 diff -u -r1.11 shader.c --- shader.c 17 May 2003 18:33:02 -0000 1.11 +++ shader.c 22 May 2003 22:24:16 -0000 @@ -593,6 +593,7 @@ TRACE_VECTOR(vshader->data->C[6]); TRACE_VECTOR(vshader->data->C[7]); TRACE_VECTOR(vshader->data->C[8]); + TRACE_VECTOR(vshader->data->C[64]); TRACE_VECTOR(input->V[D3DVSDE_POSITION]); TRACE_VECTOR(input->V[D3DVSDE_BLENDWEIGHT]); TRACE_VECTOR(input->V[D3DVSDE_BLENDINDICES]); Index: stateblock.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/stateblock.c,v retrieving revision 1.5 diff -u -r1.5 stateblock.c --- stateblock.c 17 May 2003 18:33:02 -0000 1.5 +++ stateblock.c 22 May 2003 22:24:16 -0000 @@ -154,7 +154,7 @@ IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_NORMALORDER, D3DORDER_LINEAR); /* Texture Stage States - Put directly into state block, we will call function below */ - for (i = 0; i < This->TextureUnits; i++) { + for (i = 0; i < GL_LIMITS(textures); i++) { memcpy(&This->StateBlock->transforms[D3DTS_TEXTURE0 + i], &idmatrix, sizeof(idmatrix)); This->StateBlock->texture_state[i][D3DTSS_COLOROP ] = (i==0)? D3DTOP_MODULATE : D3DTOP_DISABLE; This->StateBlock->texture_state[i][D3DTSS_COLORARG1 ] = D3DTA_TEXTURE; @@ -191,7 +191,7 @@ texture stage, but disable all stages by default. Hence if a stage is enabled then the default texture will kick in until replaced by a SetTexture call */ - for (i = 0; i < This->TextureUnits; i++) { + for (i = 0; i < GL_LIMITS(textures); i++) { GLubyte white = 255; /* Note this avoids calling settexture, so pretend it has been called */ @@ -200,7 +200,7 @@ This->StateBlock->textures[i] = NULL; /* Make appropriate texture active */ - if (This->isMultiTexture) { + if (GL_SUPPORT(ARB_MULTITEXTURE)) { #if defined(GL_VERSION_1_3) glActiveTexture(GL_TEXTURE0 + i); #else @@ -289,7 +289,7 @@ for (i = 0; i < NUM_SAVEDPIXELSTATES_R; i++) { object->Changed.renderstate[SavedPixelStates_R[i]] = TRUE; } - for (j = 0; j < This->TextureUnits; i++) { + for (j = 0; j < GL_LIMITS(textures); i++) { for (i = 0; i < NUM_SAVEDPIXELSTATES_T; i++) { object->Changed.texture_state[j][SavedPixelStates_T[i]] = TRUE; } @@ -304,12 +304,12 @@ for (i = 0; i < NUM_SAVEDVERTEXSTATES_R; i++) { object->Changed.renderstate[SavedVertexStates_R[i]] = TRUE; } - for (j = 0; j < This->TextureUnits; i++) { + for (j = 0; j < GL_LIMITS(textures); i++) { for (i = 0; i < NUM_SAVEDVERTEXSTATES_T; i++) { object->Changed.texture_state[j][SavedVertexStates_T[i]] = TRUE; } } - for (i = 0; i < This->maxLights; i++) { + for (i = 0; i < GL_LIMITS(lights); i++) { object->Changed.lightEnable[i] = TRUE; object->Changed.lights[i] = TRUE; } @@ -385,7 +385,7 @@ if (pSB->blockType == D3DSBT_RECORDED || pSB->blockType == D3DSBT_ALL || pSB->blockType == D3DSBT_VERTEXSTATE) { - for (i = 0; i < This->maxLights; i++) { + for (i = 0; i < GL_LIMITS(lights); i++) { if (pSB->Set.lightEnable[i] && pSB->Changed.lightEnable[i]) IDirect3DDevice8Impl_LightEnable(iface, i, pSB->lightEnable[i]); @@ -428,7 +428,7 @@ IDirect3DDevice8Impl_SetStreamSource(iface, i, pSB->stream_source[i], pSB->stream_stride[i]); } - for (i = 0; i < This->clipPlanes; i++) { + for (i = 0; i < GL_LIMITS(clipplanes); i++) { if (pSB->Set.clipplane[i] && pSB->Changed.clipplane[i]) { float clip[4]; @@ -447,7 +447,7 @@ } /* Texture */ - for (j = 0; j < This->TextureUnits; j++) { + for (j = 0; j < GL_LIMITS(textures); j++) { for (i = 0; i < HIGHEST_TEXTURE_STATE; i++) { if (pSB->Set.texture_state[j][i] && pSB->Changed.texture_state[j][i]) { IDirect3DDevice8Impl_SetTextureStageState(iface, j, i, pSB->texture_state[j][i]); @@ -467,7 +467,7 @@ } - for (j = 0; j < This->TextureUnits; i++) { + for (j = 0; j < GL_LIMITS(textures); i++) { for (i = 0; i < NUM_SAVEDPIXELSTATES_T; i++) { if (pSB->Set.texture_state[j][SavedPixelStates_T[i]] && pSB->Changed.texture_state[j][SavedPixelStates_T[i]]) @@ -482,7 +482,7 @@ IDirect3DDevice8Impl_SetRenderState(iface, SavedVertexStates_R[i], pSB->renderstate[SavedVertexStates_R[i]]); } - for (j = 0; j < This->TextureUnits; i++) { + for (j = 0; j < GL_LIMITS(textures); i++) { for (i = 0; i < NUM_SAVEDVERTEXSTATES_T; i++) { if (pSB->Set.texture_state[j][SavedVertexStates_T[i]] && pSB->Changed.texture_state[j][SavedVertexStates_T[i]]) @@ -526,7 +526,7 @@ /* TODO: Vertex Shader Constants */ - for (i = 0; i < This->maxLights; i++) { + for (i = 0; i < GL_LIMITS(lights); i++) { if (updateBlock->Set.lightEnable[i] && This->StateBlock->lightEnable[i] != updateBlock->lightEnable[i]) { TRACE("Updating light enable for light %d to %d\n", i, This->StateBlock->lightEnable[i]); updateBlock->lightEnable[i] = This->StateBlock->lightEnable[i]; @@ -591,7 +591,7 @@ } } - for (i = 0; i < This->clipPlanes; i++) { + for (i = 0; i < GL_LIMITS(clipplanes); i++) { if (updateBlock->Set.clipplane[i] && memcmp(&This->StateBlock->clipplane[i], &updateBlock->clipplane[i], sizeof(updateBlock->clipplane)) != 0) { @@ -613,7 +613,7 @@ } /* Texture */ - for (j = 0; j < This->TextureUnits; j++) { + for (j = 0; j < GL_LIMITS(textures); j++) { for (i = 0; i < HIGHEST_TEXTURE_STATE; i++) { if (updateBlock->Set.texture_state[j][i] && (updateBlock->texture_state[j][i] != Index: surface.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/surface.c,v retrieving revision 1.9 diff -u -r1.9 surface.c --- surface.c 17 May 2003 18:33:02 -0000 1.9 +++ surface.c 22 May 2003 22:24:16 -0000 @@ -131,11 +131,13 @@ return D3DERR_INVALIDCALL; } - if (This == This->Device->backBuffer || This == This->Device->frontBuffer || This->Device->depthStencilBuffer) { + if (This == This->Device->backBuffer || This == This->Device->renderTarget || This == This->Device->frontBuffer || This->Device->depthStencilBuffer) { if (This == This->Device->backBuffer) { TRACE("(%p, backBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory); } else if (This == This->Device->frontBuffer) { TRACE("(%p, frontBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory); + } else if (This == This->Device->renderTarget) { + TRACE("(%p, renderTarget) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory); } else if (This == This->Device->depthStencilBuffer) { TRACE("(%p, stencilBuffer) : rect@%p flags(%08lx), output lockedRect@%p, memory@%p\n", This, pRect, Flags, pLockedRect, This->allocatedMemory); } @@ -167,7 +169,7 @@ } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */ - if (This == This->Device->backBuffer || This == This->Device->frontBuffer) { + if (This == This->Device->backBuffer || This == This->Device->renderTarget || This == This->Device->frontBuffer) { GLint prev_store; GLenum prev_read; @@ -188,84 +190,13 @@ if (This == This->Device->backBuffer) { glReadBuffer(GL_BACK); - } else if (This == This->Device->frontBuffer) { + } else if (This == This->Device->frontBuffer || This == This->Device->renderTarget) { glReadBuffer(GL_FRONT); + } else if (This == This->Device->depthStencilBuffer) { + ERR("Stencil Buffer lock unsupported for now\n"); } vcheckGLcall("glReadBuffer"); - /** TODO: use an enhanced version of fmt2glintFmt here instad this switch */ -#if 0 - switch (This->myDesc.Format) { - case D3DFMT_R5G6B5: - { - /* - glReadPixels(This->lockedRect.left, This->lockedRect.top, - This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pLockedRect->pBits); - vcheckGLcall("glReadPixels"); - */ - long j; - for (j = This->lockedRect.top; j < This->lockedRect.bottom - This->lockedRect.top; ++j) { - glReadPixels(This->lockedRect.left, - This->lockedRect.bottom - j - 1, - This->lockedRect.right - This->lockedRect.left, - 1, - GL_RGB, GL_UNSIGNED_SHORT_5_6_5, pLockedRect->pBits); - vcheckGLcall("glReadPixels"); - } - } - break; - case D3DFMT_R8G8B8: - { - /* - glReadPixels(This->lockedRect.left, This->lockedRect.top, - This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top, - GL_RGB, GL_UNSIGNED_BYTE, pLockedRect->pBits); - vcheckGLcall("glReadPixels"); - */ - long j; - for (j = This->lockedRect.top; j < This->lockedRect.bottom - This->lockedRect.top; ++j) { - glReadPixels(This->lockedRect.left, - This->lockedRect.bottom - j - 1, - This->lockedRect.right - This->lockedRect.left, - 1, - GL_RGB, GL_UNSIGNED_BYTE, pLockedRect->pBits); - vcheckGLcall("glReadPixels"); - } - } - break; - case D3DFMT_A8R8G8B8: - { - /* - glPixelStorei(GL_PACK_SWAP_BYTES, TRUE); - vcheckGLcall("glPixelStorei"); - glReadPixels(This->lockedRect.left, This->lockedRect.top, - This->lockedRect.right - This->lockedRect.left, This->lockedRect.bottom - This->lockedRect.top, - GL_BGRA, GL_UNSIGNED_BYTE, pLockedRect->pBits); - vcheckGLcall("glReadPixels"); - glPixelStorei(GL_PACK_SWAP_BYTES, prev_store); - vcheckGLcall("glPixelStorei"); - */ - long j; - glPixelStorei(GL_PACK_SWAP_BYTES, TRUE); - vcheckGLcall("glPixelStorei"); - for (j = This->lockedRect.top; j < This->lockedRect.bottom - This->lockedRect.top; ++j) { - glReadPixels(This->lockedRect.left, - This->lockedRect.bottom - j - 1, - This->lockedRect.right - This->lockedRect.left, - 1, - GL_BGRA, GL_UNSIGNED_BYTE, pLockedRect->pBits); - vcheckGLcall("glReadPixels"); - } - glPixelStorei(GL_PACK_SWAP_BYTES, prev_store); - vcheckGLcall("glPixelStorei"); - } - break; - default: - FIXME("Unsupported Format %u in locking func\n", This->myDesc.Format); - } -#endif - { long j; for (j = This->lockedRect.top; j < This->lockedRect.bottom - This->lockedRect.top; ++j) { @@ -273,7 +204,9 @@ This->lockedRect.bottom - j - 1, This->lockedRect.right - This->lockedRect.left, 1, - fmt2glFmt(This->myDesc.Format), fmt2glType(This->myDesc.Format), pLockedRect->pBits); + D3DFmt2GLFmt(This->myDesc.Format), + D3DFmt2GLType(This->myDesc.Format), + pLockedRect->pBits); vcheckGLcall("glReadPixels"); } } @@ -307,6 +240,8 @@ hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont); if (SUCCEEDED(hr) && NULL != cont) { + IDirect3DBaseTexture8Impl_SetDirty(cont, TRUE); +#if 0 /* Now setup the texture appropraitly */ D3DRESOURCETYPE containerType = IDirect3DBaseTexture8Impl_GetType(cont); if (containerType == D3DRTYPE_TEXTURE) { @@ -318,6 +253,7 @@ } else { FIXME("Set dirty on container type %d\n", containerType); } +#endif IDirect3DBaseTexture8_Release(cont); cont = NULL; } @@ -356,29 +292,10 @@ } if (0 == This->myDesc.Usage) { /* classic surface */ -#if 0 - if (This->Container) { - HRESULT hr; - IDirect3DBaseTexture8* cont = NULL; - hr = IUnknown_QueryInterface(This->Container, &IID_IDirect3DBaseTexture8, (void**) &cont); - - if (SUCCEEDED(hr) && NULL != cont) { - /* Now setup the texture appropraitly */ - int containerType = IDirect3DBaseTexture8Impl_GetType(cont); - if (containerType == D3DRTYPE_TEXTURE) { - IDirect3DTexture8Impl *pTexture = (IDirect3DTexture8Impl *)cont; - pTexture->Dirty = TRUE; - } else if (containerType == D3DRTYPE_CUBETEXTURE) { - IDirect3DCubeTexture8Impl *pTexture = (IDirect3DCubeTexture8Impl *)cont; - pTexture->Dirty = TRUE; - } else { - FIXME("Set dirty on container type %d\n", containerType); - } - IDirect3DBaseTexture8_Release(cont); - cont = NULL; - } - } -#endif + /** + * nothing to do + * waiting to reload the surface via IDirect3DDevice8::UpdateTexture + */ } else if (D3DUSAGE_RENDERTARGET & This->myDesc.Usage) { /* render surfaces */ if (This == This->Device->backBuffer || This == This->Device->frontBuffer) { @@ -441,6 +358,9 @@ glRasterPos3iv(&prev_rasterpos[0]); vcheckGLcall("glRasterPos3iv"); LEAVE_GL(); + + This->Dirty = FALSE; + } else { FIXME("unsupported unlocking to Rendering surface surf@%p usage(%lu)\n", This, This->myDesc.Usage); } @@ -462,7 +382,6 @@ return D3D_OK; } - ICOM_VTABLE(IDirect3DSurface8) Direct3DSurface8_Vtbl = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE @@ -478,3 +397,80 @@ IDirect3DSurface8Impl_LockRect, IDirect3DSurface8Impl_UnlockRect, }; + +HRESULT WINAPI IDirect3DSurface8Impl_CreateGLTexture(LPDIRECT3DSURFACE8 iface, GLenum gl_target, GLenum gl_level) { + ICOM_THIS(IDirect3DSurface8Impl,iface); + + + if ((This->myDesc.Format == D3DFMT_P8 || This->myDesc.Format == D3DFMT_A8P8) && + !GL_SUPPORT_DEV(EXT_PALETTED_TEXTURE, This->Device)) { + /** + * wanted a paletted texture and not really support it in HW + * so software emulation code begin + */ + UINT i; + PALETTEENTRY* pal = This->Device->palettes[This->Device->currentPalette]; + VOID* surface = (VOID*) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, This->myDesc.Width * This->myDesc.Height * sizeof(DWORD)); + BYTE* dst = (BYTE*) surface; + BYTE* src = (BYTE*) This->allocatedMemory; + + for (i = 0; i < This->myDesc.Width * This->myDesc.Height; i++) { + BYTE color = *src++; + *dst++ = pal[color].peRed; + *dst++ = pal[color].peGreen; + *dst++ = pal[color].peBlue; + if (This->myDesc.Format == D3DFMT_A8P8) + *dst++ = pal[color].peFlags; + else + *dst++ = 0xFF; + } + + TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n", + gl_target, + gl_level, + GL_RGBA, + This->myDesc.Width, + This->myDesc.Height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + surface); + glTexImage2D(gl_target, + gl_level, + GL_RGBA, + This->myDesc.Width, + This->myDesc.Height, + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + surface); + checkGLcall("glTexImage2D"); + HeapFree(GetProcessHeap(), 0, surface); + + return D3D_OK; + } + + TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n", + gl_target, + gl_level, + D3DFmt2GLIntFmt(This->myDesc.Format), + This->myDesc.Width, + This->myDesc.Height, + 0, + D3DFmt2GLFmt(This->myDesc.Format), + D3DFmt2GLType(This->myDesc.Format), + This->allocatedMemory); + glTexImage2D(gl_target, + gl_level, + D3DFmt2GLIntFmt(This->myDesc.Format), + This->myDesc.Width, + This->myDesc.Height, + 0, + D3DFmt2GLFmt(This->myDesc.Format), + D3DFmt2GLType(This->myDesc.Format), + This->allocatedMemory); + checkGLcall("glTexImage2D"); + + + return D3D_OK; +} Index: swapchain.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/swapchain.c,v retrieving revision 1.4 diff -u -r1.4 swapchain.c --- swapchain.c 11 May 2003 03:35:27 -0000 1.4 +++ swapchain.c 22 May 2003 22:24:16 -0000 @@ -74,7 +74,6 @@ return D3D_OK; } - ICOM_VTABLE(IDirect3DSwapChain8) Direct3DSwapChain8_Vtbl = { ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE Index: texture.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/texture.c,v retrieving revision 1.8 diff -u -r1.8 texture.c --- texture.c 17 May 2003 18:33:02 -0000 1.8 +++ texture.c 22 May 2003 22:24:16 -0000 @@ -133,22 +133,30 @@ checkGLcall("glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, This->levels)"); } - TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%lx, Mem=%p\n", - GL_TEXTURE_2D, i, fmt2glintFmt(This->format), - This->surfaces[i]->myDesc.Width, This->surfaces[i]->myDesc.Height, - 0, fmt2glFmt(This->format), fmt2glType(This->format), + + IDirect3DSurface8Impl_CreateGLTexture((LPDIRECT3DSURFACE8) This->surfaces[i], GL_TEXTURE_2D, i); +#if 0 + TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n", + GL_TEXTURE_2D, + i, + D3DFmt2GLIntFmt(This->format), + This->surfaces[i]->myDesc.Width, + This->surfaces[i]->myDesc.Height, + 0, + D3DFmt2GLFmt(This->format), + D3DFmt2GLType(This->format), This->surfaces[i]->allocatedMemory); glTexImage2D(GL_TEXTURE_2D, i, - fmt2glintFmt(This->format), + D3DFmt2GLIntFmt(This->format), This->surfaces[i]->myDesc.Width, This->surfaces[i]->myDesc.Height, 0, - fmt2glFmt(This->format), - fmt2glType(This->format), + D3DFmt2GLFmt(This->format), + D3DFmt2GLType(This->format), This->surfaces[i]->allocatedMemory); checkGLcall("glTexImage2D"); - +#endif /* Removed glTexParameterf now TextureStageStates are initialized at startup */ This->Dirty = FALSE; } @@ -202,20 +210,27 @@ ICOM_THIS(IDirect3DTexture8Impl,iface); TRACE("(%p) Level (%d)\n", This, Level); if (Level < This->levels) { - /** - * Not dirtified while Surfaces don't notify dirtification - * This->Dirty = TRUE; - */ - hr = IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) This->surfaces[Level], pLockedRect, pRect, Flags); - TRACE("(%p) Level (%d) success(%lu)\n", This, Level, hr); + /** + * Not dirtified while Surfaces don't notify dirtification + * This->Dirty = TRUE; + */ + hr = IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) This->surfaces[Level], pLockedRect, pRect, Flags); + TRACE("(%p) Level (%d) success(%lu)\n", This, Level, hr); } else { FIXME("Levels seems too high?!!\n"); } return hr; } HRESULT WINAPI IDirect3DTexture8Impl_UnlockRect(LPDIRECT3DTEXTURE8 iface, UINT Level) { + HRESULT hr; ICOM_THIS(IDirect3DTexture8Impl,iface); - TRACE("(%p) : stub\n", This); + TRACE("(%p) Level (%d)\n", This, Level); + if (Level < This->levels) { + hr = IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) This->surfaces[Level]); + TRACE("(%p) Level (%d) success(%lu)\n", This, Level, hr); + } else { + FIXME("Levels seems too high?!!\n"); + } return D3D_OK; } HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 iface, CONST RECT* pDirtyRect) { Index: volumetexture.c =================================================================== RCS file: /home/wine/wine/dlls/d3d8/volumetexture.c,v retrieving revision 1.8 diff -u -r1.8 volumetexture.c --- volumetexture.c 13 May 2003 23:52:50 -0000 1.8 +++ volumetexture.c 22 May 2003 22:24:17 -0000 @@ -136,12 +136,17 @@ glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, This->levels - 1); checkGLcall("glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAX_LEVEL, This->levels - 1)"); } - - TRACE("Calling glTexImage3D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, 0=%d, glFmt=%x, glType=%lx, Mem=%p\n", - GL_TEXTURE_3D, i, fmt2glintFmt(This->format), - This->volumes[i]->myDesc.Width, This->volumes[i]->myDesc.Height, + + TRACE("Calling glTexImage3D %x i=%d, intfmt=%x, w=%d, h=%d,d=%d, 0=%d, glFmt=%x, glType=%x, Mem=%p\n", + GL_TEXTURE_3D, + i, + fmt2glintFmt(This->format), + This->volumes[i]->myDesc.Width, + This->volumes[i]->myDesc.Height, This->volumes[i]->myDesc.Depth, - 0, fmt2glFmt(This->format), fmt2glType(This->format), + 0, + fmt2glFmt(This->format), + fmt2glType(This->format), This->volumes[i]->allocatedMemory); glTexImage3D(GL_TEXTURE_3D, i, @@ -154,7 +159,7 @@ fmt2glType(This->format), This->volumes[i]->allocatedMemory); checkGLcall("glTexImage3D"); - + /* Removed glTexParameterf now TextureStageStates are initialized at startup */ This->Dirty = FALSE; } Index: d3d8_private.h =================================================================== RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v retrieving revision 1.27 diff -u -r1.27 d3d8_private.h --- d3d8_private.h 17 May 2003 18:33:02 -0000 1.27 +++ d3d8_private.h 22 May 2003 22:24:17 -0000 @@ -153,8 +153,61 @@ } \ } -#define checkGLSupport(ExtName) FALSE/*(TRUE == This->direct3d8->glInfo.supported[ExtName])*/ -#define GLExtCall(FuncName) /*(This->direct3d8->glInfo.FuncName)*/ +typedef enum _GL_SupportedExt { + /* ARB */ + ARB_MULTISAMPLE, + ARB_MULTITEXTURE, + ARB_POINT_PARAMETERS, + ARB_TEXTURE_COMPRESSION, + ARB_TEXTURE_CUBE_MAP, + ARB_TEXTURE_ENV_DOT3, + ARB_VERTEX_PROGRAM, + ARB_VERTEX_BLEND, + /* EXT */ + EXT_FOG_COORD, + EXT_PALETTED_TEXTURE, + EXT_SECONDARY_COLOR, + EXT_TEXTURE_COMPRESSION_S3TC, + EXT_TEXTURE_LOD, + EXT_TEXTURE_LOD_BIAS, + EXT_VERTEX_WEIGHTING, + /* NVIDIA */ + NV_VERTEX_PROGRAM, + /* ATI */ + EXT_VERTEX_SHADER, + + OPENGL_SUPPORTED_EXT_END +} GL_SupportedExt; + +typedef enum _GL_VSVersion { + VS_VERSION_NOT_SUPPORTED = 0x0, + VS_VERSION_10 = 0x10, + VS_VERSION_11 = 0x11, + VS_VERSION_20 = 0x20, + VS_VERSION_30 = 0x30, + /*Force 32-bits*/ + VS_VERSION_FORCE_DWORD = 0x7FFFFFFF +} GL_VSVersion; + +typedef struct _GL_Info { + /** + * CAPS Constants + */ + UINT max_lights; + UINT max_textures; + UINT max_clipplanes; + + GL_VSVersion vs_arb_version; + GL_VSVersion vs_nv_version; + GL_VSVersion vs_ati_version; + + BOOL supported[25]; +} GL_Info; + +#define GL_LIMITS(ExtName) (This->direct3d8->gl_info.max_##ExtName) +#define GL_SUPPORT(ExtName) (TRUE == This->direct3d8->gl_info.supported[ExtName]) +#define GL_SUPPORT_DEV(ExtName, dev) (TRUE == (dev)->direct3d8->gl_info.supported[ExtName]) +#define GLExtCall(FuncName) /*(This->direct3d8->glInfo.FuncName)*/ #define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f) @@ -204,6 +257,7 @@ DWORD ref; /* IDirect3D8 fields */ + GL_Info gl_info; }; /* IUnknown: */ @@ -252,9 +306,14 @@ /* IDirect3DDevice8 fields */ IDirect3D8Impl *direct3d8; + IDirect3DSurface8Impl *frontBuffer; IDirect3DSurface8Impl *backBuffer; IDirect3DSurface8Impl *depthStencilBuffer; + + IDirect3DSurface8Impl *renderTarget; + IDirect3DSurface8Impl *stencilBufferTarget; + D3DPRESENT_PARAMETERS PresentParms; D3DDEVICE_CREATION_PARAMETERS CreateParms; @@ -288,19 +347,31 @@ XVisualInfo *visInfo; Display *display; Window win; + GLXContext render_ctx; + Drawable drawable; /* OpenGL Extension related */ +#if 0 BOOL isMultiTexture; BOOL isDot3; UINT TextureUnits; UINT clipPlanes; UINT maxLights; +#endif + + /* Cursor management */ + BOOL bCursorVisible; + UINT xHotSpot; + UINT yHotSpot; + UINT xScreenSpace; + UINT yScreenSpace; + GLint cursor; UINT dummyTextureName[8]; }; /* IUnknown: */ -extern HRESULT WINAPI IDirect3DDevice8Impl_QueryInterface(LPDIRECT3DDEVICE8 iface,REFIID refiid,LPVOID *obj); +extern HRESULT WINAPI IDirect3DDevice8Impl_QueryInterface(LPDIRECT3DDEVICE8 iface, REFIID refiid, LPVOID *obj); extern ULONG WINAPI IDirect3DDevice8Impl_AddRef(LPDIRECT3DDEVICE8 iface); extern ULONG WINAPI IDirect3DDevice8Impl_Release(LPDIRECT3DDEVICE8 iface); @@ -313,47 +384,47 @@ extern HRESULT WINAPI IDirect3DDevice8Impl_GetDisplayMode(LPDIRECT3DDEVICE8 iface, D3DDISPLAYMODE* pMode); extern HRESULT WINAPI IDirect3DDevice8Impl_GetCreationParameters(LPDIRECT3DDEVICE8 iface, D3DDEVICE_CREATION_PARAMETERS* pParameters); extern HRESULT WINAPI IDirect3DDevice8Impl_SetCursorProperties(LPDIRECT3DDEVICE8 iface, UINT XHotSpot, UINT YHotSpot, IDirect3DSurface8* pCursorBitmap); -extern void WINAPI IDirect3DDevice8Impl_SetCursorPosition(LPDIRECT3DDEVICE8 iface, UINT XScreenSpace, UINT YScreenSpace,DWORD Flags); +extern void WINAPI IDirect3DDevice8Impl_SetCursorPosition(LPDIRECT3DDEVICE8 iface, UINT XScreenSpace, UINT YScreenSpace, DWORD Flags); extern BOOL WINAPI IDirect3DDevice8Impl_ShowCursor(LPDIRECT3DDEVICE8 iface, BOOL bShow); extern HRESULT WINAPI IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DSwapChain8** pSwapChain); extern HRESULT WINAPI IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters); -extern HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer); +extern HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer); extern HRESULT WINAPI IDirect3DDevice8Impl_GetRasterStatus(LPDIRECT3DDEVICE8 iface, D3DRASTER_STATUS* pRasterStatus); -extern void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags,CONST D3DGAMMARAMP* pRamp); +extern void WINAPI IDirect3DDevice8Impl_SetGammaRamp(LPDIRECT3DDEVICE8 iface, DWORD Flags, CONST D3DGAMMARAMP* pRamp); extern void WINAPI IDirect3DDevice8Impl_GetGammaRamp(LPDIRECT3DDEVICE8 iface, D3DGAMMARAMP* pRamp); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DTexture8** ppTexture); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,UINT Depth,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DVolumeTexture8** ppVolumeTexture); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength,UINT Levels,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DCubeTexture8** ppCubeTexture); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length,DWORD Usage,DWORD FVF,D3DPOOL Pool,IDirect3DVertexBuffer8** ppVertexBuffer); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length,DWORD Usage,D3DFORMAT Format,D3DPOOL Pool,IDirect3DIndexBuffer8** ppIndexBuffer); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,BOOL Lockable,IDirect3DSurface8** ppSurface); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,D3DMULTISAMPLE_TYPE MultiSample,IDirect3DSurface8** ppSurface); -extern HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width,UINT Height,D3DFORMAT Format,IDirect3DSurface8** ppSurface); -extern HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pSourceSurface,CONST RECT* pSourceRectsArray,UINT cRects,IDirect3DSurface8* pDestinationSurface,CONST POINT* pDestPointsArray); -extern HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture,IDirect3DBaseTexture8* pDestinationTexture); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture8** ppTexture); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateVolumeTexture(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, UINT Depth, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DVolumeTexture8** ppVolumeTexture); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateCubeTexture(LPDIRECT3DDEVICE8 iface, UINT EdgeLength, UINT Levels, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DCubeTexture8** ppCubeTexture); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateIndexBuffer(LPDIRECT3DDEVICE8 iface, UINT Length, DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DIndexBuffer8** ppIndexBuffer); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateRenderTarget(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, BOOL Lockable, IDirect3DSurface8** ppSurface); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateDepthStencilSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, D3DMULTISAMPLE_TYPE MultiSample, IDirect3DSurface8** ppSurface); +extern HRESULT WINAPI IDirect3DDevice8Impl_CreateImageSurface(LPDIRECT3DDEVICE8 iface, UINT Width, UINT Height, D3DFORMAT Format, IDirect3DSurface8** ppSurface); +extern HRESULT WINAPI IDirect3DDevice8Impl_CopyRects(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pSourceSurface, CONST RECT* pSourceRectsArray, UINT cRects, IDirect3DSurface8* pDestinationSurface, CONST POINT* pDestPointsArray); +extern HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture, IDirect3DBaseTexture8* pDestinationTexture); extern HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget,IDirect3DSurface8* pNewZStencil); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pRenderTarget, IDirect3DSurface8* pNewZStencil); extern HRESULT WINAPI IDirect3DDevice8Impl_GetRenderTarget(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppRenderTarget); extern HRESULT WINAPI IDirect3DDevice8Impl_GetDepthStencilSurface(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8** ppZStencilSurface); extern HRESULT WINAPI IDirect3DDevice8Impl_BeginScene(LPDIRECT3DDEVICE8 iface); extern HRESULT WINAPI IDirect3DDevice8Impl_EndScene(LPDIRECT3DDEVICE8 iface); -extern HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State,CONST D3DMATRIX* pMatrix); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix); +extern HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State, D3DMATRIX* pMatrix); extern HRESULT WINAPI IDirect3DDevice8Impl_MultiplyTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix); extern HRESULT WINAPI IDirect3DDevice8Impl_SetViewport(LPDIRECT3DDEVICE8 iface, CONST D3DVIEWPORT8* pViewport); extern HRESULT WINAPI IDirect3DDevice8Impl_GetViewport(LPDIRECT3DDEVICE8 iface, D3DVIEWPORT8* pViewport); extern HRESULT WINAPI IDirect3DDevice8Impl_SetMaterial(LPDIRECT3DDEVICE8 iface, CONST D3DMATERIAL8* pMaterial); extern HRESULT WINAPI IDirect3DDevice8Impl_GetMaterial(LPDIRECT3DDEVICE8 iface, D3DMATERIAL8* pMaterial); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,CONST D3DLIGHT8* pLight); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,D3DLIGHT8* pLight); -extern HRESULT WINAPI IDirect3DDevice8Impl_LightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL Enable); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL* pEnable); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,CONST float* pPlane); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,float* pPlane); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD Value); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD* pValue); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index, CONST D3DLIGHT8* pLight); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWORD Index, D3DLIGHT8* pLight); +extern HRESULT WINAPI IDirect3DDevice8Impl_LightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index, BOOL Enable); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index, BOOL* pEnable); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index, CONST float* pPlane); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index, float* pPlane); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State, DWORD Value); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State, DWORD* pValue); extern HRESULT WINAPI IDirect3DDevice8Impl_BeginStateBlock(LPDIRECT3DDEVICE8 iface); extern HRESULT WINAPI IDirect3DDevice8Impl_EndStateBlock(LPDIRECT3DDEVICE8 iface, DWORD* pToken); extern HRESULT WINAPI IDirect3DDevice8Impl_ApplyStateBlock(LPDIRECT3DDEVICE8 iface, DWORD Token); @@ -362,20 +433,20 @@ extern HRESULT WINAPI IDirect3DDevice8Impl_CreateStateBlock(LPDIRECT3DDEVICE8 iface, D3DSTATEBLOCKTYPE Type,DWORD* pToken); extern HRESULT WINAPI IDirect3DDevice8Impl_SetClipStatus(LPDIRECT3DDEVICE8 iface, CONST D3DCLIPSTATUS8* pClipStatus); extern HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface, D3DCLIPSTATUS8* pClipStatus); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8* pTexture); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD* pValue); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage, IDirect3DBaseTexture8** ppTexture); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage, IDirect3DBaseTexture8* pTexture); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD* pValue); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value); extern HRESULT WINAPI IDirect3DDevice8Impl_ValidateDevice(LPDIRECT3DDEVICE8 iface, DWORD* pNumPasses); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetInfo(LPDIRECT3DDEVICE8 iface, DWORD DevInfoID,void* pDevInfoStruct,DWORD DevInfoStructSize); -extern HRESULT WINAPI IDirect3DDevice8Impl_SetPaletteEntries(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber,CONST PALETTEENTRY* pEntries); -extern HRESULT WINAPI IDirect3DDevice8Impl_GetPaletteEntries(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber,PALETTEENTRY* pEntries); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetInfo(LPDIRECT3DDEVICE8 iface, DWORD DevInfoID, void* pDevInfoStruct, DWORD DevInfoStructSize); +extern HRESULT WINAPI IDirect3DDevice8Impl_SetPaletteEntries(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber, CONST PALETTEENTRY* pEntries); +extern HRESULT WINAPI IDirect3DDevice8Impl_GetPaletteEntries(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber, PALETTEENTRY* pEntries); extern HRESULT WINAPI IDirect3DDevice8Impl_SetCurrentTexturePalette(LPDIRECT3DDEVICE8 iface, UINT PaletteNumber); extern HRESULT WINAPI IDirect3DDevice8Impl_GetCurrentTexturePalette(LPDIRECT3DDEVICE8 iface, UINT *PaletteNumber); -extern HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,UINT StartVertex,UINT PrimitiveCount); -extern HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,UINT minIndex,UINT NumVertices,UINT startIndex,UINT primCount); -extern HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitiveUP(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,UINT PrimitiveCount,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride); -extern HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType,UINT MinVertexIndex,UINT NumVertexIndices,UINT PrimitiveCount,CONST void* pIndexData,D3DFORMAT IndexDataFormat,CONST void* pVertexStreamZeroData,UINT VertexStreamZeroStride); +extern HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount); +extern HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitive(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType, UINT minIndex, UINT NumVertices, UINT startIndex, UINT primCount); +extern HRESULT WINAPI IDirect3DDevice8Impl_DrawPrimitiveUP(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType, UINT PrimitiveCount, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride); +extern HRESULT WINAPI IDirect3DDevice8Impl_DrawIndexedPrimitiveUP(LPDIRECT3DDEVICE8 iface, D3DPRIMITIVETYPE PrimitiveType, UINT MinVertexIndex, UINT NumVertexIndices, UINT PrimitiveCount, CONST void* pIndexData, D3DFORMAT IndexDataFormat, CONST void* pVertexStreamZeroData, UINT VertexStreamZeroStride); extern HRESULT WINAPI IDirect3DDevice8Impl_ProcessVertices(LPDIRECT3DDEVICE8 iface, UINT SrcStartIndex,UINT DestIndex,UINT VertexCount,IDirect3DVertexBuffer8* pDestBuffer,DWORD Flags); extern HRESULT WINAPI IDirect3DDevice8Impl_CreateVertexShader(LPDIRECT3DDEVICE8 iface, CONST DWORD* pDeclaration,CONST DWORD* pFunction,DWORD* pHandle,DWORD Usage); extern HRESULT WINAPI IDirect3DDevice8Impl_SetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD Handle); @@ -400,6 +471,11 @@ extern HRESULT WINAPI IDirect3DDevice8Impl_DrawTriPatch(LPDIRECT3DDEVICE8 iface, UINT Handle,CONST float* pNumSegs,CONST D3DTRIPATCH_INFO* pTriPatchInfo); extern HRESULT WINAPI IDirect3DDevice8Impl_DeletePatch(LPDIRECT3DDEVICE8 iface, UINT Handle); +/* internal Interfaces */ +extern HRESULT WINAPI IDirect3DDevice8Impl_CleanRender(LPDIRECT3DDEVICE8 iface); +extern HRESULT WINAPI IDirect3DDevice8Impl_ActiveRender(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* RenderSurface, IDirect3DSurface8* StencilSurface); + + /* ---------------- */ /* IDirect3DVolume8 */ /* ---------------- */ @@ -444,6 +520,7 @@ extern HRESULT WINAPI IDirect3DVolume8Impl_LockBox(LPDIRECT3DVOLUME8 iface, D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox, DWORD Flags); extern HRESULT WINAPI IDirect3DVolume8Impl_UnlockBox(LPDIRECT3DVOLUME8 iface); + /* ------------------- */ /* IDirect3DSwapChain8 */ /* ------------------- */ @@ -477,6 +554,7 @@ extern HRESULT WINAPI IDirect3DSwapChain8Impl_Present(LPDIRECT3DSWAPCHAIN8 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion); extern HRESULT WINAPI IDirect3DSwapChain8Impl_GetBackBuffer(LPDIRECT3DSWAPCHAIN8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer); + /* ----------------- */ /* IDirect3DSurface8 */ /* ----------------- */ @@ -500,15 +578,16 @@ D3DRESOURCETYPE ResourceType; IUnknown *Container; - D3DSURFACE_DESC myDesc; BYTE *allocatedMemory; UINT textureName; UINT bytesPerPixel; + BOOL lockable; BOOL locked; RECT lockedRect; BOOL Dirty; + }; /* IUnknown: */ @@ -526,6 +605,10 @@ extern HRESULT WINAPI IDirect3DSurface8Impl_LockRect(LPDIRECT3DSURFACE8 iface, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect,DWORD Flags); extern HRESULT WINAPI IDirect3DSurface8Impl_UnlockRect(LPDIRECT3DSURFACE8 iface); +/* internal Interfaces */ +extern HRESULT WINAPI IDirect3DSurface8Impl_CreateGLTexture(LPDIRECT3DSURFACE8 iface, GLenum gl_target, GLenum gl_level); + + /* ------------------ */ /* IDirect3DResource8 */ /* ------------------ */ @@ -564,6 +647,10 @@ extern void WINAPI IDirect3DResource8Impl_PreLoad(LPDIRECT3DRESOURCE8 iface); extern D3DRESOURCETYPE WINAPI IDirect3DResource8Impl_GetType(LPDIRECT3DRESOURCE8 iface); +/* internal Interfaces */ +extern D3DPOOL WINAPI IDirect3DResource8Impl_GetPool(LPDIRECT3DRESOURCE8 iface); + + /* ---------------------- */ /* IDirect3DVertexBuffer8 */ /* ---------------------- */ @@ -611,6 +698,7 @@ extern HRESULT WINAPI IDirect3DVertexBuffer8Impl_Unlock(LPDIRECT3DVERTEXBUFFER8 iface); extern HRESULT WINAPI IDirect3DVertexBuffer8Impl_GetDesc(LPDIRECT3DVERTEXBUFFER8 iface, D3DVERTEXBUFFER_DESC *pDesc); + /* --------------------- */ /* IDirect3DIndexBuffer8 */ /* --------------------- */ @@ -658,6 +746,7 @@ extern HRESULT WINAPI IDirect3DIndexBuffer8Impl_Unlock(LPDIRECT3DINDEXBUFFER8 iface); extern HRESULT WINAPI IDirect3DIndexBuffer8Impl_GetDesc(LPDIRECT3DINDEXBUFFER8 iface, D3DINDEXBUFFER_DESC *pDesc); + /* --------------------- */ /* IDirect3DBaseTexture8 */ /* --------------------- */ @@ -682,7 +771,8 @@ /* IDirect3DBaseTexture8 fields */ BOOL Dirty; - + D3DFORMAT format; + UINT levels; /* *BOOL isManaged; *DWORD lod; @@ -709,6 +799,11 @@ extern DWORD WINAPI IDirect3DBaseTexture8Impl_GetLOD(LPDIRECT3DBASETEXTURE8 iface); extern DWORD WINAPI IDirect3DBaseTexture8Impl_GetLevelCount(LPDIRECT3DBASETEXTURE8 iface); +/* internal Interfaces */ +extern BOOL WINAPI IDirect3DBaseTexture8Impl_IsDirty(LPDIRECT3DBASETEXTURE8 iface); +extern BOOL WINAPI IDirect3DBaseTexture8Impl_SetDirty(LPDIRECT3DBASETEXTURE8 iface, BOOL dirty); + + /* --------------------- */ /* IDirect3DCubeTexture8 */ /* --------------------- */ @@ -733,12 +828,12 @@ /* IDirect3DBaseTexture8 fields */ BOOL Dirty; + D3DFORMAT format; + UINT levels; /* IDirect3DCubeTexture8 fields */ UINT edgeLength; DWORD usage; - UINT levels; - D3DFORMAT format; IDirect3DSurface8Impl *surfaces[6][MAX_LEVELS]; }; @@ -764,11 +859,12 @@ extern DWORD WINAPI IDirect3DCubeTexture8Impl_GetLevelCount(LPDIRECT3DCUBETEXTURE8 iface); /* IDirect3DCubeTexture8 */ -extern HRESULT WINAPI IDirect3DCubeTexture8Impl_GetLevelDesc(LPDIRECT3DCUBETEXTURE8 iface,UINT Level,D3DSURFACE_DESC *pDesc); -extern HRESULT WINAPI IDirect3DCubeTexture8Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface8** ppCubeMapSurface); -extern HRESULT WINAPI IDirect3DCubeTexture8Impl_LockRect(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags); -extern HRESULT WINAPI IDirect3DCubeTexture8Impl_UnlockRect(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,UINT Level); -extern HRESULT WINAPI IDirect3DCubeTexture8Impl_AddDirtyRect(LPDIRECT3DCUBETEXTURE8 iface,D3DCUBEMAP_FACES FaceType,CONST RECT* pDirtyRect); +extern HRESULT WINAPI IDirect3DCubeTexture8Impl_GetLevelDesc(LPDIRECT3DCUBETEXTURE8 iface, UINT Level, D3DSURFACE_DESC* pDesc); +extern HRESULT WINAPI IDirect3DCubeTexture8Impl_GetCubeMapSurface(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface8** ppCubeMapSurface); +extern HRESULT WINAPI IDirect3DCubeTexture8Impl_LockRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); +extern HRESULT WINAPI IDirect3DCubeTexture8Impl_UnlockRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, UINT Level); +extern HRESULT WINAPI IDirect3DCubeTexture8Impl_AddDirtyRect(LPDIRECT3DCUBETEXTURE8 iface, D3DCUBEMAP_FACES FaceType, CONST RECT* pDirtyRect); + /* ----------------- */ /* IDirect3DTexture8 */ @@ -794,13 +890,13 @@ /* IDirect3DBaseTexture8 fields */ BOOL Dirty; + D3DFORMAT format; + UINT levels; /* IDirect3DTexture8 fields */ UINT width; UINT height; - UINT levels; DWORD usage; - D3DFORMAT format; IDirect3DSurface8Impl *surfaces[MAX_LEVELS]; }; @@ -826,12 +922,13 @@ extern DWORD WINAPI IDirect3DTexture8Impl_GetLevelCount(LPDIRECT3DTEXTURE8 iface); /* IDirect3DTexture8: */ -extern HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 iface, UINT Level,D3DSURFACE_DESC* pDesc); -extern HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level,IDirect3DSurface8** ppSurfaceLevel); -extern HRESULT WINAPI IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, UINT Level,D3DLOCKED_RECT* pLockedRect,CONST RECT* pRect,DWORD Flags); +extern HRESULT WINAPI IDirect3DTexture8Impl_GetLevelDesc(LPDIRECT3DTEXTURE8 iface, UINT Level, D3DSURFACE_DESC* pDesc); +extern HRESULT WINAPI IDirect3DTexture8Impl_GetSurfaceLevel(LPDIRECT3DTEXTURE8 iface, UINT Level, IDirect3DSurface8** ppSurfaceLevel); +extern HRESULT WINAPI IDirect3DTexture8Impl_LockRect(LPDIRECT3DTEXTURE8 iface, UINT Level, D3DLOCKED_RECT* pLockedRect, CONST RECT* pRect, DWORD Flags); extern HRESULT WINAPI IDirect3DTexture8Impl_UnlockRect(LPDIRECT3DTEXTURE8 iface, UINT Level); extern HRESULT WINAPI IDirect3DTexture8Impl_AddDirtyRect(LPDIRECT3DTEXTURE8 iface, CONST RECT* pDirtyRect); + /* ----------------------- */ /* IDirect3DVolumeTexture8 */ /* ----------------------- */ @@ -856,14 +953,14 @@ /* IDirect3DBaseTexture8 fields */ BOOL Dirty; + D3DFORMAT format; + UINT levels; /* IDirect3DVolumeTexture8 fields */ UINT width; UINT height; UINT depth; - UINT levels; DWORD usage; - D3DFORMAT format; IDirect3DVolume8Impl *volumes[MAX_LEVELS]; }; @@ -889,12 +986,13 @@ extern DWORD WINAPI IDirect3DVolumeTexture8Impl_GetLevelCount(LPDIRECT3DVOLUMETEXTURE8 iface); /* IDirect3DVolumeTexture8: */ -extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level,D3DVOLUME_DESC *pDesc); -extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level,IDirect3DVolume8** ppVolumeLevel); -extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level,D3DLOCKED_BOX* pLockedVolume,CONST D3DBOX* pBox,DWORD Flags); +extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetLevelDesc(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DVOLUME_DESC *pDesc); +extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_GetVolumeLevel(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, IDirect3DVolume8** ppVolumeLevel); +extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_LockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level, D3DLOCKED_BOX* pLockedVolume, CONST D3DBOX* pBox, DWORD Flags); extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_UnlockBox(LPDIRECT3DVOLUMETEXTURE8 iface, UINT Level); extern HRESULT WINAPI IDirect3DVolumeTexture8Impl_AddDirtyBox(LPDIRECT3DVOLUMETEXTURE8 iface, CONST D3DBOX* pDirtyBox); + /* ============================================================================== Private interfactes: beginning of cleaning/splitting for HAL and d3d9 support ============================================================================== */ @@ -1127,11 +1225,29 @@ * * to see how not defined it here */ -void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage); -SHORT bytesPerPixel(D3DFORMAT fmt); -GLint fmt2glintFmt(D3DFORMAT fmt); +void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage); +SHORT bytesPerPixel(D3DFORMAT fmt); +GLint fmt2glintFmt(D3DFORMAT fmt); GLenum fmt2glFmt(D3DFORMAT fmt); -DWORD fmt2glType(D3DFORMAT fmt); +GLenum fmt2glType(D3DFORMAT fmt); + +SHORT D3DFmtGetBpp(D3DFORMAT fmt); +GLint D3DFmt2GLIntFmt(D3DFORMAT fmt); +GLenum D3DFmt2GLFmt(D3DFORMAT fmt); +GLenum D3DFmt2GLType(D3DFORMAT fmt); + +GLenum D3DFmt2GLDepthFmt(D3DFORMAT fmt); +GLenum D3DFmt2GLDepthType(D3DFORMAT fmt); + +int D3DPrimitiveListGetVertexSize(D3DPRIMITIVETYPE PrimitiveType, int iNumPrim); +int D3DPrimitive2GLenum(D3DPRIMITIVETYPE PrimitiveType); +int D3DFVFGetSize(D3DFORMAT fvf); + +int SOURCEx_RGB_EXT(DWORD arg); +int OPERANDx_RGB_EXT(DWORD arg); +int SOURCEx_ALPHA_EXT(DWORD arg); +int OPERANDx_ALPHA_EXT(DWORD arg); +GLenum StencilOp(DWORD op); /** * Internals debug functions @@ -1140,5 +1256,6 @@ const char* debug_d3dusage(DWORD usage); const char* debug_d3dformat(D3DFORMAT fmt); const char* debug_d3dressourcetype(D3DRESOURCETYPE res); +const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType); #endif /* __WINE_D3DX8_PRIVATE_H */ Index: Makefile.in =================================================================== RCS file: /home/wine/wine/dlls/d3d8/Makefile.in,v retrieving revision 1.7 diff -u -r1.7 Makefile.in --- Makefile.in 3 Apr 2003 23:55:55 -0000 1.7 +++ Makefile.in 22 May 2003 22:24:17 -0000 @@ -26,7 +26,8 @@ vertexbuffer.c \ volume.c \ volumetexture.c \ - vshaderdeclaration.c + vshaderdeclaration.c \ + utils.c RC_SRCS = version.rc --- /dev/null 1970-01-01 01:00:00.000000000 +0100 +++ utils.c 2003-05-23 00:21:43.000000000 +0200 @@ -0,0 +1,420 @@ +/* + * D3D8 utils + * + * Copyright 2002-2003 Jason Edmeades + * Raphael Junqueira + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "config.h" + +#include <math.h> + +#define NONAMELESSUNION +#define NONAMELESSSTRUCT +#include "windef.h" +#include "winbase.h" +#include "winuser.h" +#include "wingdi.h" +#include "wine/debug.h" + +#include "d3d8_private.h" + +WINE_DEFAULT_DEBUG_CHANNEL(d3d); + + +#if 0 +# define VTRACE(A) TRACE A +#else +# define VTRACE(A) +#endif + +const char* debug_d3ddevicetype(D3DDEVTYPE devtype) { + switch (devtype) { +#define DEVTYPE_TO_STR(dev) case dev: return #dev + DEVTYPE_TO_STR(D3DDEVTYPE_HAL); + DEVTYPE_TO_STR(D3DDEVTYPE_REF); + DEVTYPE_TO_STR(D3DDEVTYPE_SW); +#undef DEVTYPE_TO_STR + default: + FIXME("Unrecognized %u D3DDEVTYPE!\n", devtype); + return "unrecognized"; + } +} + +const char* debug_d3dusage(DWORD usage) { + switch (usage) { +#define D3DUSAGE_TO_STR(u) case u: return #u + D3DUSAGE_TO_STR(D3DUSAGE_RENDERTARGET); + D3DUSAGE_TO_STR(D3DUSAGE_DEPTHSTENCIL); + D3DUSAGE_TO_STR(D3DUSAGE_WRITEONLY); + D3DUSAGE_TO_STR(D3DUSAGE_SOFTWAREPROCESSING); + D3DUSAGE_TO_STR(D3DUSAGE_DONOTCLIP); + D3DUSAGE_TO_STR(D3DUSAGE_POINTS); + D3DUSAGE_TO_STR(D3DUSAGE_RTPATCHES); + D3DUSAGE_TO_STR(D3DUSAGE_NPATCHES); + D3DUSAGE_TO_STR(D3DUSAGE_DYNAMIC); +#undef D3DUSAGE_TO_STR + case 0: return "none"; + default: + FIXME("Unrecognized %lu Usage!\n", usage); + return "unrecognized"; + } +} + +const char* debug_d3dformat(D3DFORMAT fmt) { + switch (fmt) { +#define FMT_TO_STR(fmt) case fmt: return #fmt + FMT_TO_STR(D3DFMT_UNKNOWN); + FMT_TO_STR(D3DFMT_R8G8B8); + FMT_TO_STR(D3DFMT_A8R8G8B8); + FMT_TO_STR(D3DFMT_X8R8G8B8); + FMT_TO_STR(D3DFMT_R5G6B5); + FMT_TO_STR(D3DFMT_X1R5G5B5); + FMT_TO_STR(D3DFMT_A1R5G5B5); + FMT_TO_STR(D3DFMT_A4R4G4B4); + FMT_TO_STR(D3DFMT_R3G3B2); + FMT_TO_STR(D3DFMT_A8); + FMT_TO_STR(D3DFMT_A8R3G3B2); + FMT_TO_STR(D3DFMT_X4R4G4B4); + FMT_TO_STR(D3DFMT_A8P8); + FMT_TO_STR(D3DFMT_P8); + FMT_TO_STR(D3DFMT_L8); + FMT_TO_STR(D3DFMT_A8L8); + FMT_TO_STR(D3DFMT_A4L4); + FMT_TO_STR(D3DFMT_V8U8); + FMT_TO_STR(D3DFMT_L6V5U5); + FMT_TO_STR(D3DFMT_X8L8V8U8); + FMT_TO_STR(D3DFMT_Q8W8V8U8); + FMT_TO_STR(D3DFMT_V16U16); + FMT_TO_STR(D3DFMT_W11V11U10); + FMT_TO_STR(D3DFMT_UYVY); + FMT_TO_STR(D3DFMT_YUY2); + FMT_TO_STR(D3DFMT_DXT1); + FMT_TO_STR(D3DFMT_DXT2); + FMT_TO_STR(D3DFMT_DXT3); + FMT_TO_STR(D3DFMT_DXT4); + FMT_TO_STR(D3DFMT_DXT5); + FMT_TO_STR(D3DFMT_D16_LOCKABLE); + FMT_TO_STR(D3DFMT_D32); + FMT_TO_STR(D3DFMT_D15S1); + FMT_TO_STR(D3DFMT_D24S8); + FMT_TO_STR(D3DFMT_D16); + FMT_TO_STR(D3DFMT_D24X8); + FMT_TO_STR(D3DFMT_D24X4S4); + FMT_TO_STR(D3DFMT_VERTEXDATA); + FMT_TO_STR(D3DFMT_INDEX16); + FMT_TO_STR(D3DFMT_INDEX32); +#undef FMT_TO_STR + default: + FIXME("Unrecognized %u D3DFORMAT!\n", fmt); + return "unrecognized"; + } +} + +const char* debug_d3dressourcetype(D3DRESOURCETYPE res) { + switch (res) { +#define RES_TO_STR(res) case res: return #res; + RES_TO_STR(D3DRTYPE_SURFACE); + RES_TO_STR(D3DRTYPE_VOLUME); + RES_TO_STR(D3DRTYPE_TEXTURE); + RES_TO_STR(D3DRTYPE_VOLUMETEXTURE); + RES_TO_STR(D3DRTYPE_CUBETEXTURE); + RES_TO_STR(D3DRTYPE_VERTEXBUFFER); + RES_TO_STR(D3DRTYPE_INDEXBUFFER); +#undef RES_TO_STR + default: + FIXME("Unrecognized %u D3DRESOURCETYPE!\n", res); + return "unrecognized"; + } +} + +const char* debug_d3dprimitivetype(D3DPRIMITIVETYPE PrimitiveType) { + switch (PrimitiveType) { +#define PRIM_TO_STR(prim) case prim: return #prim; + PRIM_TO_STR(D3DPT_POINTLIST); + PRIM_TO_STR(D3DPT_LINELIST); + PRIM_TO_STR(D3DPT_LINESTRIP); + PRIM_TO_STR(D3DPT_TRIANGLELIST); + PRIM_TO_STR(D3DPT_TRIANGLESTRIP); + PRIM_TO_STR(D3DPT_TRIANGLEFAN); +#undef PRIM_TO_STR + default: + FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); + return "unrecognized"; + } +} + +/* + * Simple utility routines used for dx -> gl mapping of byte formats + */ +SHORT bytesPerPixel(D3DFORMAT fmt) { + SHORT retVal; + + switch (fmt) { + /* color buffer */ + case D3DFMT_P8: retVal = 1; break; + case D3DFMT_R3G3B2: retVal = 1; break; + case D3DFMT_R5G6B5: retVal = 2; break; + case D3DFMT_X1R5G5B5: retVal = 2; break; + case D3DFMT_A4R4G4B4: retVal = 2; break; + case D3DFMT_X4R4G4B4: retVal = 2; break; + case D3DFMT_A1R5G5B5: retVal = 2; break; + case D3DFMT_R8G8B8: retVal = 3; break; + case D3DFMT_X8R8G8B8: retVal = 4; break; + case D3DFMT_A8R8G8B8: retVal = 4; break; + /* depth/stencil buffer */ + case D3DFMT_D16_LOCKABLE: retVal = 2; break; + case D3DFMT_D16: retVal = 2; break; + case D3DFMT_D15S1: retVal = 2; break; + case D3DFMT_D24X4S4: retVal = 4; break; + case D3DFMT_D24S8: retVal = 4; break; + case D3DFMT_D24X8: retVal = 4; break; + case D3DFMT_D32: retVal = 4; break; + /* unknown */ + case D3DFMT_UNKNOWN: + /* Guess at the highest value of the above */ + TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %u\n", fmt); + retVal = 4; + break; + + default: + FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); + retVal = 4; + } + TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal); + return retVal; +} + +GLint fmt2glintFmt(D3DFORMAT fmt) { + GLint retVal; + + switch (fmt) { + 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; +} + +GLenum fmt2glFmt(D3DFORMAT fmt) { + GLenum retVal; + + switch (fmt) { + case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break; + case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break; + case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break; + case D3DFMT_R8G8B8: retVal = GL_BGR; break; + case D3DFMT_R5G6B5: retVal = GL_RGB; break; + case D3DFMT_A1R5G5B5: retVal = GL_BGRA; 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 fmt2glType(D3DFORMAT fmt) { + GLenum retVal; + + switch (fmt) { + case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break; + case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_BYTE; break; + case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_BYTE; break; + case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break; + case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break; + case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; 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; +} + +int D3DPrimitiveListGetVertexSize(D3DPRIMITIVETYPE PrimitiveType, int iNumPrim) { + switch (PrimitiveType) { + case D3DPT_POINTLIST: return iNumPrim; + case D3DPT_LINELIST: return iNumPrim * 2; + case D3DPT_LINESTRIP: return iNumPrim + 1; + case D3DPT_TRIANGLELIST: return iNumPrim * 3; + case D3DPT_TRIANGLESTRIP: return iNumPrim + 2; + case D3DPT_TRIANGLEFAN: return iNumPrim + 2; + default: + FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); + return 0; + } +} + +int D3DPrimitive2GLenum(D3DPRIMITIVETYPE PrimitiveType) { + switch (PrimitiveType) { + case D3DPT_POINTLIST: return GL_POINTS; + case D3DPT_LINELIST: return GL_LINES; + case D3DPT_LINESTRIP: return GL_LINE_STRIP; + case D3DPT_TRIANGLELIST: return GL_TRIANGLES; + case D3DPT_TRIANGLESTRIP: return GL_TRIANGLE_STRIP; + case D3DPT_TRIANGLEFAN: return GL_TRIANGLE_FAN; + default: + FIXME("Unrecognized %u D3DPRIMITIVETYPE!\n", PrimitiveType); + return GL_POLYGON; + } +} + +int D3DFVFGetSize(D3DFORMAT fvf) { + int ret = 0; + if (fvf & D3DFVF_XYZ) ret += 3 * sizeof(float); + else if (fvf & D3DFVF_XYZRHW) ret += 4 * sizeof(float); + if (fvf & D3DFVF_NORMAL) ret += 3 * sizeof(float); + if (fvf & D3DFVF_PSIZE) ret += sizeof(float); + if (fvf & D3DFVF_DIFFUSE) ret += sizeof(DWORD); + if (fvf & D3DFVF_SPECULAR) ret += sizeof(DWORD); + /*if (fvf & D3DFVF_TEX1) ret += 1;*/ + return ret; +} + +GLenum D3DFmt2GLDepthFmt(D3DFORMAT fmt) { + switch (fmt) { + /* depth/stencil buffer */ + case D3DFMT_D16_LOCKABLE: + case D3DFMT_D16: + case D3DFMT_D15S1: + case D3DFMT_D24X4S4: + case D3DFMT_D24S8: + case D3DFMT_D24X8: + case D3DFMT_D32: + return GL_DEPTH_COMPONENT; + default: + FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); + } + return 0; +} + +GLenum D3DFmt2GLDepthType(D3DFORMAT fmt) { + switch (fmt) { + /* depth/stencil buffer */ + case D3DFMT_D15S1: + case D3DFMT_D16_LOCKABLE: + case D3DFMT_D16: + return GL_UNSIGNED_SHORT; + case D3DFMT_D24X4S4: + case D3DFMT_D24S8: + case D3DFMT_D24X8: + case D3DFMT_D32: + return GL_UNSIGNED_INT; + default: + FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); + } + return 0; +} + +SHORT D3DFmtGetBpp(D3DFORMAT fmt) { + return bytesPerPixel(fmt); +} + +GLint D3DFmt2GLIntFmt(D3DFORMAT fmt) { + return fmt2glintFmt(fmt); +} + +GLenum D3DFmt2GLFmt(D3DFORMAT fmt) { + return fmt2glFmt(fmt); +} + +GLenum D3DFmt2GLType(D3DFORMAT fmt) { + return fmt2glType(fmt); +} + +int SOURCEx_RGB_EXT(DWORD arg) { + switch(arg) { + case D3DTSS_COLORARG0: return GL_SOURCE2_RGB_EXT; + case D3DTSS_COLORARG1: return GL_SOURCE0_RGB_EXT; + case D3DTSS_COLORARG2: return GL_SOURCE1_RGB_EXT; + case D3DTSS_ALPHAARG0: + case D3DTSS_ALPHAARG1: + case D3DTSS_ALPHAARG2: + default: + FIXME("Invalid arg %ld\n", arg); + return GL_SOURCE0_RGB_EXT; + } +} + +int OPERANDx_RGB_EXT(DWORD arg) { + switch(arg) { + case D3DTSS_COLORARG0: return GL_OPERAND2_RGB_EXT; + case D3DTSS_COLORARG1: return GL_OPERAND0_RGB_EXT; + case D3DTSS_COLORARG2: return GL_OPERAND1_RGB_EXT; + case D3DTSS_ALPHAARG0: + case D3DTSS_ALPHAARG1: + case D3DTSS_ALPHAARG2: + default: + FIXME("Invalid arg %ld\n", arg); + return GL_OPERAND0_RGB_EXT; + } +} + +int SOURCEx_ALPHA_EXT(DWORD arg) { + switch(arg) { + case D3DTSS_ALPHAARG0: return GL_SOURCE2_ALPHA_EXT; + case D3DTSS_ALPHAARG1: return GL_SOURCE0_ALPHA_EXT; + case D3DTSS_ALPHAARG2: return GL_SOURCE1_ALPHA_EXT; + case D3DTSS_COLORARG0: + case D3DTSS_COLORARG1: + case D3DTSS_COLORARG2: + default: + FIXME("Invalid arg %ld\n", arg); + return GL_SOURCE0_ALPHA_EXT; + } +} + +int OPERANDx_ALPHA_EXT(DWORD arg) { + switch(arg) { + case D3DTSS_ALPHAARG0: return GL_OPERAND2_ALPHA_EXT; + case D3DTSS_ALPHAARG1: return GL_OPERAND0_ALPHA_EXT; + case D3DTSS_ALPHAARG2: return GL_OPERAND1_ALPHA_EXT; + case D3DTSS_COLORARG0: + case D3DTSS_COLORARG1: + case D3DTSS_COLORARG2: + default: + FIXME("Invalid arg %ld\n", arg); + return GL_OPERAND0_ALPHA_EXT; + } +} + +GLenum StencilOp(DWORD op) { + switch(op) { + case D3DSTENCILOP_KEEP : return GL_KEEP; + case D3DSTENCILOP_ZERO : return GL_ZERO; + case D3DSTENCILOP_REPLACE : return GL_REPLACE; + case D3DSTENCILOP_INCRSAT : return GL_INCR; + case D3DSTENCILOP_DECRSAT : return GL_DECR; + case D3DSTENCILOP_INVERT : return GL_INVERT; + case D3DSTENCILOP_INCR : FIXME("Unsupported stencil op D3DSTENCILOP_INCR\n"); + return GL_INCR; /* Fixme - needs to support wrap */ + case D3DSTENCILOP_DECR : FIXME("Unsupported stencil op D3DSTENCILOP_DECR\n"); + return GL_DECR; /* Fixme - needs to support wrap */ + default: + FIXME("Invalid stencil op %ld\n", op); + return GL_ALWAYS; + } +} +