[dx37] come back
Raphaël Junqueira
fenix at club-internet.fr
Thu May 22 17:42:30 CDT 2003
-----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-----
-------------- next part --------------
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;
+ }
+}
+
More information about the wine-patches
mailing list