[D3D8 - 1] resend of Jason Texture work + many fixes
Raphaël Junqueira
fenix at club-internet.fr
Fri Jan 10 18:27:44 CST 2003
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi again,
This patch need the [D3D - 0] patch (see extensions below)
and [D3D - 0] patch need this patch to compile
Changelog:
- compile fixes needed by [D3D - 0] patch
- Resend of last Jason texture work
- mipmapping
- copyrect#1
- copyrect#2
- Resend of my last vertex shader patch + improvements
- move input and output data in VertexShader struct
- better traces
- begin of more COM compliant behavior:
- AddRef/Release where needed
- use IUnknown* instead void*
- fix many GetDevice using AddRef
- fix IDirect3DSurface8Impl_GetContainer using QueryInterface
- Jason begin mipmaping so declare it in caps
- 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)
- beginning of vertex matrix blending using extensions (currently alpha alpha stage as i haven't understand needed extension behavior)
- modify SetRenderState for matrix blending specific params
- many fixes in IDirect3DDevice8::SetTransform (Vertex matrix weighting, texure matrix)
- using extension for specular color code (using jason commented code and new x11drv/GLX opengl info)
- 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
- by default diffuse color is white ;)
- comments most of the traces (else flood ...)
- add more urls in comments
- indent, cleanups
Todo:
- cleanup DrawPrimitiveI:
- split to a new source (draw.c ?)
- merge with ddraw code
- begin simple abstraction layer
- vertex shader :
- struct must become a IVertexShader COM object (as in Dx9) and separe declarations from shaders (bind only by d3d8 array)
- abstraction layer (easy specific hardware programs)
- merge my DX8 vs -> NV program extension translator prototype
- begin a DX8 vs -> ARB program extension translator
- begin a DX8 vs -> ATI vs extension translator
- merge my DX8 vs optimisator/execution prototype
- begin vs3.0 support (after HAL)
- code a HLCL compiler (anyone want to do this compiler ?)
- Vertex shader declaration
- struct must become a IVertexShaderDecl COM object (as Dx9)
- declaration validation and optimizer
- Dx8 -> Dx9 translator
- Dx9 -> Dx8 translator
- HAL: need a new lib (maybe libwined3dgl.so ?) who contains a basic openGL HAL for the d3d versions (with ddraw version ?)
- !!!! merge Dx9 prototype : we need a new d3d core dll for d3d version up to 8 (the d3d8.dll and d3d9.dll will be only simili-stubs to the core lib)
alexandre, i suggest one subdir in d3d8 dir for each d3d[8-9].dll and another dlls/d3d8 subdir for the core lib (dlls/d3d8/core/ ?)
- D3DX8/D3DX9: too big todo list but D3DX9 support have the same need of Dx9 support
Thanks
Raphael
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.1 (GNU/Linux)
iD8DBQE+H2UAp7NA3AmQTU4RAuopAJ9pRHgTvkslzMRn94Xk1xKTe64YFACeKCHz
QSx5IbrImcH4CqOcJggY3Nc=
=u/Zt
-----END PGP SIGNATURE-----
-------------- next part --------------
Index: dlls/d3d8/basetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/basetexture.c,v
retrieving revision 1.2
diff -u -r1.2 basetexture.c
--- dlls/d3d8/basetexture.c 17 Dec 2002 01:15:16 -0000 1.2
+++ dlls/d3d8/basetexture.c 10 Jan 2003 23:42:11 -0000
@@ -65,6 +65,11 @@
ICOM_THIS(IDirect3DBaseTexture8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ /**
+ * Note Calling this method will increase the internal reference count
+ * on the IDirect3DDevice8 interface.
+ */
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DBaseTexture8Impl_SetPrivateData(LPDIRECT3DBASETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
Index: dlls/d3d8/cubetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/cubetexture.c,v
retrieving revision 1.2
diff -u -r1.2 cubetexture.c
--- dlls/d3d8/cubetexture.c 17 Dec 2002 01:15:16 -0000 1.2
+++ dlls/d3d8/cubetexture.c 10 Jan 2003 23:42:20 -0000
@@ -75,6 +75,11 @@
ICOM_THIS(IDirect3DCubeTexture8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ /**
+ * Note Calling this method will increase the internal reference count
+ * on the IDirect3DDevice8 interface.
+ */
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DCubeTexture8Impl_SetPrivateData(LPDIRECT3DCUBETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
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 10 Jan 2003 23:43:19 -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"
@@ -39,16 +42,31 @@
HRESULT WINAPI DebugSetMute(void)
{
FIXME("(void): stub\n");
- return 0;
+ return S_OK;
+}
+
+inline static X11DRV_OPENGL_INFO* get_opengl_info( HDC hdc, X11DRV_OPENGL_INFO* info )
+{
+ enum x11drv_escape_codes escape = X11DRV_GET_OPENGL_INFO;
+
+ if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, sizeof(X11DRV_OPENGL_INFO), (LPSTR)info )) {
+ ERR("ExtEscape pb!\n");
+ }
+ return info;
}
IDirect3D8* WINAPI Direct3DCreate8(UINT SDKVersion)
{
+ HDC hDC;
IDirect3D8Impl *object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3D8Impl));
object->lpVtbl = &Direct3D8_Vtbl;
object->ref = 1;
+
+ hDC = CreateDCA("DISPLAY", NULL, NULL, NULL);
+ get_opengl_info(hDC, &object->glInfo);
+ DeleteDC(hDC);
TRACE("SDKVersion = %x, Created Direct3D object at %p\n", SDKVersion, object);
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 10 Jan 2003 23:43:28 -0000
@@ -42,6 +42,8 @@
/* X11 locking */
+#include "x11drv.h"
+
extern void (*wine_tsx11_lock_ptr)(void);
extern void (*wine_tsx11_unlock_ptr)(void);
@@ -147,9 +149,12 @@
/* Vertex Shader */
DWORD VertexShader;
-
/* TODO: Vertex Shader Constant */
+ /* Indexed Vertex Blending */
+ D3DVERTEXBLENDFLAGS vertex_blend;
+ FLOAT tween_factor;
+
} STATEBLOCK;
typedef struct D3DSHADERVECTOR {
@@ -176,6 +181,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 +205,8 @@
DWORD version;
/* run time datas */
SHADERDATA8* data;
+ VSHADERINPUTDATA8 input;
+ VSHADEROUTPUTDATA8 output;
} VERTEXSHADER8;
typedef struct PIXELSHADER8 { /* TODO: Pixel Shader */
@@ -196,20 +217,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 +236,28 @@
} \
}
+#define checkGLSupport(ExtName) (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
=========================================================================== */
@@ -252,7 +281,11 @@
ICOM_VFIELD(IDirect3D8);
DWORD ref;
- /* IDirect3D8 fields */
+ /* IDirect3D8 fields */
+
+ /* OpenGL related */
+ /* http://developer.nvidia.com/view.asp?IO=nvidia_opengl_specs */
+ X11DRV_OPENGL_INFO glInfo;
};
/* IUnknown: */
@@ -270,11 +303,11 @@
extern HRESULT WINAPI IDirect3D8Impl_CheckDeviceType(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE CheckType, D3DFORMAT DisplayFormat,
D3DFORMAT BackBufferFormat, BOOL Windowed);
extern HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
- DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat);
+ DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat);
extern HRESULT WINAPI IDirect3D8Impl_CheckDeviceMultiSampleType(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat,
- BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType);
+ BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType);
extern HRESULT WINAPI IDirect3D8Impl_CheckDepthStencilMatch(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
- D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat);
+ D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat);
extern HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, D3DCAPS8* pCaps);
extern HMONITOR WINAPI IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT Adapter);
extern HRESULT WINAPI IDirect3D8Impl_CreateDevice(LPDIRECT3D8 iface, UINT Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow,
@@ -530,7 +563,7 @@
IDirect3DDevice8Impl *Device;
D3DRESOURCETYPE ResourceType;
- void *Container;
+ IUnknown *Container;
D3DSURFACE_DESC myDesc;
BYTE *allocatedMemory;
@@ -929,5 +962,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/d3d8.spec
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/d3d8.spec,v
retrieving revision 1.4
diff -u -r1.4 d3d8.spec
--- dlls/d3d8/d3d8.spec 2 Jan 2003 17:59:02 -0000 1.4
+++ dlls/d3d8/d3d8.spec 10 Jan 2003 23:43:28 -0000
@@ -1,5 +1,5 @@
@ stdcall D3D8GetSWInfo() D3D8GetSWInfo
@ stdcall DebugSetMute(long) DebugSetMute
@ stdcall Direct3DCreate8(long) Direct3DCreate8
-@ stdcall ValidatePixelShader(ptr ptr) ValidatePixelShader
+@ stdcall ValidatePixelShader(ptr) ValidatePixelShader
@ stdcall ValidateVertexShader(ptr ptr) ValidateVertexShader
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 10 Jan 2003 23:43:33 -0000
@@ -28,6 +28,7 @@
#include "wingdi.h"
#include "wine/debug.h"
+#include "config.h"
#include "d3d8_private.h"
WINE_DEFAULT_DEBUG_CHANNEL(d3d);
@@ -36,9 +37,9 @@
/* Per-vertex trace: */
#if 0
- #define VTRACE(A) TRACE A
+# define VTRACE(A) TRACE A
#else
- #define VTRACE(A)
+# define VTRACE(A)
#endif
@@ -106,7 +107,6 @@
int NumVertexes = NumPrimitives;
VERTEXSHADER8* vertex_shader = NULL;
- VSHADERINPUTDATA8 vertex_shader_input;
BOOL useVertexShaderFunction = FALSE;
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -127,7 +127,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));
}
{
@@ -150,12 +150,16 @@
BOOL enableTexture = FALSE;
int vx_index;
- float x=0.0, y=0.0, z=0.0; /* x,y,z coordinates */
- float nx=0.0, ny=0.0, nz=0.0; /* normal x,y,z coordinates */
- float rhw=0.0; /* rhw */
- float ptSize=0.0; /* Point size */
- DWORD diffuseColor=0; /* Diffusre Color */
- DWORD specularColor=0; /* Specular Color */
+ float x = 0.0f,
+ y = 0.0f,
+ z = 0.0f; /* x,y,z coordinates */
+ float nx = 0.0f,
+ ny =0.0,
+ nz = 0.0f; /* normal x,y,z coordinates */
+ float rhw = 0.0f; /* rhw */
+ float ptSize = 0.0f; /* Point size */
+ DWORD diffuseColor = 0xFFFFFFFF; /* Diffusre Color */
+ DWORD specularColor = 0; /* Specular Color */
ENTER_GL();
@@ -165,10 +169,14 @@
}
/* Check vertex formats expected ? */
+ /* *
+ * FVF parser as seen it
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dx8_c/directx_cpp/Graphics/Reference/CPP/D3D/FlexibleVertexFormatFlags.asp
+ */
normal = fvf & D3DFVF_NORMAL;
isRHW = fvf & D3DFVF_XYZRHW;
- numBlends = ((fvf & D3DFVF_POSITION_MASK) >> 1) - 2; /* WARNING can be < 0 because -2 */
isLastUByte4 = fvf & D3DFVF_LASTBETA_UBYTE4;
+ numBlends = ((fvf & D3DFVF_POSITION_MASK) >> 1) - 2 + ((FALSE == isLastUByte4) ? 0 : -1); /* WARNING can be < 0 because -2 */
isPtSize = fvf & D3DFVF_PSIZE;
isDiffuse = fvf & D3DFVF_DIFFUSE;
isSpecular = fvf & D3DFVF_SPECULAR;
@@ -268,7 +276,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 || isLastUByte4 /* || (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
@@ -285,13 +293,14 @@
curPos = curVtx;
} else {
if (idxBytes == 2) {
- VTRACE(("Idx for vertex %d = %d = %d\n", vx_index, pIdxBufS[StartIdx+vx_index], (pIdxBufS[StartIdx+vx_index])));
+ TRACE("Idx for vertex %d = %d = %d\n", vx_index, pIdxBufS[StartIdx+vx_index], (pIdxBufS[StartIdx+vx_index]));
curPos = curVtx + ((pIdxBufS[StartIdx+vx_index]) * skip);
} else {
- VTRACE(("Idx for vertex %d = %ld = %d\n", vx_index, pIdxBufL[StartIdx+vx_index], (pIdxBufS[StartIdx+vx_index])));
+ TRACE("Idx for vertex %d = %ld = %d\n", vx_index, pIdxBufL[StartIdx+vx_index], (pIdxBufS[StartIdx+vx_index]));
curPos = curVtx + ((pIdxBufL[StartIdx+vx_index]) * skip);
}
}
+ /*TRACE(" using curPos %p\n", curPos);*/
/* Work through the vertex buffer */
x = *(float *)curPos;
@@ -302,54 +311,84 @@
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;
+ vertex_shader->input.V[D3DVSDE_POSITION].w = rhw;
}
+ */
}
- /* Blending data */
- if (numBlends > 0) {
+ /**
+ * Indexed Vertex Blending data
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dx8_c/directx_cpp/Graphics/programmersguide/advancedtopics/indverblend/UsingIndexedVertexBlending.asp
+ */
+ if (numBlends > 0 && numBlends > This->UpdateStateBlock->vertex_blend) {
+ ERR("declaring Blending in FVF, but desactived in render state\n");
+ } else if (numBlends > 0) {
+ D3DSHADERVECTOR blend = {0.0f, 0.0f, 0.0f, 0.0f};
+ DWORD blendIndices = 0;
UINT i;
- D3DSHADERVECTOR skippedBlend = { 0.0f, 0.0f, 0.0f, 0.0f};
- DWORD skippedBlendLastUByte4 = 0;
- for (i = 0; i < ((FALSE == isLastUByte4) ? numBlends : numBlends - 1); ++i) {
- ((float*)&skippedBlend)[i] = *(float *)curPos;
+ for (i = 0; i < numBlends; ++i) {
+ ((float*)&blend)[i] = *(float *)curPos;
curPos = curPos + sizeof(float);
}
+ blend.w = 1.0f - (blend.x + blend.y + blend.z);
if (isLastUByte4) {
- skippedBlendLastUByte4 = *(DWORD*)curPos;
+ blendIndices = *(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;
- }
- }
- }
+ if (TRUE == This->UpdateStateBlock->renderstate[D3DRS_INDEXEDVERTEXBLENDENABLE]) {
+ if (checkGLSupport(ARB_VERTEX_BLEND)) {
+ FIXME("TODO\n");
+ } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) {
+ FIXME("TODO\n");
+ /*
+ GLExtCall(glVertexWeightfvEXT)((float*) &blend.x);
+ checkGLcall("glVertexWeightfvEXT(blend)");
+ */
+ } else {
+ FIXME("unsupported blending in openGl\n");
+ }
+ }
+
+ /**
+ * Arghh using blending matrix
+ *
+ * TODO: how to do this with GL Vertex Arrays ???
+ */
+ if (0 != blendIndices) {
+ /**
+ * Context Work: if not first, pop to the last world(0) matrix
+ * maybe the last multMatrixf with world(0) don't have to be done in blendIndices mode
+ * the documentation is confuse ... to see
+ */
+ /**
+ * in doc seems to say:
+ * oPos = iPos * D3DTS_WORLDMATRIX(i0) * blend.x + iPos * D3DTS_WORLDMATRIX(i1) * blend.y + iPos * D3DTS_WORLDMATRIX(i2) * blend.z
+ * but how to do in OpenGL (understand ARB_vertex_blend extension ?)
+ * and the doc is really confuse ;(
+ */
+ /*
+ if (0 < vx_index) glPopMatrix();
+ glPushMatrix();
+
+ for (i = 0; i < min(3, This->UpdateStateBlock->vertex_blend); ++i) {
+ glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(((blendIndices >> (8 * i)) & 0x0F))].u.m[0][0]);
+ checkGLcall("glMultMatrixf");
+ }
+ */
+ }
+
+ }
/* Vertex Normal Data (untransformed only) */
if (normal) {
@@ -360,52 +399,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 +443,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 +463,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 +486,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 != vs_o.oPos.w || isRHW) {
- rhw = vs_o.oPos.w;
+ if (1.0f != vertex_shader->output.oPos.w || isRHW) {
+ rhw = vertex_shader->output.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) {
+ /*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");*/
+ }
+
+ /** 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 +543,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;
@@ -560,14 +580,15 @@
}
if (1.0f == rhw || rhw < 0.01f) {
- VTRACE(("Vertex: glVertex:x,y,z=%f,%f,%f\n", x,y,z));
+ 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 {
/**
* FALSE == useVertexShaderFunction
@@ -575,7 +596,7 @@
*/
/* Handle these vertexes */
- if (isDiffuse) {
+ if (isDiffuse) {
glColor4ub((diffuseColor >> 16) & 0xFF,
(diffuseColor >> 8) & 0xFF,
(diffuseColor >> 0) & 0xFF,
@@ -622,20 +643,44 @@
if (isRHW) {
glVertexPointer(4, GL_FLOAT, skip, curPos);
checkGLcall("glVertexPointer(4, ...)");
- curPos += 4*sizeof(float);
+ curPos += 4 * sizeof(float);
} else {
glVertexPointer(3, GL_FLOAT, skip, curPos);
checkGLcall("glVertexPointer(3, ...)");
- curPos += 3*sizeof(float);
+ curPos += 3 * sizeof(float);
}
glEnableClientState(GL_VERTEX_ARRAY);
checkGLcall("glEnableClientState(GL_VERTEX_ARRAY)");
- if (numBlends>0) {
+ if (numBlends > 0) {
/* 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");
- }
+ /* 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");
+ /*
+ 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");
+ }
+ } else {
+ if (checkGLSupport(ARB_VERTEX_BLEND)) {
+ FIXME("TODO\n");
+ } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) {
+ FIXME("TODO\n");
+ /*
+ glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT);
+ checkGLcall("glDisableClientState(GL_VERTEX_WEIGHT_ARRAY_EXT)");
+ */
+ }
+ }
if (normal) {
@@ -643,11 +688,11 @@
checkGLcall("glNormalPointer");
glEnableClientState(GL_NORMAL_ARRAY);
checkGLcall("glEnableClientState(GL_NORMAL_ARRAY)");
- curPos += 3*sizeof(float);
+ curPos += 3 * sizeof(float);
} else {
glDisableClientState(GL_NORMAL_ARRAY);
checkGLcall("glDisableClientState(GL_NORMAL_ARRAY)");
- glNormal3f(0, 0, 1);
+ glNormal3f(0.0f, 0.0f, 1.0f);
checkGLcall("glNormal3f(0, 0, 1)");
}
@@ -668,26 +713,26 @@
else {
glDisableClientState(GL_COLOR_ARRAY);
checkGLcall("glDisableClientState(GL_COLOR_ARRAY)");
- glColor4f(1, 1, 1, 1);
+ glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
checkGLcall("glColor4f(1, 1, 1, 1)");
}
-/* Requires secondary color extensions to compile... */
-#if 0
- if (isSpecular) {
+ /* Requires secondary color extensions to compile... */
+ if (checkGLSupport(EXT_SECONDARY_COLOR)) {
+ if (isSpecular) {
/* FIXME: check for GL_EXT_secondary_color */
- glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, skip, curPos);
+ GLExtCall(glSecondaryColorPointerEXT)(4, GL_UNSIGNED_BYTE, skip, (GLvoid*) curPos);
checkGLcall("glSecondaryColorPointerEXT(4, GL_UNSIGNED_BYTE, skip, curPos)");
glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
checkGLcall("glEnableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
curPos += sizeof(DWORD);
- } else {
+ } else {
glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT);
checkGLcall("glDisableClientState(GL_SECONDARY_COLOR_ARRAY_EXT)");
- glSecondaryColor3fEXT(0, 0, 0);
+ GLExtCall(glSecondaryColor3fEXT)(0.0f, 0.0f, 0.0f);
checkGLcall("glSecondaryColor3fEXT(0, 0, 0)");
+ }
}
-#endif
/* ToDo: Texture coords */
for (textureNo = 0;textureNo<numTextures; textureNo++) {
@@ -700,7 +745,7 @@
case D3DRTYPE_TEXTURE:
glTexCoordPointer(2, GL_FLOAT, skip, curPos);
checkGLcall("glTexCoordPointer(2, ...)");
- curPos += 2*sizeof(float);
+ curPos += 2 * sizeof(float);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
checkGLcall("glEnableClientState(GL_TEXTURE_COORD_ARRAY);");
break;
@@ -708,7 +753,7 @@
case D3DRTYPE_VOLUMETEXTURE:
glTexCoordPointer(3, GL_FLOAT, skip, curPos);
checkGLcall("glTexCoordPointer(3, ...)");
- curPos += 3*sizeof(float);
+ curPos += 3 * sizeof(float);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
checkGLcall("glEnableClientState(GL_TEXTURE_COORD_ARRAY);");
break;
@@ -723,7 +768,7 @@
/* Note I have seen a program actually do this, so just hide it and continue */
TRACE("Very odd - texture requested in FVF but not bound!\n");
- glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0, 0, 0, 1);
+ glMultiTexCoord4fARB(GL_TEXTURE0_ARB + textureNo, 0.0f, 0.0f, 0.0f, 1.0f);
checkGLcall("glMultiTexCoord4f(... , 0, 0, 0, 1)");
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
checkGLcall("glDisableClientState(GL_TEXTURE_COORD_ARRAY);");
@@ -731,7 +776,6 @@
}
}
-
/* Finally do the drawing */
if (isIndexed) {
@@ -945,10 +989,10 @@
/* Note the D3DRS value applies to all textures, but GL has one
per texture, so apply it now ready to be used! */
- 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;
+ 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;
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &col[0]);
checkGLcall("glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, color);");
@@ -1060,7 +1104,7 @@
ICOM_THIS(IDirect3DDevice8Impl,iface);
FIXME("(%p) : stub\n", This); 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;
}
@@ -1076,7 +1120,7 @@
ICOM_THIS(IDirect3DDevice8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST RECT* pSourceRect,CONST RECT* pDestRect,HWND hDestWindowOverride,CONST RGNDATA* pDirtyRegion) {
+HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, CONST RECT* pSourceRect,CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : complete stub!\n", This);
@@ -1089,7 +1133,7 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer,D3DBACKBUFFER_TYPE Type,IDirect3DSurface8** ppBackBuffer) {
+HRESULT WINAPI IDirect3DDevice8Impl_GetBackBuffer(LPDIRECT3DDEVICE8 iface, UINT BackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface8** ppBackBuffer) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
*ppBackBuffer = (LPDIRECT3DSURFACE8) This->backBuffer;
TRACE("(%p) : BackBuf %d Type %d returning %p\n", This, BackBuffer, Type, *ppBackBuffer);
@@ -1124,7 +1168,7 @@
TRACE("(%p) : W(%d) H(%d), Lvl(%d) Usage(%ld), Fmt(%d), Pool(%d)\n", This, Width, Height, Levels, Usage, Format, Pool);
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DTexture8Impl));
object->lpVtbl = &Direct3DTexture8_Vtbl;
- object->Device = This;
+ object->Device = This; /* FIXME: AddRef(This) */
object->ResourceType = D3DRTYPE_TEXTURE;
object->ref = 1;
object->width = Width;
@@ -1140,7 +1184,7 @@
tmpW = Width;
tmpH = Height;
while (tmpW > 1 && tmpH > 1) {
- tmpW = max(1,tmpW / 2);
+ tmpW = max(1, tmpW / 2);
tmpH = max(1, tmpH / 2);
object->levels++;
}
@@ -1153,12 +1197,12 @@
for (i=0; i<object->levels; i++)
{
IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpH, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[i]);
- object->surfaces[i]->Container = object;
+ object->surfaces[i]->Container = (IUnknown*) object; /* FIXME: AddRef(object) */
object->surfaces[i]->myDesc.Usage = Usage;
object->surfaces[i]->myDesc.Pool = Pool ;
TRACE("Created surface level %d @ %p, memory at %p\n", i, object->surfaces[i], object->surfaces[i]->allocatedMemory);
- tmpW = max(1,tmpW / 2);
+ tmpW = max(1, tmpW / 2);
tmpH = max(1, tmpH / 2);
}
@@ -1220,7 +1264,7 @@
object->volumes[i] = (IDirect3DVolume8Impl *) volume;
volume->lpVtbl = &Direct3DVolume8_Vtbl;
- volume->Device = This;
+ volume->Device = This; /* FIXME: AddRef(This) */
volume->ResourceType = D3DRTYPE_VOLUME;
volume->Container = object;
volume->ref = 1;
@@ -1259,7 +1303,7 @@
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DCubeTexture8Impl));
object->lpVtbl = &Direct3DCubeTexture8_Vtbl;
object->ref = 1;
- object->Device = This;
+ object->Device = This; /* FIXME: AddRef(This) */
object->ResourceType = D3DRTYPE_CUBETEXTURE;
object->edgeLength = EdgeLength;
@@ -1286,7 +1330,7 @@
/* Create the 6 faces */
for (j=0;j<6;j++) {
IDirect3DDevice8Impl_CreateImageSurface(iface, tmpW, tmpW, Format, (LPDIRECT3DSURFACE8*) &object->surfaces[j][i]);
- object->surfaces[j][i]->Container = object;
+ object->surfaces[j][i]->Container = (IUnknown*) object;
object->surfaces[j][i]->myDesc.Usage = Usage;
object->surfaces[j][i]->myDesc.Pool = Pool ;
@@ -1371,7 +1415,7 @@
object->lpVtbl = &Direct3DSurface8_Vtbl;
object->Device = This;
object->ResourceType = D3DRTYPE_SURFACE;
- object->Container = This;
+ object->Container = (IUnknown*) This;
object->ref = 1;
object->myDesc.Width = Width;
@@ -1390,7 +1434,9 @@
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;
+
IDirect3DSurface8Impl *src = (IDirect3DSurface8Impl*) pSourceSurface;
IDirect3DSurface8Impl *dst = (IDirect3DSurface8Impl*) pDestinationSurface;
@@ -1404,14 +1450,13 @@
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);
rc = D3DERR_INVALIDCALL;
- } else if (dst->myDesc.Format == D3DFMT_UNKNOWN) {
- void *texture = NULL;
+ } else if (dst->myDesc.Format == D3DFMT_UNKNOWN) {
TRACE("Converting dest to same format as source, since dest was unknown\n");
dst->myDesc.Format = src->myDesc.Format;
/* Convert container as well */
- IDirect3DSurface8Impl_GetContainer((LPDIRECT3DSURFACE8) dst, NULL, &texture); /* FIXME: Which refid? */
+ IDirect3DSurface8Impl_GetContainer((LPDIRECT3DSURFACE8) dst, &IID_IDirect3DBaseTexture8, (void**) &texture); /* FIXME: Which refid? */
if (texture != NULL) {
switch (IDirect3DBaseTexture8Impl_GetType((LPDIRECT3DBASETEXTURE8) texture)) {
@@ -1428,6 +1473,8 @@
FIXME("Unhandled texture type\n");
}
+ /** Releasing texture after GetContainer */
+ IDirect3DBaseTexture8_Release(texture);
}
}
@@ -1454,7 +1501,7 @@
void *from;
void *to;
int copyperline = (r->right - r->left) * bytesPerPixel;
- int j;
+ int j;
TRACE("Copying rect %d (%ld,%ld),(%ld,%ld) -> (%ld,%ld)\n", i, r->left, r->top,
r->right, r->bottom, p->x, p->y);
@@ -1469,6 +1516,40 @@
}
}
}
+
+ /* 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;
}
HRESULT WINAPI IDirect3DDevice8Impl_UpdateTexture(LPDIRECT3DDEVICE8 iface, IDirect3DBaseTexture8* pSourceTexture,IDirect3DBaseTexture8* pDestinationTexture) {
@@ -1599,7 +1680,9 @@
}
HRESULT WINAPI IDirect3DDevice8Impl_SetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE d3dts,CONST D3DMATRIX* lpmatrix) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
+ D3DMATRIX m;
int k;
+ float f;
/* Most of this routine, comments included copied from ddraw tree initially: */
TRACE("(%p) : State=%d\n", This, d3dts);
@@ -1638,22 +1721,49 @@
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. */
- switch (d3dts) {
- case D3DTS_WORLDMATRIX(0):
+ if (d3dts < 256) {
+ switch (d3dts) {
+ case D3DTS_WORLDMATRIX(0):
conv_mat(lpmatrix, &This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)]);
break;
-
- case D3DTS_VIEW:
+
+ case D3DTS_VIEW:
conv_mat(lpmatrix, &This->StateBlock.transforms[D3DTS_VIEW]);
break;
-
- case D3DTS_PROJECTION:
+
+ case D3DTS_PROJECTION:
conv_mat(lpmatrix, &This->StateBlock.transforms[D3DTS_PROJECTION]);
break;
- default:
- FIXME("Unhandled transform state!!\n");
+ case D3DTS_TEXTURE0:
+ case D3DTS_TEXTURE1:
+ case D3DTS_TEXTURE2:
+ case D3DTS_TEXTURE3:
+ case D3DTS_TEXTURE4:
+ case D3DTS_TEXTURE5:
+ case D3DTS_TEXTURE6:
+ case D3DTS_TEXTURE7:
+ conv_mat(lpmatrix, &This->StateBlock.transforms[d3dts]);
+ FIXME("Unhandled transform state for TEXTURE%d!!!\n", d3dts - D3DTS_TEXTURE0);
+ FIXME("must use glMatrixMode(GL_TEXTURE) before texturing\n");
break;
+
+ default:
+ FIXME("Unhandled transform state for %d!!\n", d3dts);
+ break;
+ }
+
+ } else {
+ /**
+ * Indexed Vertex Blending Matrices 256 -> 511
+ */
+ /** store it */
+ conv_mat(lpmatrix, &This->StateBlock.transforms[d3dts]);
+ if (checkGLSupport(ARB_VERTEX_BLEND)) {
+ FIXME("todo\n");
+ } else if (checkGLSupport(EXT_VERTEX_WEIGHTING)) {
+ FIXME("todo\n");
+ }
}
/*
@@ -1665,29 +1775,79 @@
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");
-
+
/* If we are changing the View matrix, reset the light information to the new view */
if (d3dts == D3DTS_VIEW) {
- for (k = 0; k < MAX_ACTIVE_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]);
- checkGLcall("glLightfv dirn");
- }
+ for (k = 0; k < MAX_ACTIVE_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]);
+ checkGLcall("glLightfv dirn");
+ }
}
- glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]);
- checkGLcall("glMultMatrixf");
+ /**
+ * Vertex Blending as described
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directx9_c/directx/graphics/reference/d3d/enums/d3dvertexblendflags.asp
+ */
+ switch (This->UpdateStateBlock->vertex_blend) {
+ case D3DVBF_DISABLE:
+ {
+ glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)].u.m[0][0]);
+ checkGLcall("glMultMatrixf");
+ }
+ break;
+ case D3DVBF_1WEIGHTS:
+ case D3DVBF_2WEIGHTS:
+ case D3DVBF_3WEIGHTS:
+ {
+ FIXME("valid/correct D3DVBF_[1..3]WEIGHTS\n");
+ /*
+ * doc seems to say that the weight values must be in vertex data (specified in FVF by D3DFVF_XYZB*)
+ * so waiting for the values before matrix work
+ for (k = 0; k < This->UpdateStateBlock->vertex_blend; ++k) {
+ glMultMatrixf((float *) &This->StateBlock.transforms[D3DTS_WORLDMATRIX(k)].u.m[0][0]);
+ checkGLcall("glMultMatrixf");
+ }
+ */
+ }
+ break;
+ case D3DVBF_TWEENING:
+ {
+ FIXME("valid/correct D3DVBF_TWEENING\n");
+ f = This->UpdateStateBlock->tween_factor;
+ m.u.s._11 = f; m.u.s._12 = f; m.u.s._13 = f; m.u.s._14 = f;
+ 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;
+ glMultMatrixf((float *) &m.u.m[0][0]);
+ checkGLcall("glMultMatrixf");
+ }
+ break;
+ case D3DVBF_0WEIGHTS:
+ {
+ FIXME("valid/correct D3DVBF_0WEIGHTS\n");
+ /* single matrix of weight 1.0f */
+ m.u.s._11 = 1.0f; m.u.s._12 = 1.0f; m.u.s._13 = 1.0f; m.u.s._14 = 1.0f;
+ m.u.s._21 = 1.0f; m.u.s._22 = 1.0f; m.u.s._23 = 1.0f; m.u.s._24 = 1.0f;
+ m.u.s._31 = 1.0f; m.u.s._32 = 1.0f; m.u.s._33 = 1.0f; m.u.s._34 = 1.0f;
+ m.u.s._41 = 1.0f; m.u.s._42 = 1.0f; m.u.s._43 = 1.0f; m.u.s._44 = 1.0f;
+ glMultMatrixf((float *) &m.u.m[0][0]);
+ checkGLcall("glMultMatrixf");
+ }
+ break;
+ default:
+ break; /* stupid compilator */
+ }
LEAVE_GL();
return D3D_OK;
-
}
HRESULT WINAPI IDirect3DDevice8Impl_GetTransform(LPDIRECT3DDEVICE8 iface, D3DTRANSFORMSTATETYPE State,D3DMATRIX* pMatrix) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
@@ -1920,13 +2080,13 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWORD Index,D3DLIGHT8* pLight) {
+HRESULT WINAPI IDirect3DDevice8Impl_GetLight(LPDIRECT3DDEVICE8 iface, DWORD Index, D3DLIGHT8* pLight) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : Idx(%ld), pLight(%p)\n", This, Index, pLight);
memcpy(pLight, &This->StateBlock.lights[Index], sizeof(D3DLIGHT8));
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_LightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL Enable) {
+HRESULT WINAPI IDirect3DDevice8Impl_LightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index, BOOL Enable) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : Idx(%ld), enable? %d\n", This, Index, Enable);
@@ -1949,13 +2109,13 @@
}
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index,BOOL* pEnable) {
+HRESULT WINAPI IDirect3DDevice8Impl_GetLightEnable(LPDIRECT3DDEVICE8 iface, DWORD Index, BOOL* pEnable) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : for idx(%ld)\n", This, Index);
*pEnable = This->StateBlock.lightEnable[Index];
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_SetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,CONST float* pPlane) {
+HRESULT WINAPI IDirect3DDevice8Impl_SetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index, CONST float* pPlane) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : for idx %ld, %p\n", This, Index, pPlane);
@@ -1988,7 +2148,7 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index,float* pPlane) {
+HRESULT WINAPI IDirect3DDevice8Impl_GetClipPlane(LPDIRECT3DDEVICE8 iface, DWORD Index, float* pPlane) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) : for idx %ld\n", This, Index);
pPlane[0] = This->StateBlock.clipplane[Index][0];
@@ -1997,7 +2157,7 @@
pPlane[3] = This->StateBlock.clipplane[Index][0];
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD Value) {
+HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State, DWORD Value) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
DWORD OldValue = This->StateBlock.renderstate[State];
@@ -2541,6 +2701,26 @@
}
break;
+ case D3DRS_VERTEXBLEND :
+ {
+ This->UpdateStateBlock->vertex_blend = (D3DVERTEXBLENDFLAGS) Value;
+ TRACE("vertex_blend to %ul\n", (BOOL) Value);
+ }
+ break;
+
+ case D3DRS_TWEENFACTOR :
+ {
+ This->UpdateStateBlock->tween_factor = *((float*) &Value);
+ TRACE("tween_factor to %ul\n", (BOOL) Value);
+ }
+ break;
+
+ case D3DRS_INDEXEDVERTEXBLENDENABLE :
+ {
+ TRACE("D3DRS_INDEXEDVERTEXBLENDENABLE to %ul\n", (BOOL) Value);
+ }
+ break;
+
/* Unhandled yet...! */
case D3DRS_LINEPATTERN :
case D3DRS_LASTPIXEL :
@@ -2565,7 +2745,6 @@
case D3DRS_SPECULARMATERIALSOURCE :
case D3DRS_AMBIENTMATERIALSOURCE :
case D3DRS_EMISSIVEMATERIALSOURCE :
- case D3DRS_VERTEXBLEND :
case D3DRS_SOFTWAREVERTEXPROCESSING :
case D3DRS_POINTSIZE :
case D3DRS_POINTSIZE_MIN :
@@ -2580,9 +2759,7 @@
case D3DRS_PATCHSEGMENTS :
case D3DRS_DEBUGMONITORTOKEN :
case D3DRS_POINTSIZE_MAX :
- case D3DRS_INDEXEDVERTEXBLENDENABLE :
case D3DRS_COLORWRITEENABLE :
- case D3DRS_TWEENFACTOR :
case D3DRS_POSITIONORDER :
case D3DRS_NORMALORDER :
/*Put back later: FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); */
@@ -2594,7 +2771,7 @@
return D3D_OK;
}
-HRESULT WINAPI IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State,DWORD* pValue) {
+HRESULT WINAPI IDirect3DDevice8Impl_GetRenderState(LPDIRECT3DDEVICE8 iface, D3DRENDERSTATETYPE State, DWORD* pValue) {
ICOM_THIS(IDirect3DDevice8Impl,iface);
TRACE("(%p) for State %d = %ld\n", This, State, This->UpdateStateBlock->renderstate[State]);
*pValue = This->StateBlock.renderstate[State];
@@ -2759,7 +2936,6 @@
}
}
-
} else {
FIXME("Unrecognized state block type %d\n", pSB->blockType);
}
@@ -3192,7 +3368,7 @@
TRACE("Activating appropriate texture state %ld\n", Stage);
if (This->isMultiTexture) {
glActiveTextureARB(GL_TEXTURE0_ARB + Stage);
- checkGLcall("glActiveTextureARB");
+ /*checkGLcall("glActiveTextureARB");*/
} else if (Stage>0) {
FIXME("Program using multiple concurrent textures which this opengl implementation doesnt support\n");
}
@@ -3243,7 +3419,7 @@
TRACE("ValueMIN=%ld, ValueMIP=%ld, setting MINFILTER to %x\n", ValueMIN, ValueMIP, realVal);
glTexParameteri(This->StateBlock.textureDimensions[Stage], GL_TEXTURE_MIN_FILTER, realVal);
- checkGLcall("glTexParameter GL_TEXTURE_MINFILTER, ...");
+ /*checkGLcall("glTexParameter GL_TEXTURE_MINFILTER, ...");*/
}
break;
@@ -3251,10 +3427,10 @@
case D3DTSS_MAGFILTER :
if (Value == D3DTEXF_POINT) {
glTexParameteri(This->StateBlock.textureDimensions[Stage], GL_TEXTURE_MAG_FILTER, GL_NEAREST);
- checkGLcall("glTexParameter GL_TEXTURE_MAGFILTER, GL_NEAREST");
+ /*checkGLcall("glTexParameter GL_TEXTURE_MAGFILTER, GL_NEAREST");*/
} else if (Value == D3DTEXF_LINEAR) {
glTexParameteri(This->StateBlock.textureDimensions[Stage], GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- checkGLcall("glTexParameter GL_TEXTURE_MAGFILTER, GL_LINEAR");
+ /*checkGLcall("glTexParameter GL_TEXTURE_MAGFILTER, GL_LINEAR");*/
} else {
FIXME("Unhandled D3DTSS_MAGFILTER value of %ld\n", Value);
}
@@ -3455,22 +3631,71 @@
break;
}
+ case D3DTSS_ADDRESSU :
+ case D3DTSS_ADDRESSV :
+ case D3DTSS_ADDRESSW :
+ {
+ GLint wrapParm = GL_REPEAT;
+ switch (Value) {
+ case D3DTADDRESS_WRAP: wrapParm = GL_REPEAT; break;
+ case D3DTADDRESS_CLAMP: wrapParm = GL_CLAMP; break;
+ case D3DTADDRESS_BORDER: wrapParm = GL_CLAMP_TO_EDGE; break;
+
+ case D3DTADDRESS_MIRROR: /* Unsupported in OpenGL? */
+ case D3DTADDRESS_MIRRORONCE: /* Unsupported in OpenGL? */
+ default:
+ FIXME("Unrecognized or unsupported D3DTADDRESS_* value %ld, state %d\n", Value, Type);
+ wrapParm = GL_REPEAT;
+ }
+
+ switch (Type) {
+ case D3DTSS_ADDRESSU:
+ TRACE("Setting WRAP_S to %d for %x\n", wrapParm, This->StateBlock.textureDimensions[Stage]);
+ glTexParameteri(This->StateBlock.textureDimensions[Stage], GL_TEXTURE_WRAP_S, wrapParm);
+ checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_S, wrapParm)");
+ break;
+ case D3DTSS_ADDRESSV:
+ TRACE("Setting WRAP_T to %d for %x\n", wrapParm, This->StateBlock.textureDimensions[Stage]);
+ glTexParameteri(This->StateBlock.textureDimensions[Stage], GL_TEXTURE_WRAP_T, wrapParm);
+ checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_T, wrapParm)");
+ break;
+ case D3DTSS_ADDRESSW:
+ TRACE("Setting WRAP_R to %d for %x\n", wrapParm, This->StateBlock.textureDimensions[Stage]);
+ glTexParameteri(This->StateBlock.textureDimensions[Stage], GL_TEXTURE_WRAP_R, wrapParm);
+ checkGLcall("glTexParameteri(..., GL_TEXTURE_WRAP_R, wrapParm)");
+ break;
+ default: /* nop */
+ break; /** stupic compilator */
+ }
+ }
+ break;
+
+ case D3DTSS_BORDERCOLOR :
+ {
+ 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;
+
+ 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, ...)");
+ }
+ break;
+
/* Unhandled */
case D3DTSS_BUMPENVMAT00 :
case D3DTSS_BUMPENVMAT01 :
case D3DTSS_BUMPENVMAT10 :
case D3DTSS_BUMPENVMAT11 :
case D3DTSS_TEXCOORDINDEX :
- case D3DTSS_ADDRESSU :
- case D3DTSS_ADDRESSV :
- case D3DTSS_BORDERCOLOR :
case D3DTSS_MIPMAPLODBIAS :
case D3DTSS_MAXMIPLEVEL :
case D3DTSS_MAXANISOTROPY :
case D3DTSS_BUMPENVLSCALE :
case D3DTSS_BUMPENVLOFFSET :
case D3DTSS_TEXTURETRANSFORMFLAGS :
- case D3DTSS_ADDRESSW :
case D3DTSS_RESULTARG :
default:
/* Put back later: FIXME("(%p) : stub, Stage=%ld, Type=%d, Value =%ld\n", This, Stage, Type, Value); */
@@ -4063,9 +4288,11 @@
This->StateBlock.blockType = D3DSBT_ALL;
/* FIXME: Set some of the defaults for lights, transforms etc */
- memcpy(&This->StateBlock.transforms[D3DTS_WORLDMATRIX(0)], &idmatrix, sizeof(idmatrix));
memcpy(&This->StateBlock.transforms[D3DTS_PROJECTION], &idmatrix, sizeof(idmatrix));
memcpy(&This->StateBlock.transforms[D3DTS_VIEW], &idmatrix, sizeof(idmatrix));
+ for (i = 0; i < 256; ++i) {
+ memcpy(&This->StateBlock.transforms[D3DTS_WORLDMATRIX(i)], &idmatrix, sizeof(idmatrix));
+ }
/* Render states: */
if (This->PresentParms.EnableAutoDepthStencil) {
Index: dlls/d3d8/directx.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/directx.c,v
retrieving revision 1.11
diff -u -r1.11 directx.c
--- dlls/d3d8/directx.c 7 Jan 2003 20:36:30 -0000 1.11
+++ dlls/d3d8/directx.c 10 Jan 2003 23:43:50 -0000
@@ -58,6 +58,16 @@
return display;
}
+inline static X11DRV_OPENGL_INFO* get_opengl_info( HDC hdc, X11DRV_OPENGL_INFO* info )
+{
+ enum x11drv_escape_codes escape = X11DRV_GET_OPENGL_INFO;
+
+ if (!ExtEscape( hdc, X11DRV_ESCAPE, sizeof(escape), (LPCSTR)&escape, sizeof(X11DRV_OPENGL_INFO), (LPSTR)info )) {
+ ERR("ExtEscape pb!\n");
+ }
+ return info;
+}
+
/* IDirect3D IUnknown parts follow: */
HRESULT WINAPI IDirect3D8Impl_QueryInterface(LPDIRECT3D8 iface,REFIID riid,LPVOID *ppobj)
@@ -316,7 +326,7 @@
pCaps->DestBlendCaps = 0;
pCaps->AlphaCmpCaps = 0;
pCaps->ShadeCaps = D3DPSHADECAPS_SPECULARGOURAUDRGB | D3DPSHADECAPS_COLORGOURAUDRGB ;
- pCaps->TextureCaps = D3DPTEXTURECAPS_ALPHA | D3DPTEXTURECAPS_ALPHAPALETTE | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_VOLUMEMAP;
+ pCaps->TextureCaps = D3DPTEXTURECAPS_ALPHA | D3DPTEXTURECAPS_ALPHAPALETTE | D3DPTEXTURECAPS_CUBEMAP | D3DPTEXTURECAPS_POW2 | D3DPTEXTURECAPS_VOLUMEMAP | D3DPTEXTURECAPS_MIPMAP;
pCaps->TextureFilterCaps = 0;
pCaps->CubeTextureFilterCaps = 0;
pCaps->VolumeTextureFilterCaps = 0;
@@ -348,12 +358,12 @@
pCaps->FVFCaps = D3DFVFCAPS_PSIZE | 0x80000;
pCaps->TextureOpCaps = 0xFFFFFFFF;
+ /**
+ * OpenGL things
+ */
{
- GLint gl_max_texture_units_arb;
- glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &gl_max_texture_units_arb);
- TRACE("GLCaps: GL_MAX_TEXTURE_UNITS_ARB=%d\n", gl_max_texture_units_arb);
- pCaps->MaxTextureBlendStages = min(8, gl_max_texture_units_arb);
- pCaps->MaxSimultaneousTextures = min(8, gl_max_texture_units_arb);
+ pCaps->MaxTextureBlendStages = min(8, This->glInfo.max_textures);
+ pCaps->MaxSimultaneousTextures = min(8, This->glInfo.max_textures);
}
pCaps->VertexProcessingCaps = D3DVTXPCAPS_DIRECTIONALLIGHTS | D3DVTXPCAPS_MATERIALSOURCE7 | D3DVTXPCAPS_POSITIONALLIGHTS | D3DVTXPCAPS_TEXGEN;
@@ -370,10 +380,10 @@
pCaps->MaxStreams = 1;
pCaps->MaxStreamStride = 1024;
- pCaps->VertexShaderVersion = 01;
+ pCaps->VertexShaderVersion = D3DVS_VERSION(1,1);
pCaps->MaxVertexShaderConst = D3D8_VSHADER_MAX_CONSTANTS;
- pCaps->PixelShaderVersion = 01;
+ pCaps->PixelShaderVersion = D3DPS_VERSION(1,1);
pCaps->MaxPixelShaderValue = 1.0;
return D3D_OK;
@@ -394,8 +404,10 @@
HWND whichHWND;
int num;
XVisualInfo template;
+ /*
const char *GL_Extensions = NULL;
const char *GLX_Extensions = NULL;
+ */
ICOM_THIS(IDirect3D8Impl,iface);
TRACE("(%p)->(Adptr:%d, DevType: %x, FocusHwnd: %p, BehFlags: %lx, PresParms: %p, RetDevInt: %p)\n", This, Adapter, DeviceType,
@@ -409,6 +421,8 @@
object->lpVtbl = &Direct3DDevice8_Vtbl;
object->ref = 1;
object->direct3d8 = This;
+ /** The device AddRef the direct3d8 Interface else crash in propers clients codes */
+ IDirect3D8_AddRef((LPDIRECT3D8) object->direct3d8);
object->UpdateStateBlock = &object->StateBlock;
/* Save the creation parameters */
@@ -453,6 +467,15 @@
hDc = GetDC(whichHWND);
object->display = get_display(hDc);
+ /* Initialize some OpenGL extensions related variables */
+ if (object->direct3d8->glInfo.max_textures > 1) {
+ object->isMultiTexture = TRUE;
+ object->TextureUnits = min(8, object->direct3d8->glInfo.max_textures);
+ } else {
+ object->isMultiTexture = FALSE;
+ object->TextureUnits = 1;
+ }
+
ENTER_GL();
object->visInfo = glXChooseVisual(object->display, DefaultScreen(object->display), dblBuf);
if (NULL == object->visInfo) {
@@ -550,10 +573,13 @@
checkGLcall("glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);");
/* Initialize openGL extension related variables */
+ /*
object->isMultiTexture = FALSE;
object->TextureUnits = 1;
+ */
/* Parse the gl supported features, in theory enabling parts of our code appropriately */
+ /*
GL_Extensions = glGetString(GL_EXTENSIONS);
TRACE("GL_Extensions reported:\n");
@@ -602,7 +628,8 @@
if (*GLX_Extensions == ' ') GLX_Extensions++;
}
}
-
+ */
+
/* Setup all the devices defaults */
CreateStateBlock((LPDIRECT3DDEVICE8) object);
Index: dlls/d3d8/resource.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/resource.c,v
retrieving revision 1.1
diff -u -r1.1 resource.c
--- dlls/d3d8/resource.c 27 Sep 2002 22:46:17 -0000 1.1
+++ dlls/d3d8/resource.c 10 Jan 2003 23:44:07 -0000
@@ -34,7 +34,7 @@
ICOM_THIS(IDirect3DResource8Impl,iface);
if (IsEqualGUID(riid, &IID_IUnknown)
- || IsEqualGUID(riid, &IID_IClassFactory)) {
+ || IsEqualGUID(riid, &IID_IDirect3DResource8)) {
IDirect3DResource8Impl_AddRef(iface);
*ppobj = This;
return D3D_OK;
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 10 Jan 2003 23:44:14 -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;
}
+
Index: dlls/d3d8/surface.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/surface.c,v
retrieving revision 1.4
diff -u -r1.4 surface.c
--- dlls/d3d8/surface.c 8 Jan 2003 21:09:27 -0000 1.4
+++ dlls/d3d8/surface.c 10 Jan 2003 23:44:21 -0000
@@ -66,18 +66,18 @@
ICOM_THIS(IDirect3DSurface8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
-
- /* Note Calling this method will increase the internal reference count
- on the IDirect3DDevice8 interface. */
+ /**
+ * Note Calling this method will increase the internal reference count
+ * on the IDirect3DDevice8 interface.
+ */
IDirect3DDevice8Impl_AddRef(*ppDevice);
-
return D3D_OK;
}
-HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid,CONST void* pData,DWORD SizeOfData,DWORD Flags) {
+HRESULT WINAPI IDirect3DSurface8Impl_SetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
ICOM_THIS(IDirect3DSurface8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK;
}
-HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid,void* pData,DWORD* pSizeOfData) {
+HRESULT WINAPI IDirect3DSurface8Impl_GetPrivateData(LPDIRECT3DSURFACE8 iface, REFGUID refguid, void* pData, DWORD* pSizeOfData) {
ICOM_THIS(IDirect3DSurface8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK;
}
@@ -85,15 +85,25 @@
ICOM_THIS(IDirect3DSurface8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK;
}
-HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid,void** ppContainer) {
+HRESULT WINAPI IDirect3DSurface8Impl_GetContainer(LPDIRECT3DSURFACE8 iface, REFIID riid, void** ppContainer) {
ICOM_THIS(IDirect3DSurface8Impl,iface);
-
- /* If the surface is created using CreateImageSurface, CreateRenderTarget,
- or CreateDepthStencilSurface, the surface is considered stand alone. In this case,
- GetContainer will return the Direct3D device used to create the surface. */
+ HRESULT res;
+ /*
TRACE("(%p) : returning %p\n", This, This->Container);
*ppContainer = This->Container;
return D3D_OK;
+ */
+ res = IUnknown_QueryInterface(This->Container, riid, ppContainer);
+ if (E_NOINTERFACE == res) {
+ /**
+ * If the surface is created using CreateImageSurface, CreateRenderTarget,
+ * or CreateDepthStencilSurface, the surface is considered stand alone. In this case,
+ * GetContainer will return the Direct3D device used to create the surface.
+ */
+ res = IUnknown_QueryInterface(This->Container, &IID_IDirect3DDevice8, ppContainer);
+ }
+ TRACE("(%p) : returning %p\n", This, *ppContainer);
+ return res;
}
HRESULT WINAPI IDirect3DSurface8Impl_GetDesc(LPDIRECT3DSURFACE8 iface, D3DSURFACE_DESC *pDesc) {
ICOM_THIS(IDirect3DSurface8Impl,iface);
@@ -121,7 +131,7 @@
ICOM_THIS(IDirect3DSurface8Impl,iface);
TRACE("(%p) : stub\n", This);
if (This->Container) {
- IDirect3DBaseTexture8 *cont = This->Container;
+ IDirect3DBaseTexture8 *cont = (IDirect3DBaseTexture8*) This->Container;
/* Now setup the texture appropraitly */
int containerType = IDirect3DBaseTexture8Impl_GetType(cont);
Index: dlls/d3d8/texture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/texture.c,v
retrieving revision 1.3
diff -u -r1.3 texture.c
--- dlls/d3d8/texture.c 18 Dec 2002 05:05:41 -0000 1.3
+++ dlls/d3d8/texture.c 10 Jan 2003 23:44:35 -0000
@@ -74,7 +74,12 @@
HRESULT WINAPI IDirect3DTexture8Impl_GetDevice(LPDIRECT3DTEXTURE8 iface, IDirect3DDevice8** ppDevice) {
ICOM_THIS(IDirect3DTexture8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
- *ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ *ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ /**
+ * Note Calling this method will increase the internal reference count
+ * on the IDirect3DDevice8 interface.
+ */
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DTexture8Impl_SetPrivateData(LPDIRECT3DTEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
Index: dlls/d3d8/volumetexture.c
===================================================================
RCS file: /home/wine/wine/dlls/d3d8/volumetexture.c,v
retrieving revision 1.3
diff -u -r1.3 volumetexture.c
--- dlls/d3d8/volumetexture.c 18 Dec 2002 05:05:41 -0000 1.3
+++ dlls/d3d8/volumetexture.c 10 Jan 2003 23:44:54 -0000
@@ -77,6 +77,11 @@
ICOM_THIS(IDirect3DVolumeTexture8Impl,iface);
TRACE("(%p) : returning %p\n", This, This->Device);
*ppDevice = (LPDIRECT3DDEVICE8) This->Device;
+ /**
+ * Note Calling this method will increase the internal reference count
+ * on the IDirect3DDevice8 interface.
+ */
+ IDirect3DDevice8Impl_AddRef(*ppDevice);
return D3D_OK;
}
HRESULT WINAPI IDirect3DVolumeTexture8Impl_SetPrivateData(LPDIRECT3DVOLUMETEXTURE8 iface, REFGUID refguid, CONST void* pData, DWORD SizeOfData, DWORD Flags) {
More information about the wine-patches
mailing list