[dx8-25] huge things
Raphaël Junqueira
fenix at club-internet.fr
Wed May 14 03:37:27 CDT 2003
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi again,
now the real things:
Changelog:
- declare a new debug chanel for vertex shaders
- some usefull debug functions for textures format (maybe i'll move this
utils into an util.c file later)
- use of this functions ;)
- correct DrawPrimitive (RHW correctness and vshader RHW)
- more copyrects fixes (only two unimplemented behavior remains)
- fix GetFrontBuffer to get screenshots samples working (ugly but i'll try
better later)
- add D3DCOLORTOGLFLOAT4 and use it
- first try of D3DRS_FOGTABLEMODE support
TODO:
- beautify the code to remove all my stupid emacs tabs
- bind cube maps in draw
- more readable and usefull debugging traces
- d3dcore ?
- fix sw vshaders and merge hw vshader prototypes
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE+wgBHp7NA3AmQTU4RApONAJwPJXujh5iQhZYDTMoauzOr9KLrSgCgiFH6
NxffH2DagJT0SJNmNSFY4pw=
=BErd
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.52
diff -u -r1.52 device.c
--- device.c 14 May 2003 00:00:12 -0000 1.52
+++ device.c 14 May 2003 08:26:35 -0000
@@ -38,6 +38,7 @@
#undef GL_VERSION_1_4
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
+WINE_DECLARE_DEBUG_CHANNEL(d3d_shader);
/* Some #defines for additional diagnostics */
@@ -78,6 +79,79 @@
#define TRACE_VECTOR(name) TRACE( #name "=(%f, %f, %f, %f)\n", name.x, name.y, name.z, name.w);
+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";
+ }
+}
/* Routine common to the draw primitive and draw indexed primitive routines */
void DrawPrimitiveI(LPDIRECT3DDEVICE8 iface,
@@ -197,38 +271,51 @@
}
if (isRHW) {
- double height, width, minZ, maxZ;
+ double X, Y, height, width, minZ, maxZ;
/*
* Already transformed vertex do not need transform
* matrices. Reset all matrices to identity.
* Leave the default matrix in world mode.
*/
- glMatrixMode(GL_PROJECTION);
+ glMatrixMode(GL_MODELVIEW);
checkGLcall("glMatrixMode");
glLoadIdentity();
checkGLcall("glLoadIdentity");
- glMatrixMode(GL_MODELVIEW);
+ /**
+ * As seen in d3d7 code:
+ * See the OpenGL Red Book for an explanation of the following translation (in the OpenGL
+ * Correctness Tips section).
+ */
+ glTranslatef(0.375f, 0.375f, 0.0f);
+ /**
+ *
+ */
+ glMatrixMode(GL_PROJECTION);
checkGLcall("glMatrixMode");
glLoadIdentity();
checkGLcall("glLoadIdentity");
+ X = This->StateBlock->viewport.X;
+ Y = This->StateBlock->viewport.Y;
height = This->StateBlock->viewport.Height;
width = This->StateBlock->viewport.Width;
minZ = This->StateBlock->viewport.MinZ;
maxZ = This->StateBlock->viewport.MaxZ;
TRACE("Calling glOrtho with %f, %f, %f, %f\n", width, height, -minZ, -maxZ);
- glOrtho(0.0, width, height, 0.0, -minZ, -maxZ);
+ /*glOrtho(0.0, width, height, 0.0, -minZ, -maxZ);*/
+ glOrtho(X, X + width, Y + height, Y, -minZ, -maxZ);
checkGLcall("glOrtho");
} else {
- glMatrixMode(GL_PROJECTION);
- checkGLcall("glMatrixMode");
- glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_PROJECTION].u.m[0][0]);
- checkGLcall("glLoadMatrixf");
glMatrixMode(GL_MODELVIEW);
checkGLcall("glMatrixMode");
glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf");
glMultMatrixf((float *) &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]);
checkGLcall("glMultMatrixf");
+
+ glMatrixMode(GL_PROJECTION);
+ checkGLcall("glMatrixMode");
+ glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_PROJECTION].u.m[0][0]);
+ checkGLcall("glLoadMatrixf");
}
/* Set OpenGL to the appropriate Primitive Type */
@@ -279,7 +366,7 @@
vertex arrays, we need to drop down to the slow mechanism for
certain functions */
- if (isPtSize || isDiffuse || useVertexShaderFunction==TRUE || (numBlends > 0)) {
+ if (isPtSize || isDiffuse || useVertexShaderFunction == TRUE || (numBlends > 0)) {
TRACE("Using slow per-vertex code\n");
/* Enable this one to be able to debug what is going on, but it is slower
@@ -524,7 +611,7 @@
}
/*diffuseColor = D3DCOLOR_COLORVALUE(vertex_shader->output.oD[0]);*/
glColor4fv((float*) &vertex_shader->output.oD[0]);
-
+
/* Requires secondary color extensions to compile... */
#if defined(GL_VERSION_1_4)
glSecondaryColor3fv((float*) &vertex_shader->output.oD[1]);
@@ -601,12 +688,15 @@
}
if (1.0f == rhw || rhw < 0.01f) {
- VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z));
+ TRACE_(d3d_shader)("Vertex: glVertex:x,y,z=%f,%f,%f\n", x, y, z);
glVertex3f(x, y, z);
/*checkGLcall("glVertex3f");*/
} else {
- VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f / rhw=%f\n", x,y,z,rhw));
- glVertex4f(x / rhw, y / rhw, z / rhw, 1.0f / rhw);
+ GLfloat w = 1.0f / rhw;
+ TRACE_(d3d_shader)("Vertex: glVertex:x,y,z=%f,%f,%f / rhw=%f\n", x,y,z,rhw);
+
+ /*glVertex4f(x / rhw, y / rhw, z / rhw, 1.0f / rhw);*/
+ glVertex4f(x * w, y * w, z * w, 1.0f);
/*checkGLcall("glVertex4f");*/
}
} else {
@@ -891,7 +981,7 @@
}
/*
- Simple utility routines used for dx -> gl mapping of byte formats
+ * Simple utility routines used for dx -> gl mapping of byte formats
*/
SHORT bytesPerPixel(D3DFORMAT fmt) {
SHORT retVal;
@@ -914,15 +1004,16 @@
case D3DFMT_D24X4S4: retVal = 4; break;
/* unknown */
case D3DFMT_UNKNOWN:
- /* Guess at the highest value of the above */
- TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %d\n", fmt);
- retVal = 4;
- break;
+ /* Guess at the highest value of the above */
+ TRACE("D3DFMT_UNKNOWN - Guessing at 4 bytes/pixel %d\n", fmt);
+ retVal = 4;
+ break;
+
default:
- FIXME("Unhandled fmt %d\n", fmt);
- retVal = 4;
+ FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
+ retVal = 4;
}
- TRACE("bytes/Pxl for fmt %d = %d\n", fmt, retVal);
+ TRACE("bytes/Pxl for fmt(%u,%s) = %d\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
@@ -937,10 +1028,10 @@
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 %d\n", fmt);
+ FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = 4;
}
- TRACE("fmt2glintFmt for fmt %d = %x\n", fmt, retVal);
+ TRACE("fmt2glintFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
GLenum fmt2glFmt(D3DFORMAT fmt) {
@@ -954,10 +1045,10 @@
case D3DFMT_R5G6B5: retVal = GL_RGB; break;
case D3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
default:
- FIXME("Unhandled fmt %d\n", fmt);
+ FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = 4;
}
- TRACE("fmt2glFmt for fmt %d = %x\n", fmt, retVal);
+ TRACE("fmt2glFmt for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
DWORD fmt2glType(D3DFORMAT fmt) {
@@ -967,14 +1058,14 @@
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_REV; 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 %d\n", fmt);
+ FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = 4;
}
- TRACE("fmt2glType for fmt %d = %x\n", fmt, retVal);
+ TRACE("fmt2glType for fmt(%u,%s) = %x\n", fmt, debug_d3dformat(fmt), retVal);
return retVal;
}
@@ -1117,7 +1208,7 @@
/* Apply the current values to the specified texture stage */
void setupTextureStates(LPDIRECT3DDEVICE8 iface, DWORD Stage) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- int i=0;
+ int i = 0;
float col[4];
/* Make appropriate texture active */
@@ -1133,16 +1224,19 @@
}
TRACE("-----------------------> Updating the texture at stage %ld to have new texture state information\n", Stage);
- for (i=1; i<HIGHEST_TEXTURE_STATE; i++) {
+ for (i = 1; i < HIGHEST_TEXTURE_STATE; i++) {
IDirect3DDevice8Impl_SetTextureStageState(iface, Stage, i, This->StateBlock->texture_state[Stage][i]);
}
/* 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
+ 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);");
@@ -1487,8 +1581,7 @@
/* Generate all the surfaces */
tmpW = EdgeLength;
- for (i = 0; i < object->levels; i++)
- {
+ for (i = 0; i < object->levels; i++) {
/* Create the 6 faces */
for (j = 0; j < 6; j++) {
IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
@@ -1496,6 +1589,7 @@
/*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;*/
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);
@@ -1665,8 +1759,8 @@
IDirect3DBaseTexture8* texture = NULL;
- IDirect3DSurface8Impl *src = (IDirect3DSurface8Impl*) pSourceSurface;
- IDirect3DSurface8Impl *dst = (IDirect3DSurface8Impl*) pDestinationSurface;
+ IDirect3DSurface8Impl* src = (IDirect3DSurface8Impl*) pSourceSurface;
+ IDirect3DSurface8Impl* dst = (IDirect3DSurface8Impl*) pDestinationSurface;
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) srcsur=%p, pSourceRects=%p, cRects=%d, pDstSur=%p, pDestPtsArr=%p\n", This,
@@ -1706,65 +1800,90 @@
}
/* Quick if complete copy ... */
- if (rc == D3D_OK && (cRects == 0 && pSourceRectsArray==NULL && pDestPointsArray==NULL &&
- src->myDesc.Width == dst->myDesc.Width &&
- src->myDesc.Height == dst->myDesc.Height)) {
- D3DLOCKED_RECT lr;
+ if (rc == D3D_OK && cRects == 0 && pSourceRectsArray == NULL && pDestPointsArray == NULL) {
- IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)src, &lr, NULL, D3DLOCK_READONLY);
- IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)dst, &lr, NULL, D3DLOCK_DISCARD);
- TRACE("Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d\n", dst->myDesc.Width, dst->myDesc.Height);
+ if (src->myDesc.Width == dst->myDesc.Width && src->myDesc.Height == dst->myDesc.Height) {
- memcpy(dst->allocatedMemory, src->allocatedMemory, src->myDesc.Size);
+ D3DLOCKED_RECT lrSrc;
+ D3DLOCKED_RECT lrDst;
+ IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) src, &lrSrc, NULL, D3DLOCK_READONLY);
+ IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, NULL, 0L);
+ TRACE("Locked src and dst, Direct copy as surfaces are equal, w=%d, h=%d\n", dst->myDesc.Width, dst->myDesc.Height);
- IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)src);
- IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)dst);
+ /*memcpy(dst->allocatedMemory, src->allocatedMemory, src->myDesc.Size);*/
+ memcpy(lrDst.pBits, lrSrc.pBits, src->myDesc.Size);
+
+ IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src);
+ IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst);
TRACE("Unlocked src and dst\n");
+ } else {
+
+ FIXME("Wanted to copy all surfaces but size not compatible\n");
+ rc = D3DERR_INVALIDCALL;
+
+ }
+
} else {
- int i;
+
+ if (NULL != pSourceRectsArray && NULL != pDestPointsArray) {
+
int bytesPerPixel = ((IDirect3DSurface8Impl *)pSourceSurface)->bytesPerPixel;
- int pitchFrom = ((IDirect3DSurface8Impl *)pSourceSurface)->myDesc.Width * 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 i;
/* Copy rect by rect */
- for (i=0; i<cRects; i++) {
- CONST RECT *r = &pSourceRectsArray[i];
- CONST POINT *p = &pDestPointsArray[i];
- char *from;
- char *to;
- int copyperline = (r->right - r->left) * bytesPerPixel;
+ for (i = 0; i < cRects; i++) {
+ CONST RECT* r = &pSourceRectsArray[i];
+ CONST POINT* p = &pDestPointsArray[i];
+ int copyperline = (r->right - r->left) * bytesPerPixel;
int j;
- D3DLOCKED_RECT lr;
- RECT dest_rect;
+ D3DLOCKED_RECT lrSrc;
+ D3DLOCKED_RECT lrDst;
+ RECT dest_rect;
+
- TRACE("Copying rect %d (%ld,%ld),(%ld,%ld) -> (%ld,%ld)\n", i, r->left, r->top,
- r->right, r->bottom, p->x, p->y);
+ TRACE("Copying rect %d (%ld,%ld),(%ld,%ld) -> (%ld,%ld)\n", i, r->left, r->top, r->right, r->bottom, p->x, p->y);
- IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)src, &lr, r, D3DLOCK_READONLY);
- dest_rect.left = p->x;
- dest_rect.top = p->y;
+ IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) src, &lrSrc, r, D3DLOCK_READONLY);
+ dest_rect.left = p->x;
+ dest_rect.top = p->y;
dest_rect.right = p->x + (r->right - r->left);
- dest_rect.left = p->y + (r->bottom - r->top);
- IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8)dst, &lr, &dest_rect, 0L);
+ dest_rect.left = p->y + (r->bottom - r->top);
+ IDirect3DSurface8Impl_LockRect((LPDIRECT3DSURFACE8) dst, &lrDst, &dest_rect, 0L);
TRACE("Locked src and dst\n");
/* Find where to start */
+#if 0
from = copyfrom + (r->top * pitchFrom) + (r->left * bytesPerPixel);
to = copyto + (p->y * pitchTo) + (p->x * bytesPerPixel);
-
/* Copy line by line */
- for (j=0; j<(r->bottom - r->top); j++) {
- memcpy(to + (j*pitchTo), from + (j*pitchFrom), copyperline);
+ for (j = 0; j < (r->bottom - r->top); j++) {
+ memcpy(to + (j * pitchTo), from + (j * pitchFrom), copyperline);
}
+#endif
- IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)src);
- IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8)dst);
+ for (j = 0; j < (r->bottom - r->top); j++) {
+ memcpy((char*) lrDst.pBits + (j * lrDst.Pitch), (char*) lrSrc.pBits + (j * lrSrc.Pitch), copyperline);
+ }
+
+ IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) src);
+ IDirect3DSurface8Impl_UnlockRect((LPDIRECT3DSURFACE8) dst);
TRACE("Unlocked src and dst\n");
}
+
+ } else {
+
+ FIXME("Wanted to copy partial surfaces not implemented\n");
+ rc = D3DERR_INVALIDCALL;
+
+ }
}
/* Set dirty */
@@ -1810,24 +1929,43 @@
HRESULT WINAPI IDirect3DDevice8Impl_GetFrontBuffer(LPDIRECT3DDEVICE8 iface, IDirect3DSurface8* pDestSurface) {
HRESULT hr;
D3DLOCKED_RECT lockedRect;
+ RECT wantedRect;
GLint prev_store;
GLenum prev_read;
ICOM_THIS(IDirect3DDevice8Impl,iface);
- FIXME("(%p) : stub\n", This);
+ FIXME("(%p) : see if behavior correct\n", This);
if (D3DFMT_A8R8G8B8 != ((IDirect3DSurface8Impl*) pDestSurface)->myDesc.Format) {
+ ERR("(%p) : surface(%p) have a invalid format\n", This, pDestSurface);
return D3DERR_INVALIDCALL;
}
-
- hr = IDirect3DSurface8Impl_LockRect(pDestSurface, &lockedRect, NULL, 0);
+
+ wantedRect.left = 0;
+ wantedRect.top = 0;
+ wantedRect.right = This->PresentParms.BackBufferWidth;
+ wantedRect.bottom = This->PresentParms.BackBufferHeight;
+
+ hr = IDirect3DSurface8Impl_LockRect(pDestSurface, &lockedRect, &wantedRect, 0);
if (FAILED(hr)) {
+ ERR("(%p) : cannot lock surface\n", This);
return D3DERR_INVALIDCALL;
}
ENTER_GL();
+ /*
+ {
+ IDirect3DSurface8Impl* tmp = ((IDirect3DSurface8Impl*) pDestSurface);
+ FIXME("dest:%u,%u,bpp:%u\n", tmp->myDesc.Width, tmp->myDesc.Height, tmp->bytesPerPixel);
+ FIXME("dest2:pitch%u\n", lockedRect.Pitch);
+ FIXME("src:%u,%u\n", This->PresentParms.BackBufferWidth, This->PresentParms.BackBufferHeight);
+ tmp = This->frontBuffer;
+ FIXME("src2:%u,%u,bpp:%u\n", tmp->myDesc.Width, tmp->myDesc.Height, tmp->bytesPerPixel);
+ }
+ */
+
glFlush();
vcheckGLcall("glFlush");
glGetIntegerv(GL_READ_BUFFER, &prev_read);
@@ -1839,13 +1977,25 @@
vcheckGLcall("glReadBuffer");
glPixelStorei(GL_PACK_SWAP_BYTES, TRUE);
vcheckGLcall("glPixelStorei");
+ /* stupid copy */
+ {
+ long j;
+ for (j = 0; j < This->PresentParms.BackBufferHeight; ++j) {
+ /*memcpy(lockedRect.pBits + (j * lockedRect.Pitch), This->frontBuffer->allocatedMemory + (j * i), i);*/
+ glReadPixels(0, This->PresentParms.BackBufferHeight - j - 1, This->PresentParms.BackBufferWidth, 1,
+ GL_BGRA, GL_UNSIGNED_BYTE, ((char*) lockedRect.pBits) + (j * lockedRect.Pitch));
+ vcheckGLcall("glReadPixels");
+ }
+ }
+ /*
glReadPixels(0, 0, This->PresentParms.BackBufferWidth, This->PresentParms.BackBufferHeight,
GL_BGRA, GL_UNSIGNED_BYTE, lockedRect.pBits);
- vcheckGLcall("glReadPixels");
+ */
glPixelStorei(GL_PACK_SWAP_BYTES, prev_store);
vcheckGLcall("glPixelStorei");
glReadBuffer(prev_read);
vcheckGLcall("glReadBuffer");
+
LEAVE_GL();
hr = IDirect3DSurface8Impl_UnlockRect(pDestSurface);
@@ -1906,7 +2056,7 @@
LEAVE_GL();
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count,CONST D3DRECT* pRects,DWORD Flags,D3DCOLOR Color,float Z,DWORD Stencil) {
+HRESULT WINAPI IDirect3DDevice8Impl_Clear(LPDIRECT3DDEVICE8 iface, DWORD Count, CONST D3DRECT* pRects, DWORD Flags, D3DCOLOR Color, float Z, DWORD Stencil) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
/* TODO: From MSDN This method fails if you specify the D3DCLEAR_ZBUFFER or D3DCLEAR_STENCIL flags when the
@@ -1917,9 +2067,8 @@
GLfloat old_z_clear_value;
GLint old_stencil_clear_value;
GLfloat old_color_clear_value[4];
-
int i;
- CONST D3DRECT *curRect;
+ CONST D3DRECT* curRect;
TRACE("(%p) Count (%ld), pRects (%p), Flags (%lx), Z (%f), Stencil (%ld)\n", This,
Count, pRects, Flags, Z, Stencil);
@@ -2000,7 +2149,7 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE d3dts,CONST D3DMATRIX* lpmatrix) {
+HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE d3dts, CONST D3DMATRIX* lpmatrix) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
D3DMATRIX m;
int k;
@@ -2045,11 +2194,13 @@
to the other so that if I ever find out that I need to transpose them, I
will able to do it quickly, only by changing the macro conv_mat. */
- if (d3dts <= 256) { /* WORLDMATRIX(0) == 256! */
+ if (d3dts < 256) {
switch (d3dts) {
- case D3DTS_WORLDMATRIX(0):
+#if 0
+ case D3DTS_WORLDMATRIX(0): /* WORLDMATRIX(0) == 256! so not here */
conv_mat(lpmatrix, &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)]);
break;
+#endif
case D3DTS_VIEW:
conv_mat(lpmatrix, &This->StateBlock->transforms[D3DTS_VIEW]);
@@ -2156,10 +2307,10 @@
}
} else if (d3dts >= D3DTS_TEXTURE0 && d3dts <= D3DTS_TEXTURE7) {
/* Now apply texture transforms if not applying to the dummy textures */
- Stage = d3dts-D3DTS_TEXTURE0;
+ Stage = d3dts - D3DTS_TEXTURE0;
- if (memcmp(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0], sizeof(D3DMATRIX))) {
- memcpy(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0+Stage].u.m[0][0], sizeof(D3DMATRIX));
+ if (memcmp(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0 + Stage].u.m[0][0], sizeof(D3DMATRIX))) {
+ memcpy(&This->lastTexTrans[Stage], &This->StateBlock->transforms[D3DTS_TEXTURE0 + Stage].u.m[0][0], sizeof(D3DMATRIX));
#if defined(GL_VERSION_1_3)
glActiveTexture(GL_TEXTURE0 + Stage);
@@ -2196,7 +2347,7 @@
if (viewChanged == TRUE ||
(memcmp(&This->lastWorld0, &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0], sizeof(D3DMATRIX)))) {
memcpy(&This->lastWorld0, &This->StateBlock->transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0], sizeof(D3DMATRIX));
- if (viewChanged==FALSE) {
+ if (viewChanged == FALSE) {
glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf");
}
@@ -2230,7 +2381,7 @@
m.u.s._21 = f; m.u.s._22 = f; m.u.s._23 = f; m.u.s._24 = f;
m.u.s._31 = f; m.u.s._32 = f; m.u.s._33 = f; m.u.s._34 = f;
m.u.s._41 = f; m.u.s._42 = f; m.u.s._43 = f; m.u.s._44 = f;
- if (viewChanged==FALSE) {
+ if (viewChanged == FALSE) {
glLoadMatrixf((float *) &This->StateBlock->transforms[D3DTS_VIEW].u.m[0][0]);
checkGLcall("glLoadMatrixf");
}
@@ -2367,14 +2518,14 @@
TRACE("(%p) : Emissive (%f,%f,%f,%f)\n", This, pMaterial->Emissive.r, pMaterial->Emissive.g, pMaterial->Emissive.b, pMaterial->Emissive.a);
TRACE("(%p) : Power (%f)\n", This, pMaterial->Power);
- glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float *)&This->UpdateStateBlock->material.Ambient);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, (float*) &This->UpdateStateBlock->material.Ambient);
checkGLcall("glMaterialfv");
- glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float *)&This->UpdateStateBlock->material.Diffuse);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, (float*) &This->UpdateStateBlock->material.Diffuse);
checkGLcall("glMaterialfv");
- glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float *)&This->UpdateStateBlock->material.Specular);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (float*) &This->UpdateStateBlock->material.Specular);
checkGLcall("glMaterialfv");
- glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float *)&This->UpdateStateBlock->material.Emissive);
+ glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, (float*) &This->UpdateStateBlock->material.Emissive);
checkGLcall("glMaterialfv");
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, This->UpdateStateBlock->material.Power);
checkGLcall("glMaterialf");
@@ -2393,7 +2544,7 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,CONST D3DLIGHT8* pLight) {
+HRESULT WINAPI IDirect3DDevice8Impl_SetLight(LPDIRECT3DDEVICE8 iface, DWORD Index, CONST D3DLIGHT8* pLight) {
float colRGBA[] = {0.0, 0.0, 0.0, 0.0};
float rho;
float quad_att;
@@ -2570,10 +2721,10 @@
}
if (Enable) {
- glEnable(GL_LIGHT0+Index);
+ glEnable(GL_LIGHT0 + Index);
checkGLcall("glEnable GL_LIGHT0+Index");
} else {
- glDisable(GL_LIGHT0+Index);
+ glDisable(GL_LIGHT0 + Index);
checkGLcall("glDisable GL_LIGHT0+Index");
}
return D3D_OK;
@@ -2622,7 +2773,7 @@
TRACE("Clipplane [%f,%f,%f,%f]\n", This->UpdateStateBlock->clipplane[Index][0], This->UpdateStateBlock->clipplane[Index][1],
This->UpdateStateBlock->clipplane[Index][2], This->UpdateStateBlock->clipplane[Index][3]);
- glClipPlane(GL_CLIP_PLANE0+Index, This->UpdateStateBlock->clipplane[Index]);
+ glClipPlane(GL_CLIP_PLANE0 + Index, This->UpdateStateBlock->clipplane[Index]);
glPopMatrix();
checkGLcall("glClipPlane");
@@ -2789,13 +2940,15 @@
case D3DRS_AMBIENT :
{
-
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;
- TRACE("Setting ambient to (%f,%f,%f,%f)\n", col[0],col[1],col[2],col[3]);
+ 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 ambient to (%f,%f,%f,%f)\n", col[0], col[1], col[2], col[3]);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, col);
checkGLcall("glLightModel for MODEL_AMBIENT");
@@ -2890,12 +3043,12 @@
case D3DRS_ALPHAREF :
{
int glParm = GL_LESS;
- float ref = 1.0;
+ float ref = 1.0f;
glGetIntegerv(GL_ALPHA_TEST_FUNC, &glParm);
checkGLcall("glGetFloatv(GL_ALPHA_TEST_FUNC, &glParm);");
- ref = ((float) Value) / 255.0;
+ ref = ((float) Value) / 255.0f;
TRACE("glAlphaFunc with Parm=%x, ref=%f\n", glParm, ref);
glAlphaFunc(glParm, ref);
checkGLcall("glAlphaFunc");
@@ -2965,11 +3118,13 @@
/* Note the texture color applies to all textures whereas
GL_TEXTURE_ENV_COLOR applies to active only */
float col[4];
- 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;
-
+#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");
@@ -3157,20 +3312,35 @@
case D3DRS_FOGCOLOR :
{
float col[4];
- 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;
-
+#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]);
checkGLcall("glFog GL_FOG_COLOR");
}
break;
+ case D3DRS_FOGTABLEMODE :
+ {
+ switch (Value) {
+ case D3DFOG_NONE: /* I don't know what to do here */ break;
+ case D3DFOG_EXP: glFogi(GL_FOG_MODE, GL_EXP); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP"); break;
+ case D3DFOG_EXP2: glFogi(GL_FOG_MODE, GL_EXP2); checkGLcall("glFogi(GL_FOG_MODE, GL_EXP2"); break;
+ case D3DFOG_LINEAR: glFogi(GL_FOG_MODE, GL_LINEAR); checkGLcall("glFogi(GL_FOG_MODE, GL_LINEAR"); break;
+ default:
+ FIXME("Unsupported Value(%lu) for D3DRS_FOGTABLEMODE!\n", Value);
+ }
+ }
+ break;
+
case D3DRS_FOGSTART :
{
- float *f = (float *)&Value;
+ float *f = (float*) &Value;
glFogfv(GL_FOG_START, f);
checkGLcall("glFogf(GL_FOG_START, (float) Value)");
TRACE("Fog Start == %f\n", *f);
@@ -3179,7 +3349,7 @@
case D3DRS_FOGEND :
{
- float *f = (float *)&Value;
+ float *f = (float*) &Value;
glFogfv(GL_FOG_END, f);
checkGLcall("glFogf(GL_FOG_END, (float) Value)");
TRACE("Fog End == %f\n", *f);
@@ -3268,7 +3438,6 @@
case D3DRS_LINEPATTERN :
case D3DRS_LASTPIXEL :
case D3DRS_ZVISIBLE :
- case D3DRS_FOGTABLEMODE :
case D3DRS_EDGEANTIALIAS :
case D3DRS_ZBIAS :
case D3DRS_RANGEFOGENABLE :
@@ -3383,7 +3552,7 @@
HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : returning %p for stage %ld\n", This, This->UpdateStateBlock->textures[Stage], Stage);
- *ppTexture = (LPDIRECT3DBASETEXTURE8)This->UpdateStateBlock->textures[Stage];
+ *ppTexture = (LPDIRECT3DBASETEXTURE8) This->UpdateStateBlock->textures[Stage];
IDirect3DBaseTexture8Impl_AddRef(*ppTexture);
return D3D_OK;
}
@@ -3438,9 +3607,9 @@
textureType = IDirect3DBaseTexture8Impl_GetType(pTexture);
if (textureType == D3DRTYPE_TEXTURE) {
- IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl *) pTexture;
+ IDirect3DTexture8Impl *pTexture2 = (IDirect3DTexture8Impl*) pTexture;
- if ((void *)oldTxt == (void *)pTexture2 && pTexture2->Dirty == FALSE) {
+ if ((void*) oldTxt == (void*) pTexture2 && pTexture2->Dirty == FALSE) {
TRACE("Skipping setting texture as old == new\n");
reapplyStates = FALSE;
} else {
@@ -3450,16 +3619,22 @@
This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_2D;
/* Load up the texture now */
- IDirect3DTexture8Impl_PreLoad((LPDIRECT3DTEXTURE8)pTexture);
+ 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++)
{
@@ -3507,9 +3682,17 @@
pTexture2->Dirty = FALSE;
}
}
+#endif
- } else {
- FIXME("(%p) : Incorrect type for a texture : %d\n", This, textureType);
+ } else if (textureType == D3DRTYPE_CUBETEXTURE) {
+ /* Standard Cube texture */
+ FIXME("Standard Cube texture\n");
+ /*This->UpdateStateBlock->textureDimensions[Stage] = GL_TEXTURE_4D;*/
+
+ /* 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));
}
} else {
TRACE("Setting to no texture (ie default texture)\n");
@@ -3535,12 +3718,12 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage,D3DTEXTURESTAGESTATETYPE Type,DWORD Value) {
+HRESULT WINAPI IDirect3DDevice8Impl_SetTextureStageState(LPDIRECT3DDEVICE8 iface, DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
/* FIXME: Handle 3d textures? What if TSS value set before set texture? Need to reapply all values? */
- TRACE("(%p) : stub, Stage=%ld, Type=%d, Value =%ld\n", This, Stage, Type, Value);
+ TRACE("(%p) : stub, Stage=%ld, Type=%d, Value=%ld\n", This, Stage, Type, Value);
/* Reject invalid texture units */
if (Stage >= This->TextureUnits) {
@@ -3724,44 +3907,48 @@
case D3DTOP_SELECTARG1 :
{
+ /*FIXME("see if D3DTOP_SELECTARG1 behavior is correct now!\n");*/
glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
-#if 0 /* don't seem to do anything */
- BOOL isAlphaOp = (Type == D3DTSS_ALPHAOP);
- DWORD dwValue = 0;
- GLenum source;
- GLenum operand;
- dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
- GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
- if (isAlphaOp) {
- TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_ALPHA_EXT, source, GL_OPERAND0_ALPHA_EXT, operand);
- glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, source);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, 'source')");
- glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, operand);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, 'operand')");
- } else {
- TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_RGB_EXT, source, GL_OPERAND0_RGB_EXT, operand);
- glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, source);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
- glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, operand);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, 'operand')");
- }
- dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
- GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
- if (isAlphaOp) {
- TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_ALPHA_EXT, source, GL_OPERAND1_ALPHA_EXT, operand);
- glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, source);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, 'source')");
- glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, operand);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, 'operand')");
- } else {
- TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_RGB_EXT, source, GL_OPERAND1_RGB_EXT, operand);
- glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, source);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, 'source')");
- glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, operand);
- checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, 'operand')");
+#if 0 /* don't seem to do anything */
+ {
+ BOOL isAlphaOp = (Type == D3DTSS_ALPHAOP);
+ DWORD dwValue = 0;
+ GLenum source;
+ GLenum operand;
+
+ dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG1 : D3DTSS_COLORARG1];
+ GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+ if (isAlphaOp) {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_ALPHA_EXT, source, GL_OPERAND0_ALPHA_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_ALPHA_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA_EXT, 'operand')");
+ } else {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE0_RGB_EXT, source, GL_OPERAND0_RGB_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_EXT, 'operand')");
+ }
+ dwValue = This->StateBlock->texture_state[Stage][(isAlphaOp) ? D3DTSS_ALPHAARG2 : D3DTSS_COLORARG2];
+ GetSrcAndOpFromValue(dwValue, isAlphaOp, &source, &operand);
+ if (isAlphaOp) {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_ALPHA_EXT, source, GL_OPERAND1_ALPHA_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_ALPHA_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA_EXT, 'operand')");
+ } else {
+ TRACE("Source %x = %x, Operand %x = %x\n", GL_SOURCE1_RGB_EXT, source, GL_OPERAND1_RGB_EXT, operand);
+ glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, source);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_EXT, 'source')");
+ glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, operand);
+ checkGLcall("glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_EXT, 'operand')");
+ }
}
-#endif
+#endif
}
break;
@@ -3771,6 +3958,7 @@
DWORD dwValue = 0;
GLenum source;
GLenum operand;
+ /*FIXME("see if D3DTOP_SELECTARG2 behavior is correct now!\n");*/
glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE);
checkGLcall("glTexEnvi(GL_TEXTURE_ENV, Parm, GL_REPLACE)");
/* GL_REPLACE, swap args 0 and 1? */
@@ -3926,11 +4114,13 @@
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]);
checkGLcall("glTexParameteri(..., GL_TEXTURE_BORDER_COLOR, ...)");
@@ -4137,7 +4327,7 @@
HRESULT res;
UINT i;
- TRACE("(%p) : VertexShader not fully supported yet : Decl=%p, Func=%p\n", This, pDeclaration, pFunction);
+ TRACE_(d3d_shader)("(%p) : VertexShader not fully supported yet : Decl=%p, Func=%p\n", This, pDeclaration, pFunction);
if (NULL == pDeclaration || NULL == pHandle) { /* pFunction can be NULL see MSDN */
return D3DERR_INVALIDCALL;
}
@@ -4168,7 +4358,7 @@
This->UpdateStateBlock->Set.vertexShader = TRUE;
if (Handle > VS_HIGHESTFIXEDFXF) { /* only valid with non FVF shaders */
- FIXME("(%p) : Created shader, Handle=%lx\n", This, Handle);
+ TRACE_(d3d_shader)("(%p) : Created shader, Handle=%lx\n", This, Handle);
This->UpdateStateBlock->vertexShaderDecl = VERTEX_SHADER_DECL(Handle);
This->UpdateStateBlock->Changed.vertexShaderDecl = TRUE;
This->UpdateStateBlock->Set.vertexShaderDecl = TRUE;
@@ -4190,7 +4380,7 @@
}
HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShader(LPDIRECT3DDEVICE8 iface, DWORD* pHandle) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- TRACE("(%p) : GetVertexShader returning %ld\n", This, This->StateBlock->VertexShader);
+ TRACE_(d3d_shader)("(%p) : GetVertexShader returning %ld\n", This, This->StateBlock->VertexShader);
*pHandle = This->StateBlock->VertexShader;
return D3D_OK;
}
@@ -4211,7 +4401,7 @@
if (NULL == object) {
return D3DERR_INVALIDCALL;
}
- FIXME("(%p) : freing VertexShader %p\n", This, object);
+ TRACE_(d3d_shader)("(%p) : freing VertexShader %p\n", This, object);
/* TODO: check validity of object */
if (NULL != object->function) HeapFree(GetProcessHeap(), 0, (void *)object->function);
HeapFree(GetProcessHeap(), 0, (void *)object->data);
@@ -4225,7 +4415,7 @@
if (NULL == attached_decl) {
return D3DERR_INVALIDCALL;
}
- FIXME("(%p) : freing VertexShaderDeclaration %p\n", This, attached_decl);
+ TRACE_(d3d_shader)("(%p) : freing VertexShaderDeclaration %p\n", This, attached_decl);
/* TODO: check validity of object */
HeapFree(GetProcessHeap(), 0, (void *)attached_decl->pDeclaration8);
HeapFree(GetProcessHeap(), 0, (void *)attached_decl);
@@ -4238,7 +4428,7 @@
ICOM_THIS(IDirect3DDevice8Impl,iface);
if (Register + ConstantCount > D3D8_VSHADER_MAX_CONSTANTS) {
- ERR("(%p) : SetVertexShaderConstant C[%lu] invalid\n", This, Register);
+ ERR_(d3d_shader)("(%p) : SetVertexShaderConstant C[%lu] invalid\n", This, Register);
return D3DERR_INVALIDCALL;
}
if (NULL == pConstantData) {
@@ -4247,14 +4437,14 @@
if (ConstantCount > 1) {
FLOAT* f = (FLOAT*)pConstantData;
UINT i;
- TRACE("(%p) : SetVertexShaderConstant C[%lu..%lu]=\n", This, Register, Register + ConstantCount - 1);
+ TRACE_(d3d_shader)("(%p) : SetVertexShaderConstant C[%lu..%lu]=\n", This, Register, Register + ConstantCount - 1);
for (i = 0; i < ConstantCount; ++i) {
- TRACE("{%f, %f, %f, %f}\n", f[0], f[1], f[2], f[3]);
+ TRACE_(d3d_shader)("{%f, %f, %f, %f}\n", f[0], f[1], f[2], f[3]);
f += 4;
}
} else {
- FLOAT* f = (FLOAT*)pConstantData;
- TRACE("(%p) : SetVertexShaderConstant, C[%lu]={%f, %f, %f, %f}\n", This, Register, f[0], f[1], f[2], f[3]);
+ FLOAT* f = (FLOAT*) pConstantData;
+ TRACE_(d3d_shader)("(%p) : SetVertexShaderConstant, C[%lu]={%f, %f, %f, %f}\n", This, Register, f[0], f[1], f[2], f[3]);
}
This->UpdateStateBlock->Changed.vertexShaderConstant = TRUE;
memcpy(&This->UpdateStateBlock->vertexShaderConstant[Register], pConstantData, ConstantCount * 4 * sizeof(FLOAT));
@@ -4263,7 +4453,7 @@
HRESULT WINAPI IDirect3DDevice8Impl_GetVertexShaderConstant(LPDIRECT3DDEVICE8 iface, DWORD Register, void* pConstantData, DWORD ConstantCount) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
- TRACE("(%p) : C[%lu] count=%ld\n", This, Register, ConstantCount);
+ TRACE_(d3d_shader)("(%p) : C[%lu] count=%ld\n", This, Register, ConstantCount);
if (Register + ConstantCount > D3D8_VSHADER_MAX_CONSTANTS) {
return D3DERR_INVALIDCALL;
}
Index: d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.25
diff -u -r1.25 d3d8_private.h
--- d3d8_private.h 12 May 2003 03:10:27 -0000 1.25
+++ d3d8_private.h 14 May 2003 08:26:38 -0000
@@ -173,7 +173,11 @@
(vec).z = D3DCOLOR_B(dw); \
(vec).w = D3DCOLOR_A(dw);
-
+#define D3DCOLORTOGLFLOAT4(dw, vec) \
+ (vec)[0] = D3DCOLOR_R(dw); \
+ (vec)[1] = D3DCOLOR_G(dw); \
+ (vec)[2] = D3DCOLOR_B(dw); \
+ (vec)[3] = D3DCOLOR_A(dw);
/* ===========================================================================
The interfactes themselves
@@ -1124,5 +1128,11 @@
GLint fmt2glintFmt(D3DFORMAT fmt);
GLenum fmt2glFmt(D3DFORMAT fmt);
DWORD fmt2glType(D3DFORMAT fmt);
+
+/**
+ * Internals debug functions
+ */
+const char* debug_d3dformat(D3DFORMAT fmt);
+const char* debug_d3dressourcetype(D3DRESOURCETYPE res);
#endif /* __WINE_D3DX8_PRIVATE_H */
More information about the wine-patches
mailing list