[D3D8 - 3] split of patch1: vertex shaders fixes
Raphaël Junqueira
fenix at club-internet.fr
Sat Jan 11 10:02:28 CST 2003
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
second patch from the split and independent from the the patch2
Changelog:
- Resend of my last vertex shader patch + improvements
- move input and output data in VertexShader struct
- better traces
- specific input data filling function for vertex shaders using vertex shader declaration (and not FVF ... maybe FVF will return for fast path with simples vertex shader declarations)
- huge vertex shader fixes:
- add and fix many vs (1.0->2.0) used opcodes in complex shaders
- improvements to programs parser: parse comments, version, ..
- add a vertex shader input filler function (parsing vertex shader declaration): almost complete
- comments most of the traces (else flood ...)
- add more urls in comments
- indent, cleanups
This patch have a warning because of empty macro (needed for GL extension work)
l'll fix it later
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE+IEAUp7NA3AmQTU4RAjteAJ0UPH7qRUlRL7uf53I4stGIiSAhngCZAcWj
CJ7Xz9LakW/mmtesUrvg4qI=
=Bquw
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: dlls/d3d8/d3d8_main.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_main.c,v
retrieving revision 1.6
diff -u -r1.6 d3d8_main.c
--- dlls/d3d8/d3d8_main.c 17 Dec 2002 01:15:16 -0000 1.6
+++ dlls/d3d8/d3d8_main.c 11 Jan 2003 15:00:02 -0000
@@ -22,6 +22,9 @@
#include "winuser.h"
#include "wine/debug.h"
+#include "config.h"
+#include "x11drv.h"
+
#include "d3d8.h"
#include "d3d8_private.h"
Index: dlls/d3d8/d3d8_private.h
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8_private.h,v
retrieving revision 1.10
diff -u -r1.10 d3d8_private.h
--- dlls/d3d8/d3d8_private.h 2 Jan 2003 17:59:02 -0000 1.10
+++ dlls/d3d8/d3d8_private.h 11 Jan 2003 15:00:43 -0000
@@ -42,6 +42,8 @@
/* X11 locking */
+#include "x11drv.h"
+
extern void (*wine_tsx11_lock_ptr)(void);
extern void (*wine_tsx11_unlock_ptr)(void);
@@ -98,10 +100,10 @@
typedef struct STATEBLOCK {
- D3DSTATEBLOCKTYPE blockType;
+ D3DSTATEBLOCKTYPE blockType;
- SAVEDSTATES Changed;
- SAVEDSTATES Set;
+ SAVEDSTATES Changed;
+ SAVEDSTATES Set;
/* Light Enable */
BOOL lightEnable[MAX_ACTIVE_LIGHTS];
@@ -150,6 +152,10 @@
/* TODO: Vertex Shader Constant */
+ /* Indexed Vertex Blending */
+ D3DVERTEXBLENDFLAGS vertex_blend;
+ FLOAT tween_factor;
+
} STATEBLOCK;
typedef struct D3DSHADERVECTOR {
@@ -176,6 +182,20 @@
UINT codeLength;
} SHADERDATA8;
+/** temporary here waiting for buffer code */
+typedef struct VSHADERINPUTDATA8 {
+ D3DSHADERVECTOR V[16];
+} VSHADERINPUTDATA8;
+
+/** temporary here waiting for buffer code */
+typedef struct VSHADEROUTPUTDATA8 {
+ D3DSHADERVECTOR oPos;
+ D3DSHADERVECTOR oD[2];
+ D3DSHADERVECTOR oT[4];
+ D3DSHADERVECTOR oFog;
+ D3DSHADERVECTOR oPts;
+} VSHADEROUTPUTDATA8;
+
typedef struct VERTEXSHADER8 { /* TODO: Vertex Shader */
DWORD* decl;
DWORD* function;
@@ -186,6 +206,8 @@
DWORD version;
/* run time datas */
SHADERDATA8* data;
+ VSHADERINPUTDATA8 input;
+ VSHADEROUTPUTDATA8 output;
} VERTEXSHADER8;
typedef struct PIXELSHADER8 { /* TODO: Pixel Shader */
@@ -196,20 +218,6 @@
SHADERDATA8* data;
} PIXELSHADER8;
-/** temporary here waiting for buffer code */
-typedef struct VSHADERINPUTDATA8 {
- D3DSHADERVECTOR V[16];
-} VSHADERINPUTDATA8;
-
-/** temporary here waiting for buffer code */
-typedef struct VSHADEROUTPUTDATA8 {
- D3DSHADERVECTOR oPos;
- D3DSHADERVECTOR oD[2];
- D3DSHADERVECTOR oT[4];
- D3DSHADERVECTOR oFog;
- D3DSHADERVECTOR oPts;
-} VSHADEROUTPUTDATA8;
-
/*
* External prototypes
*/
@@ -229,6 +237,29 @@
} \
}
+#define checkGLSupport(ExtName) FALSE/*(TRUE == This->direct3d8->glInfo.supported[ExtName])*/
+#define GLExtCall(FuncName) /*(This->direct3d8->glInfo.FuncName)*/
+
+
+#define D3DCOLOR_R(dw) (((float) (((dw) >> 16) & 0xFF)) / 255.0f)
+#define D3DCOLOR_G(dw) (((float) (((dw) >> 8) & 0xFF)) / 255.0f)
+#define D3DCOLOR_B(dw) (((float) (((dw) >> 0) & 0xFF)) / 255.0f)
+#define D3DCOLOR_A(dw) (((float) (((dw) >> 24) & 0xFF)) / 255.0f)
+
+#define D3DCOLORTOCOLORVALUE(dw, col) \
+ (col).r = D3DCOLOR_R(dw); \
+ (col).g = D3DCOLOR_G(dw); \
+ (col).b = D3DCOLOR_B(dw); \
+ (col).a = D3DCOLOR_A(dw);
+
+#define D3DCOLORTOVECTOR4(dw, vec) \
+ (vec).x = D3DCOLOR_R(dw); \
+ (vec).y = D3DCOLOR_G(dw); \
+ (vec).z = D3DCOLOR_B(dw); \
+ (vec).w = D3DCOLOR_A(dw);
+
+
+
/* ===========================================================================
The interfactes themselves
=========================================================================== */
@@ -929,5 +960,6 @@
DWORD vshader_decl_parse(VERTEXSHADER8* vshader);
DWORD vshader_program_parse(VERTEXSHADER8* vshader);
BOOL vshader_program_execute_SW(VERTEXSHADER8* vshader, VSHADERINPUTDATA8* input, VSHADEROUTPUTDATA8* output);
+VOID vshader_fill_input(VERTEXSHADER8* vshader, IDirect3DDevice8Impl* device, const void* vertexFirstStream, DWORD StartVertexIndex, DWORD idxDecal);
#endif /* __WINE_D3DX8_PRIVATE_H */
Index: dlls/d3d8/device.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/device.c,v
retrieving revision 1.23
diff -u -r1.23 device.c
--- dlls/d3d8/device.c 9 Jan 2003 06:02:39 -0000 1.23
+++ dlls/d3d8/device.c 11 Jan 2003 15:01:10 -0000
@@ -106,7 +106,6 @@
int NumVertexes = NumPrimitives;
VERTEXSHADER8* vertex_shader = NULL;
- VSHADERINPUTDATA8 vertex_shader_input;
BOOL useVertexShaderFunction = FALSE;
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -127,7 +126,7 @@
}
fvf = (D3DFORMAT) vertex_shader->fvf;
TRACE("vertex shader declared FVF: %lx\n", vertex_shader->fvf);
- memset(&vertex_shader_input, 0, sizeof(VSHADERINPUTDATA8));
+ memset(&vertex_shader->input, 0, sizeof(VSHADERINPUTDATA8));
}
{
@@ -302,22 +301,11 @@
curPos = curPos + sizeof(float);
VTRACE(("x,y,z=%f,%f,%f\n", x,y,z));
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_POSITION].x = x;
- vertex_shader_input.V[D3DVSDE_POSITION].y = y;
- vertex_shader_input.V[D3DVSDE_POSITION].z = z;
- vertex_shader_input.V[D3DVSDE_POSITION].w = 1.0f;
- }
-
/* RHW follows, only if transformed */
if (isRHW) {
rhw = *(float *)curPos;
curPos = curPos + sizeof(float);
VTRACE(("rhw=%f\n", rhw));
-
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_POSITION].w = rhw;
- }
}
/* Blending data */
@@ -335,20 +323,6 @@
skippedBlendLastUByte4 = *(DWORD*)curPos;
curPos = curPos + sizeof(DWORD);
}
-
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_BLENDWEIGHT].x = skippedBlend.x;
- vertex_shader_input.V[D3DVSDE_BLENDWEIGHT].y = skippedBlend.y;
- vertex_shader_input.V[D3DVSDE_BLENDWEIGHT].z = skippedBlend.z;
- vertex_shader_input.V[D3DVSDE_BLENDWEIGHT].w = skippedBlend.w;
-
- if (isLastUByte4) {
- vertex_shader_input.V[D3DVSDE_BLENDINDICES].x = (float) skippedBlendLastUByte4;
- vertex_shader_input.V[D3DVSDE_BLENDINDICES].y = (float) skippedBlendLastUByte4;
- vertex_shader_input.V[D3DVSDE_BLENDINDICES].z = (float) skippedBlendLastUByte4;
- vertex_shader_input.V[D3DVSDE_BLENDINDICES].w = (float) skippedBlendLastUByte4;
- }
- }
}
/* Vertex Normal Data (untransformed only) */
@@ -360,52 +334,24 @@
nz = *(float *)curPos;
curPos = curPos + sizeof(float);
VTRACE(("nx,ny,nz=%f,%f,%f\n", nx,ny,nz));
-
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_NORMAL].x = nx;
- vertex_shader_input.V[D3DVSDE_NORMAL].y = ny;
- vertex_shader_input.V[D3DVSDE_NORMAL].z = nz;
- vertex_shader_input.V[D3DVSDE_NORMAL].w = 1.0f;
- }
}
if (isPtSize) {
ptSize = *(float *)curPos;
VTRACE(("ptSize=%f\n", ptSize));
curPos = curPos + sizeof(float);
-
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_PSIZE].x = ptSize;
- vertex_shader_input.V[D3DVSDE_PSIZE].y = 0.0f;
- vertex_shader_input.V[D3DVSDE_PSIZE].z = 0.0f;
- vertex_shader_input.V[D3DVSDE_PSIZE].w = 1.0f;
- }
}
if (isDiffuse) {
diffuseColor = *(DWORD *)curPos;
VTRACE(("diffuseColor=%lx\n", diffuseColor));
curPos = curPos + sizeof(DWORD);
-
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_DIFFUSE].x = (float) (((diffuseColor >> 16) & 0xFF) / 255.0f);
- vertex_shader_input.V[D3DVSDE_DIFFUSE].y = (float) (((diffuseColor >> 8) & 0xFF) / 255.0f);
- vertex_shader_input.V[D3DVSDE_DIFFUSE].z = (float) (((diffuseColor >> 0) & 0xFF) / 255.0f);
- vertex_shader_input.V[D3DVSDE_DIFFUSE].w = (float) (((diffuseColor >> 24) & 0xFF) / 255.0f);
- }
}
if (isSpecular) {
specularColor = *(DWORD *)curPos;
VTRACE(("specularColor=%lx\n", specularColor));
curPos = curPos + sizeof(DWORD);
-
- if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_SPECULAR].x = (float) (((specularColor >> 16) & 0xFF) / 255.0f);
- vertex_shader_input.V[D3DVSDE_SPECULAR].y = (float) (((specularColor >> 8) & 0xFF) / 255.0f);
- vertex_shader_input.V[D3DVSDE_SPECULAR].z = (float) (((specularColor >> 0) & 0xFF) / 255.0f);
- vertex_shader_input.V[D3DVSDE_SPECULAR].w = (float) (((specularColor >> 24) & 0xFF) / 255.0f);
- }
}
/* ToDo: Texture coords */
@@ -432,10 +378,7 @@
VTRACE(("tex:%d, s,t=%f,%f\n", textureNo, s,t));
if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].x = s;
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].y = t;
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].z = 0.0f;
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].w = 1.0f;
+ /* Nothing to do */
} else {
if (This->isMultiTexture) {
glMultiTexCoord2fARB(GL_TEXTURE0_ARB + textureNo, s, t);
@@ -455,10 +398,7 @@
VTRACE(("tex:%d, s,t,r=%f,%f,%f\n", textureNo, s,t,r));
if (TRUE == useVertexShaderFunction) {
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].x = s;
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].y = t;
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].z = r;
- vertex_shader_input.V[D3DVSDE_TEXCOORD0 + textureNo].w = 1.0f;
+ /* Nothing to do */
} else {
if (This->isMultiTexture) {
glMultiTexCoord3fARB(GL_TEXTURE0_ARB + textureNo, s, t, r);
@@ -481,38 +421,53 @@
/** if vertex shader program specified ... using it */
if (TRUE == useVertexShaderFunction) {
- VSHADEROUTPUTDATA8 vs_o;
- memset(&vs_o, 0, sizeof(VSHADEROUTPUTDATA8));
- vshader_program_execute_SW(vertex_shader, &vertex_shader_input, &vs_o);
+
+ /**
+ * this code must become the really
+ * vs input params init
+ *
+ * because its possible to use input registers for anything
+ * and some samples use registers for other things than they are
+ * declared
+ */
+
+ /**
+ * no really valid declaration, user defined input register use
+ * so fill input registers as described in vertex shader declaration
+ */
+ vshader_fill_input(vertex_shader, This, vertexBufData, StartVertexIndex,
+ (!isIndexed) ? (vx_index * skip) :
+ (idxBytes == 2) ? ((pIdxBufS[StartIdx + vx_index]) * skip) :
+ ((pIdxBufL[StartIdx + vx_index]) * skip));
+
+ memset(&vertex_shader->output, 0, sizeof(VSHADEROUTPUTDATA8));
+ vshader_program_execute_SW(vertex_shader, &vertex_shader->input, &vertex_shader->output);
/*
- TRACE_VECTOR(vs_o.oPos);
- TRACE_VECTOR(vs_o.oD[0]);
- TRACE_VECTOR(vs_o.oT[0]);
- TRACE_VECTOR(vs_o.oT[1]);
+ TRACE_VECTOR(vertex_shader->output.oPos);
+ TRACE_VECTOR(vertex_shader->output.oD[0]);
+ TRACE_VECTOR(vertex_shader->output.oD[1]);
+ TRACE_VECTOR(vertex_shader->output.oT[0]);
+ TRACE_VECTOR(vertex_shader->output.oT[1]);
*/
- x = vs_o.oPos.x;
- y = vs_o.oPos.y;
- z = vs_o.oPos.z;
+ x = vertex_shader->output.oPos.x;
+ y = vertex_shader->output.oPos.y;
+ z = vertex_shader->output.oPos.z;
+
+ if (1.0f != vertex_shader->output.oPos.w || isRHW) {
+ rhw = vertex_shader->output.oPos.w;
+ }
+ /*diffuseColor = D3DCOLOR_COLORVALUE(vertex_shader->output.oD[0]);*/
+ glColor4fv((float*) &vertex_shader->output.oD[0]);
+
+ /* Requires secondary color extensions to compile... */
+ if (checkGLSupport(EXT_SECONDARY_COLOR)) {
+ /*specularColor = D3DCOLOR_COLORVALUE(vertex_shader->output.oD[1]);*/
+ GLExtCall(glSecondaryColor3fvEXT)((float*) &vertex_shader->output.oD[1]);
+ /*checkGLcall("glSecondaryColor3fvEXT");*/
+ }
- if (1.0f != vs_o.oPos.w || isRHW) {
- rhw = vs_o.oPos.w;
- }
- /*TRACE_VECTOR(vs_o.oPos);*/
- if (isDiffuse) {
- /*diffuseColor = D3DCOLOR_COLORVALUE(vs_o.oD[0].x, vs_o.oD[0].y, vs_o.oD[0].z, vs_o.oD[0].w);*/
- /*TRACE_VECTOR(vs_o.oD[0]);*/
- /*glColor4f(vs_o.oD[0].x, vs_o.oD[0].y, vs_o.oD[0].z, vs_o.oD[0].w); */
- glMaterialfv(GL_FRONT, GL_DIFFUSE, (float*) &vs_o.oD[0]);
- checkGLcall("glMaterialfv");
- }
- if (isSpecular) {
- /*specularColor = D3DCOLOR_COLORVALUE(vs_o.oD[1].x, vs_o.oD[1].y, vs_o.oD[1].z, vs_o.oD[1].w);*/
- /*TRACE_VECTOR(vs_o.oD[1]);*/
- glMaterialfv(GL_FRONT, GL_SPECULAR, (float*) &vs_o.oD[1]);
- checkGLcall("glMaterialfv");
- }
- /** reupdate textures coords binding using vs_o.oT[0->3] */
- for (textureNo = 0; textureNo < 4/*min(numTextures, 4)*/; ++textureNo) {
+ /** 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) {
@@ -523,31 +478,31 @@
if (This->StateBlock.textures[textureNo] != NULL) {
switch (IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) This->StateBlock.textures[textureNo])) {
case D3DRTYPE_TEXTURE:
- /*TRACE_VECTOR(vs_o.oT[textureNo]);*/
- s = vs_o.oT[textureNo].x;
- t = vs_o.oT[textureNo].y;
- VTRACE(("tex:%d, s,t=%f,%f\n", textureNo, s,t));
+ /*TRACE_VECTOR(vertex_shader->output.oT[textureNo]);*/
+ s = vertex_shader->output.oT[textureNo].x;
+ t = vertex_shader->output.oT[textureNo].y;
+ VTRACE(("tex:%d, s,t=%f,%f\n", textureNo, s, t));
if (This->isMultiTexture) {
glMultiTexCoord2fARB(GL_TEXTURE0_ARB + textureNo, s, t);
- checkGLcall("glMultiTexCoord2fARB");
+ /*checkGLcall("glMultiTexCoord2fARB");*/
} else {
glTexCoord2f(s, t);
- checkGLcall("gTexCoord2f");
+ /*checkGLcall("gTexCoord2f");*/
}
break;
case D3DRTYPE_VOLUMETEXTURE:
- /*TRACE_VECTOR(vs_o.oT[textureNo]);*/
- s = vs_o.oT[textureNo].x;
- t = vs_o.oT[textureNo].y;
- r = vs_o.oT[textureNo].z;
- VTRACE(("tex:%d, s,t,r=%f,%f,%f\n", textureNo, s,t,r));
+ /*TRACE_VECTOR(vertex_shader->output.oT[textureNo]);*/
+ s = vertex_shader->output.oT[textureNo].x;
+ t = vertex_shader->output.oT[textureNo].y;
+ r = vertex_shader->output.oT[textureNo].z;
+ VTRACE(("tex:%d, s,t,r=%f,%f,%f\n", textureNo, s, t, r));
if (This->isMultiTexture) {
glMultiTexCoord3fARB(GL_TEXTURE0_ARB + textureNo, s, t, r);
- checkGLcall("glMultiTexCoord2fARB");
+ /*checkGLcall("glMultiTexCoord2fARB");*/
} else {
glTexCoord3f(s, t, r);
- checkGLcall("gTexCoord3f");
+ /*checkGLcall("gTexCoord3f");*/
}
break;
@@ -562,11 +517,11 @@
if (1.0f == rhw || rhw < 0.01f) {
VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z));
glVertex3f(x, y, z);
- checkGLcall("glVertex3f");
+ /*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);
- checkGLcall("glVertex4f");
+ /*checkGLcall("glVertex4f");*/
}
} else {
/**
Index: dlls/d3d8/shader.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/shader.c,v
retrieving revision 1.4
diff -u -r1.4 shader.c
--- dlls/d3d8/shader.c 2 Jan 2003 19:28:09 -0000 1.4
+++ dlls/d3d8/shader.c 11 Jan 2003 15:03:24 -0000
@@ -26,6 +26,9 @@
#include <math.h>
+#include "config.h"
+#include "x11drv.h"
+
#include "d3d8_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
@@ -54,6 +57,12 @@
*
* FVF
* http://msdn.microsoft.com/library/en-us/directx9_c/directx/graphics/programmingguide/GettingStarted/VertexFormats/vformats.asp
+ *
+ * NVIDIA: DX8 Vertex Shader to NV Vertex Program
+ * http://developer.nvidia.com/view.asp?IO=vstovp
+ *
+ * NVIDIA: Memory Management with VAR
+ * http://developer.nvidia.com/view.asp?IO=var_memory_management
*/
typedef void (*shader_fct_t)();
@@ -137,10 +146,14 @@
void vshader_expp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) {
float tmp_f = floorf(s0->w);
- d->x = powf(2.0f, tmp_f);
- d->y = s0->w - tmp_f;
- d->z = powf(2.0f, s0->w);
- d->w = 1.0f;
+ DWORD tmp_d = 0;
+ tmp_f = powf(2.0f, s0->w);
+ tmp_d = *((DWORD*) &tmp_f) & 0xFFFFFF00;
+
+ d->x = powf(2.0f, tmp_f);
+ d->y = s0->w - tmp_f;
+ d->z = *((float*) &tmp_d);
+ d->w = 1.0f;
/*
DPRINTF("executing exp: s0=(%f, %f, %f, %f) => d=(%f, %f, %f, %f)\n",
@@ -245,27 +258,123 @@
}
/**
+ * Version 1.1 specific
+ */
+
+void vshader_exp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) {
+ d->x = d->y = d->z = d->w = powf(2.0f, s0->w);
+}
+
+void vshader_log(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) {
+ float tmp_f = fabsf(s0->w);
+ d->x = d->y = d->z = d->w = (0.0f != tmp_f) ? logf(tmp_f) / logf(2.0f) : -HUGE;
+}
+
+void vshader_frc(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0) {
+ d->x = s0->x - floorf(s0->x);
+ d->y = s0->y - floorf(s0->y);
+ d->z = 0.0f;
+ d->w = 1.0f;
+}
+
+typedef FLOAT D3DMATRIX44[4][4];
+typedef FLOAT D3DMATRIX43[4][3];
+typedef FLOAT D3DMATRIX34[4][4];
+typedef FLOAT D3DMATRIX33[4][3];
+typedef FLOAT D3DMATRIX32[4][2];
+
+void vshader_m4x4(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, /*D3DSHADERVECTOR* mat1*/ D3DMATRIX44 mat) {
+ /*
+ * BuGGY CODE: here only if cast not work for copy/paste
+ D3DSHADERVECTOR* mat2 = mat1 + 1;
+ D3DSHADERVECTOR* mat3 = mat1 + 2;
+ D3DSHADERVECTOR* mat4 = mat1 + 3;
+ d->x = mat1->x * s0->x + mat2->x * s0->y + mat3->x * s0->z + mat4->x * s0->w;
+ d->y = mat1->y * s0->x + mat2->y * s0->y + mat3->y * s0->z + mat4->y * s0->w;
+ d->z = mat1->z * s0->x + mat2->z * s0->y + mat3->z * s0->z + mat4->z * s0->w;
+ d->w = mat1->w * s0->x + mat2->w * s0->y + mat3->w * s0->z + mat4->w * s0->w;
+ */
+ d->x = mat[0][0] * s0->x + mat[0][1] * s0->y + mat[0][2] * s0->z + mat[0][3] * s0->w;
+ d->y = mat[1][0] * s0->x + mat[1][1] * s0->y + mat[1][2] * s0->z + mat[1][3] * s0->w;
+ d->z = mat[2][0] * s0->x + mat[2][1] * s0->y + mat[2][2] * s0->z + mat[2][3] * s0->w;
+ d->w = mat[3][0] * s0->x + mat[3][1] * s0->y + mat[3][2] * s0->z + mat[3][3] * s0->w;
+}
+
+void vshader_m4x3(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, D3DMATRIX43 mat) {
+ FIXME("check\n");
+ d->x = mat[0][0] * s0->x + mat[0][1] * s0->y + mat[0][2] * s0->z + mat[0][3] * s0->w;
+ d->y = mat[1][0] * s0->x + mat[1][1] * s0->y + mat[1][2] * s0->z + mat[1][3] * s0->w;
+ d->z = mat[2][0] * s0->x + mat[2][1] * s0->y + mat[2][2] * s0->z + mat[2][3] * s0->w;
+ d->w = 1.0f;
+}
+
+void vshader_m3x4(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, D3DMATRIX34 mat) {
+ FIXME("check\n");
+ d->x = mat[0][0] * s0->x + mat[0][1] * s0->y + mat[0][2] * s0->z;
+ d->y = mat[2][0] * s0->x + mat[1][1] * s0->y + mat[1][2] * s0->z;
+ d->z = mat[2][0] * s0->x + mat[2][1] * s0->y + mat[2][2] * s0->z;
+ d->w = mat[3][0] * s0->x + mat[3][1] * s0->y + mat[3][2] * s0->z;
+}
+
+void vshader_m3x3(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, D3DMATRIX33 mat) {
+ FIXME("check\n");
+ d->x = mat[0][0] * s0->x + mat[0][1] * s0->y + mat[2][2] * s0->z;
+ d->y = mat[1][0] * s0->x + mat[1][1] * s0->y + mat[2][2] * s0->z;
+ d->z = mat[2][0] * s0->x + mat[2][1] * s0->y + mat[2][2] * s0->z;
+ d->w = 1.0f;
+}
+
+void vshader_m3x2(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, D3DMATRIX32 mat) {
+ FIXME("check\n");
+ d->x = mat[0][0] * s0->x + mat[0][1] * s0->y + mat[0][2] * s0->z;
+ d->y = mat[1][0] * s0->x + mat[1][1] * s0->y + mat[1][2] * s0->z;
+ d->z = 0.0f;
+ d->w = 1.0f;
+}
+
+/**
+ * Version 2.0 specific
+ */
+void vshader_lrp(D3DSHADERVECTOR* d, D3DSHADERVECTOR* s0, D3DSHADERVECTOR* s1, D3DSHADERVECTOR* s2, D3DSHADERVECTOR* s3) {
+ d->x = s0->x * (s1->x - s2->x) + s2->x;
+ d->y = s0->y * (s1->y - s2->y) + s2->y;
+ d->z = s0->z * (s1->z - s2->z) + s2->z;
+ d->w = s0->w * (s1->w - s2->w) + s2->x;
+}
+
+/**
* log, exp, frc, m*x* seems to be macros ins ... to see
*/
static CONST SHADER_OPCODE vshader_ins [] = {
+ {D3DSIO_NOP, "nop", 0, vshader_nop},
{D3DSIO_MOV, "mov", 2, vshader_mov},
- {D3DSIO_MAX, "max", 3, vshader_max},
- {D3DSIO_MIN, "min", 3, vshader_min},
- {D3DSIO_SGE, "sge", 3, vshader_sge},
- {D3DSIO_SLT, "slt", 3, vshader_slt},
{D3DSIO_ADD, "add", 3, vshader_add},
{D3DSIO_SUB, "sub", 3, vshader_sub},
+ {D3DSIO_MAD, "mad", 4, vshader_mad},
{D3DSIO_MUL, "mul", 3, vshader_mul},
{D3DSIO_RCP, "rcp", 2, vshader_rcp},
- {D3DSIO_MAD, "mad", 4, vshader_mad},
+ {D3DSIO_RSQ, "rsq", 2, vshader_rsq},
{D3DSIO_DP3, "dp3", 3, vshader_dp3},
{D3DSIO_DP4, "dp4", 3, vshader_dp4},
- {D3DSIO_RSQ, "rsq", 2, vshader_rsq},
- {D3DSIO_DST, "dst", 3, vshader_dst},
+ {D3DSIO_MIN, "min", 3, vshader_min},
+ {D3DSIO_MAX, "max", 3, vshader_max},
+ {D3DSIO_SLT, "slt", 3, vshader_slt},
+ {D3DSIO_SGE, "sge", 3, vshader_sge},
+ {D3DSIO_EXP, "exp", 2, vshader_exp},
+ {D3DSIO_LOG, "log", 2, vshader_log},
{D3DSIO_LIT, "lit", 2, vshader_lit},
+ {D3DSIO_DST, "dst", 3, vshader_dst},
+ {D3DSIO_LRP, "lrp", 5, vshader_lrp},
+ {D3DSIO_FRC, "frc", 2, vshader_frc},
+ {D3DSIO_M4x4, "m4x4", 3, vshader_m4x4},
+ {D3DSIO_M4x3, "m4x3", 3, vshader_m4x3},
+ {D3DSIO_M3x4, "m3x4", 3, vshader_m3x4},
+ {D3DSIO_M3x3, "m3x3", 3, vshader_m3x3},
+ {D3DSIO_M3x2, "m3x2", 3, vshader_m3x2},
+ /** FIXME: use direct acces so add the others opcodes as stubs */
{D3DSIO_EXPP, "expp", 2, vshader_expp},
{D3DSIO_LOGP, "logp", 2, vshader_logp},
- {D3DSIO_NOP, "nop", 0, vshader_nop},
+
{0, NULL, 0, NULL}
};
@@ -352,6 +461,14 @@
}
}
+inline static BOOL vshader_is_version_token(DWORD token) {
+ return 0xFFFE0000 == (token & 0xFFFE0000);
+}
+
+inline static BOOL vshader_is_comment_token(DWORD token) {
+ return D3DSIO_COMMENT == (token & D3DSI_OPCODE_MASK);
+}
+
/**
* Function parser ...
*/
@@ -363,13 +480,27 @@
if (NULL != pToken) {
while (D3DVS_END() != *pToken) {
+ if (vshader_is_version_token(*pToken)) { /** version */
+ DPRINTF("vs.%lu.%lu\n", (*pToken >> 8) & 0x0F, (*pToken & 0x0F));
+ ++pToken;
+ ++len;
+ continue;
+ }
+ if (vshader_is_comment_token(*pToken)) { /** comment */
+ DWORD comment_len = (*pToken & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT;
+ ++pToken;
+ /*DPRINTF("comment[%ld] ;%s\n", comment_len, (char*)pToken);*/
+ pToken += comment_len;
+ len += comment_len + 1;
+ continue;
+ }
curOpcode = vshader_program_get_opcode(*pToken);
++pToken;
++len;
if (NULL == curOpcode) {
/* unkown current opcode ... */
while (*pToken & 0x80000000) {
- DPRINTF("unrecognized opcode: %08lX\n", *pToken);
+ DPRINTF("unrecognized opcode: %08lx\n", *pToken);
++pToken;
++len;
}
@@ -426,7 +557,9 @@
D3DSHADERVECTOR* p_send[4];
DWORD i;
+ /** init temporary register */
memset(R, 0, 12 * sizeof(D3DSHADERVECTOR));
+
/* vshader_program_parse(vshader); */
/*
TRACE_VECTOR(vshader->data->C[0]);
@@ -449,13 +582,29 @@
/* the first dword is the version tag */
/* TODO: parse it */
+ if (vshader_is_version_token(*pToken)) { /** version */
+ ++pToken;
+ }
while (D3DVS_END() != *pToken) {
+ if (vshader_is_comment_token(*pToken)) { /** comment */
+ DWORD comment_len = (*pToken & D3DSI_COMMENTSIZE_MASK) >> D3DSI_COMMENTSIZE_SHIFT;
+ ++pToken;
+ pToken += comment_len;
+ continue ;
+ }
curOpcode = vshader_program_get_opcode(*pToken);
++pToken;
if (NULL == curOpcode) {
+ i = 0;
/* unkown current opcode ... */
while (*pToken & 0x80000000) {
- DPRINTF("unrecognized opcode: pos=%d token=%08lX\n", pToken - vshader->function, *pToken);
+ if (i == 0) {
+ DPRINTF("unrecognized opcode: pos=%d token=%08lX\n", (pToken - 1) - vshader->function, *(pToken - 1));
+ }
+ DPRINTF("unrecognized opcode param: pos=%d token=%08lX what=", pToken - vshader->function, *pToken);
+ vshader_program_dump_param(*pToken, i);
+ DPRINTF("\n");
+ ++i;
++pToken;
}
/*return FALSE;*/
@@ -561,6 +710,9 @@
case 4:
curOpcode->soft_fct(p_send[0], p_send[1], p_send[2], p_send[3]);
break;
+ case 5:
+ curOpcode->soft_fct(p_send[0], p_send[1], p_send[2], p_send[3], p_send[4]);
+ break;
default:
ERR("%s too many params: %u\n", curOpcode->name, curOpcode->num_params);
}
@@ -678,6 +830,7 @@
const DWORD* pToken = vshader->decl;
DWORD fvf = 0;
DWORD len = 0;
+ DWORD stream = 0;
DWORD token;
DWORD tokenlen;
DWORD tokentype;
@@ -686,12 +839,19 @@
while (D3DVSD_END() != *pToken) {
token = *pToken;
tokenlen = vshader_decl_parse_token(pToken);
- tokentype = ((*pToken & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT);
+ tokentype = ((token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT);
/** FVF generation block */
- if (D3DVSD_TOKEN_STREAMDATA == tokentype && 0 == (0x10000000 & tokentype)) {
+ if (D3DVSD_TOKEN_STREAM == tokentype && 0 == (D3DVSD_STREAMTESSMASK & token)) {
+ /**
+ * how really works streams,
+ * in DolphinVS dx8 dsk sample they seems to decal reg numbers !!!
+ */
+ stream = ((token & D3DVSD_STREAMNUMBERMASK) >> D3DVSD_STREAMNUMBERSHIFT);
+
+ } else if (D3DVSD_TOKEN_STREAMDATA == tokentype && 0 == (0x10000000 & tokentype)) {
DWORD type = ((token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT);
- DWORD reg = ((token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT);
+ DWORD reg = ((token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT) - stream;
switch (reg) {
case D3DVSDE_POSITION:
@@ -699,7 +859,7 @@
case D3DVSDT_FLOAT3: fvf |= D3DFVF_XYZ; break;
case D3DVSDT_FLOAT4: fvf |= D3DFVF_XYZRHW; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_POSITION register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_POSITION register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -710,7 +870,7 @@
case D3DVSDT_FLOAT3: fvf |= D3DFVF_XYZB3; break;
case D3DVSDT_FLOAT4: fvf |= D3DFVF_XYZB4; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_BLENDWEIGHT register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_BLENDWEIGHT register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -718,7 +878,7 @@
switch (type) {
case D3DVSDT_UBYTE4: fvf |= D3DFVF_LASTBETA_UBYTE4; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_BLENDINDINCES register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_BLENDINDINCES register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -726,7 +886,7 @@
switch (type) {
case D3DVSDT_FLOAT3: fvf |= D3DFVF_NORMAL; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_NORMAL register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_NORMAL register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -734,7 +894,7 @@
switch (type) {
case D3DVSDT_FLOAT1: fvf |= D3DFVF_PSIZE; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_PSIZE register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_PSIZE register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -742,7 +902,7 @@
switch (type) {
case D3DVSDT_D3DCOLOR: fvf |= D3DFVF_DIFFUSE; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_DIFFUSE register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_DIFFUSE register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -750,7 +910,7 @@
switch (type) {
case D3DVSDT_D3DCOLOR: fvf |= D3DFVF_SPECULAR; break;
default: /** errooooorr what to do ? */
- ERR("Error in VertexShader declaration of D3DVSDE_SPECULAR register: unsupported type %lu\n", type);
+ ERR("Error in VertexShader declaration of D3DVSDE_SPECULAR register: unsupported type %s\n", VertexShaderDeclDataTypes[type]);
}
break;
@@ -787,18 +947,211 @@
return len * sizeof(DWORD);
}
+
+void vshader_fill_input(VERTEXSHADER8* vshader,
+ IDirect3DDevice8Impl* device,
+ const void* vertexFirstStream,
+ DWORD StartVertexIndex,
+ DWORD idxDecal) {
+ /** parser data */
+ const DWORD* pToken = vshader->decl;
+ DWORD stream = 0;
+ DWORD token;
+ /*DWORD tokenlen;*/
+ DWORD tokentype;
+ /** for input readers */
+ const void* curPos = NULL;
+ FLOAT x, y, z, w;
+ SHORT u, v, r, t;
+ DWORD dw;
+
+ /*TRACE("(%p) - device:%p - stream:%p, startIdx=%lu, idxDecal=%lu\n", vshader, device, vertexFirstStream, StartVertexIndex, idxDecal);*/
+ while (D3DVSD_END() != *pToken) {
+ token = *pToken;
+ tokentype = ((token & D3DVSD_TOKENTYPEMASK) >> D3DVSD_TOKENTYPESHIFT);
+
+ /** FVF generation block */
+ if (D3DVSD_TOKEN_STREAM == tokentype && 0 == (D3DVSD_STREAMTESSMASK & token)) {
+ IDirect3DVertexBuffer8* pVB;
+ const void* startVtx = NULL;
+ int skip = 0;
+
+ ++pToken;
+ /**
+ * how really works streams,
+ * in DolphinVS dx8 dsk sample use it !!!
+ */
+ stream = ((token & D3DVSD_STREAMNUMBERMASK) >> D3DVSD_STREAMNUMBERSHIFT);
+
+ if (0 == stream) {
+ skip = device->StateBlock.stream_stride[0];
+ startVtx = vertexFirstStream + (StartVertexIndex * skip);
+ curPos = startVtx + idxDecal;
+ /*TRACE(" using stream[%lu] with %lu decal => curPos %p\n", stream, idxDecal, curPos);*/
+ } else {
+ skip = device->StateBlock.stream_stride[stream];
+ pVB = device->StateBlock.stream_source[stream];
+
+ if (NULL == pVB) {
+ ERR("using unitialised stream[%lu]\n", stream);
+ return ;
+ } else {
+ startVtx = ((IDirect3DVertexBuffer8Impl*) pVB)->allocatedMemory + (StartVertexIndex * skip);
+ /** do we need to decal if we use idxBuffer */
+ curPos = startVtx + idxDecal;
+ /*TRACE(" using stream[%lu] with %lu decal\n", stream, idxDecal);*/
+ }
+ }
+ } else if (D3DVSD_TOKEN_CONSTMEM == tokentype) {
+ /** Const decl */
+ DWORD i;
+ DWORD count = ((token & D3DVSD_CONSTCOUNTMASK) >> D3DVSD_CONSTCOUNTSHIFT);
+ DWORD constaddress = ((token & D3DVSD_CONSTADDRESSMASK) >> D3DVSD_CONSTADDRESSSHIFT);
+ ++pToken;
+ for (i = 0; i < count; ++i) {
+ vshader->data->C[constaddress + i].x = *(float*)pToken;
+ vshader->data->C[constaddress + i].y = *(float*)(pToken + 1);
+ vshader->data->C[constaddress + i].z = *(float*)(pToken + 2);
+ vshader->data->C[constaddress + i].w = *(float*)(pToken + 3);
+ pToken += 4;
+ }
+
+ } else if (D3DVSD_TOKEN_STREAMDATA == tokentype && 0 != (0x10000000 & tokentype)) {
+ /** skip datas */
+ DWORD skipCount = ((token & D3DVSD_SKIPCOUNTMASK) >> D3DVSD_SKIPCOUNTSHIFT);
+ curPos = curPos + skipCount * sizeof(DWORD);
+ ++pToken;
+
+ } else if (D3DVSD_TOKEN_STREAMDATA == tokentype && 0 == (0x10000000 & tokentype)) {
+ DWORD type = ((token & D3DVSD_DATATYPEMASK) >> D3DVSD_DATATYPESHIFT);
+ DWORD reg = ((token & D3DVSD_VERTEXREGMASK) >> D3DVSD_VERTEXREGSHIFT);
+ ++pToken;
+
+ switch (type) {
+ case D3DVSDT_FLOAT1:
+ x = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ /**/
+ vshader->input.V[reg].x = x;
+ vshader->input.V[reg].y = 0.0f;
+ vshader->input.V[reg].z = 0.0f;
+ vshader->input.V[reg].w = 1.0f;
+ break;
+
+ case D3DVSDT_FLOAT2:
+ x = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ y = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ /**/
+ vshader->input.V[reg].x = x;
+ vshader->input.V[reg].y = y;
+ vshader->input.V[reg].z = 0.0f;
+ vshader->input.V[reg].w = 1.0f;
+ break;
+
+ case D3DVSDT_FLOAT3:
+ x = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ y = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ z = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ /**/
+ vshader->input.V[reg].x = x;
+ vshader->input.V[reg].y = y;
+ vshader->input.V[reg].z = z;
+ vshader->input.V[reg].w = 1.0f;
+ break;
+
+ case D3DVSDT_FLOAT4:
+ x = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ y = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ z = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ w = *(float*) curPos;
+ curPos = curPos + sizeof(float);
+ /**/
+ vshader->input.V[reg].x = x;
+ vshader->input.V[reg].y = y;
+ vshader->input.V[reg].z = z;
+ vshader->input.V[reg].w = w;
+ break;
+
+ case D3DVSDT_D3DCOLOR:
+ dw = *(DWORD*) curPos;
+ curPos = curPos + sizeof(DWORD);
+ /**/
+ vshader->input.V[reg].x = (float) (((dw >> 16) & 0xFF) / 255.0f);
+ vshader->input.V[reg].y = (float) (((dw >> 8) & 0xFF) / 255.0f);
+ vshader->input.V[reg].z = (float) (((dw >> 0) & 0xFF) / 255.0f);
+ vshader->input.V[reg].w = (float) (((dw >> 24) & 0xFF) / 255.0f);
+ break;
+
+ case D3DVSDT_SHORT2:
+ u = *(SHORT*) curPos;
+ curPos = curPos + sizeof(SHORT);
+ v = *(SHORT*) curPos;
+ curPos = curPos + sizeof(SHORT);
+ /**/
+ vshader->input.V[reg].x = (float) u;
+ vshader->input.V[reg].y = (float) v;
+ vshader->input.V[reg].z = 0.0f;
+ vshader->input.V[reg].w = 1.0f;
+ break;
+
+ case D3DVSDT_SHORT4:
+ u = *(SHORT*) curPos;
+ curPos = curPos + sizeof(SHORT);
+ v = *(SHORT*) curPos;
+ curPos = curPos + sizeof(SHORT);
+ t = *(SHORT*) curPos;
+ curPos = curPos + sizeof(SHORT);
+ t = *(SHORT*) curPos;
+ curPos = curPos + sizeof(SHORT);
+ /**/
+ vshader->input.V[reg].x = (float) u;
+ vshader->input.V[reg].y = (float) v;
+ vshader->input.V[reg].z = (float) r;
+ vshader->input.V[reg].w = (float) t;
+ break;
+
+ case D3DVSDT_UBYTE4:
+ dw = *(DWORD*) curPos;
+ curPos = curPos + sizeof(DWORD);
+ /**/
+ vshader->input.V[reg].x = (float) ((dw & 0x000F) >> 0);
+ vshader->input.V[reg].y = (float) ((dw & 0x00F0) >> 8);
+ vshader->input.V[reg].z = (float) ((dw & 0x0F00) >> 16);
+ vshader->input.V[reg].w = (float) ((dw & 0xF000) >> 24);
+
+ break;
+
+ default: /** errooooorr what to do ? */
+ ERR("Error in VertexShader declaration of %s register: unsupported type %s\n", VertexShaderDeclRegister[reg], VertexShaderDeclDataTypes[type]);
+ }
+ }
+
+ }
+ /* here D3DVSD_END() */
+}
+
+
/***********************************************************************
* ValidateVertexShader (D3D8.@)
*/
BOOL WINAPI ValidateVertexShader(LPVOID what, LPVOID toto) {
- FIXME("(void): stub: %p\n", what);
+ FIXME("(void): stub: %p %p\n", what, toto);
return TRUE;
}
/***********************************************************************
* ValidatePixelShader (D3D8.@)
*/
-BOOL WINAPI ValidatePixelShader(LPVOID what, LPVOID toto) {
+BOOL WINAPI ValidatePixelShader(LPVOID what) {
FIXME("(void): stub: %p\n", what);
return TRUE;
}
+
More information about the wine-patches
mailing list