Commit 774c5f77 authored by Christian Costa's avatar Christian Costa Committed by Alexandre Julliard

Reenable OpenGL surface's flip method.

Reenable execute buffers. Some bug fixes.
parent 97bd11de
......@@ -132,20 +132,17 @@ static BOOL opengl_flip( LPVOID display, LPVOID drawable)
/*******************************************************************************
* OpenGL static functions
*/
static void set_context(IDirect3DDeviceImpl* This) {
#if 0
D3DDPRIVATE(This);
static void set_context(IDirect3DDeviceImpl* This)
{
IDirect3DDeviceGLImpl* glThis = (IDirect3DDeviceGLImpl*) This;
ENTER_GL();
TRACE("glxMakeCurrent %p, %ld, %p\n",odev->gdi_display,odev->drawable, odev->ctx);
if (glXMakeCurrent(odev->gdi_display,odev->drawable, odev->ctx) == False) {
TRACE("glxMakeCurrent %p, %ld, %p\n",glThis->display,glThis->drawable, glThis->gl_context);
if (glXMakeCurrent(glThis->display, glThis->drawable, glThis->gl_context) == False) {
ERR("Error in setting current context (context %p drawable %ld)!\n",
odev->ctx, odev->drawable);
glThis->gl_context, glThis->drawable);
}
LEAVE_GL();
#else
ERR("This function should not be called in the current state of the code...\n");
#endif
}
static void fill_opengl_primcaps(D3DPRIMCAPS *pc)
......@@ -1083,7 +1080,7 @@ d3ddevice_create(IDirect3DDeviceImpl **obj, IDirect3DImpl *d3d, IDirectDrawSurfa
glColor3f(1.0, 1.0, 1.0);
LEAVE_GL();
fill_device_capabilities(d3d->ddraw);
/* fill_device_capabilities(d3d->ddraw); */
ICOM_INIT_INTERFACE(object, IDirect3DDevice, VTABLE_IDirect3DDevice);
ICOM_INIT_INTERFACE(object, IDirect3DDevice2, VTABLE_IDirect3DDevice2);
......
......@@ -183,28 +183,26 @@ static void _dump_D3DEXECUTEBUFFERDESC(LPD3DEXECUTEBUFFERDESC lpDesc) {
static void execute(IDirect3DExecuteBufferImpl *This,
IDirect3DDeviceImpl *lpDevice,
IDirect3DViewportImpl *lpViewport) {
#if 0
IDirect3DExecuteBufferImpl* ilpBuff=(IDirect3DExecuteBufferImpl*)lpBuff;
IDirect3DViewport2Impl* ivp=(IDirect3DViewport2Impl*)vp;
/* DWORD bs = ilpBuff->desc.dwBufferSize; */
DWORD vs = ilpBuff->data.dwVertexOffset;
/* DWORD vc = ilpBuff->data.dwVertexCount; */
DWORD is = ilpBuff->data.dwInstructionOffset;
/* DWORD il = ilpBuff->data.dwInstructionLength; */
void *instr = ilpBuff->desc.lpData + is;
D3DDPRIVATE((IDirect3DDeviceImpl*)dev);
IDirect3DViewportImpl *lpViewport)
{
IDirect3DDeviceGLImpl* lpDeviceGL = (IDirect3DDeviceGLImpl*) lpDevice;
/* DWORD bs = This->desc.dwBufferSize; */
DWORD vs = This->data.dwVertexOffset;
/* DWORD vc = This->data.dwVertexCount; */
DWORD is = This->data.dwInstructionOffset;
/* DWORD il = This->data.dwInstructionLength; */
void *instr = This->desc.lpData + is;
/* Should check if the viewport was added or not to the device */
/* Activate the viewport */
ivp->device.active_device1 = (IDirect3DDeviceImpl*)dev;
ivp->activate(ivp);
lpViewport->active_device = lpDevice;
lpViewport->activate(lpViewport);
TRACE("ExecuteData : \n");
if (TRACE_ON(ddraw))
_dump_executedata(&(ilpBuff->data));
_dump_executedata(&(This->data));
ENTER_GL();
......@@ -230,12 +228,12 @@ static void execute(IDirect3DExecuteBufferImpl *This,
case D3DOP_TRIANGLE: {
int i;
OGL_Vertex *vx = (OGL_Vertex *) ilpBuff->vertex_data;
OGL_LVertex *l_vx = (OGL_LVertex *) ilpBuff->vertex_data;
D3DTLVERTEX *tl_vx = (D3DTLVERTEX *) ilpBuff->vertex_data;
OGL_Vertex *vx = (OGL_Vertex *) This->vertex_data;
OGL_LVertex *l_vx = (OGL_LVertex *) This->vertex_data;
D3DTLVERTEX *tl_vx = (D3DTLVERTEX *) This->vertex_data;
TRACE("TRIANGLE (%d)\n", count);
switch (ilpBuff->vertex_type) {
switch (This->vertex_type) {
case D3DVT_VERTEX:
/* This time, there is lighting */
glEnable(GL_LIGHTING);
......@@ -245,16 +243,16 @@ static void execute(IDirect3DExecuteBufferImpl *This,
glLoadIdentity(); /* The model transformation was done during the
transformation phase */
glMatrixMode(GL_PROJECTION);
TRACE(" Projection Matrix : (%p)\n", odev->proj_mat);
dump_mat(odev->proj_mat);
TRACE(" View Matrix : (%p)\n", odev->view_mat);
dump_mat(odev->view_mat);
TRACE(" Projection Matrix : (%p)\n", lpDeviceGL->proj_mat);
dump_mat(lpDeviceGL->proj_mat);
TRACE(" View Matrix : (%p)\n", lpDeviceGL->view_mat);
dump_mat(lpDeviceGL->view_mat);
/* Although z axis is inverted between OpenGL and Direct3D, the z projected coordinates
are always 0.0 at the front viewing volume and 1.0 at the back with Direct 3D and with
the default behaviour of OpenGL. So, no additional transformation is required. */
glLoadMatrixf((float *) odev->proj_mat);
glMultMatrixf((float *) odev->view_mat);
glLoadMatrixf((float *) lpDeviceGL->proj_mat);
glMultMatrixf((float *) lpDeviceGL->view_mat);
break;
case D3DVT_LVERTEX:
......@@ -267,16 +265,16 @@ static void execute(IDirect3DExecuteBufferImpl *This,
transformation phase */
glMatrixMode(GL_PROJECTION);
TRACE(" Projection Matrix : (%p)\n", odev->proj_mat);
dump_mat(odev->proj_mat);
TRACE(" View Matrix : (%p)\n", odev->view_mat);
dump_mat(odev->view_mat);
TRACE(" Projection Matrix : (%p)\n", lpDeviceGL->proj_mat);
dump_mat(lpDeviceGL->proj_mat);
TRACE(" View Matrix : (%p)\n", lpDeviceGL->view_mat);
dump_mat(lpDeviceGL->view_mat);
/* Although z axis is inverted between OpenGL and Direct3D, the z projected coordinates
are always 0 at the front viewing volume and 1 at the back with Direct 3D and with
the default behaviour of OpenGL. So, no additional transformation is required. */
glLoadMatrixf((float *) odev->proj_mat);
glMultMatrixf((float *) odev->view_mat);
glLoadMatrixf((float *) lpDeviceGL->proj_mat);
glMultMatrixf((float *) lpDeviceGL->view_mat);
break;
case D3DVT_TLVERTEX: {
......@@ -291,7 +289,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
if (ivp == NULL) {
if (lpViewport == NULL) {
ERR("No current viewport !\n");
/* Using standard values */
height = 640.0;
......@@ -299,10 +297,10 @@ static void execute(IDirect3DExecuteBufferImpl *This,
minZ = -10.0;
maxZ = 10.0;
} else {
height = (GLdouble) ivp->viewport.vp1.dwHeight;
width = (GLdouble) ivp->viewport.vp1.dwWidth;
minZ = (GLdouble) ivp->viewport.vp1.dvMinZ;
maxZ = (GLdouble) ivp->viewport.vp1.dvMaxZ;
height = (GLdouble) lpViewport->viewports.vp1.dwHeight;
width = (GLdouble) lpViewport->viewports.vp1.dwWidth;
minZ = (GLdouble) lpViewport->viewports.vp1.dvMinZ;
maxZ = (GLdouble) lpViewport->viewports.vp1.dvMaxZ;
if (minZ == maxZ) {
/* I do not know why, but many Dx 3.0 games have minZ = maxZ = 0.0 */
......@@ -318,7 +316,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
break;
}
switch (ilpBuff->vertex_type) {
switch (This->vertex_type) {
case D3DVT_VERTEX:
TRIANGLE_LOOP(DO_VERTEX);
break;
......@@ -381,17 +379,17 @@ static void execute(IDirect3DExecuteBufferImpl *This,
switch (ci->u1.dtstTransformStateType) {
case D3DTRANSFORMSTATE_WORLD: {
TRACE(" WORLD (%p)\n", (D3DMATRIX*) ci->u2.dwArg[0]);
odev->world_mat = (D3DMATRIX*) ci->u2.dwArg[0];
lpDeviceGL->world_mat = (D3DMATRIX*) ci->u2.dwArg[0];
} break;
case D3DTRANSFORMSTATE_VIEW: {
TRACE(" VIEW (%p)\n", (D3DMATRIX*) ci->u2.dwArg[0]);
odev->view_mat = (D3DMATRIX*) ci->u2.dwArg[0];
lpDeviceGL->view_mat = (D3DMATRIX*) ci->u2.dwArg[0];
} break;
case D3DTRANSFORMSTATE_PROJECTION: {
TRACE(" PROJECTION (%p)\n", (D3DMATRIX*) ci->u2.dwArg[0]);
odev->proj_mat = (D3DMATRIX*) ci->u2.dwArg[0];
lpDeviceGL->proj_mat = (D3DMATRIX*) ci->u2.dwArg[0];
} break;
default:
......@@ -413,7 +411,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
/* Handle the state transform */
switch (ci->u1.dlstLightStateType) {
case D3DLIGHTSTATE_MATERIAL: {
IDirect3DMaterial2Impl* mat = (IDirect3DMaterial2Impl*) ci->u2.dwArg[0];
IDirect3DMaterialImpl* mat = (IDirect3DMaterialImpl*) ci->u2.dwArg[0];
TRACE(" MATERIAL\n");
if (mat != NULL) {
......@@ -477,7 +475,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
LPD3DSTATE ci = (LPD3DSTATE) instr;
/* Handle the state transform */
set_render_state(ci->u1.drstRenderStateType, ci->u2.dwArg[0], &(odev->rs));
set_render_state(ci->u1.drstRenderStateType, ci->u2.dwArg[0], &(lpDeviceGL->render_state));
instr += size;
}
......@@ -538,14 +536,14 @@ static void execute(IDirect3DExecuteBufferImpl *This,
/* Enough for the moment */
if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORMLIGHT) {
int nb;
D3DVERTEX *src = ((LPD3DVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
OGL_Vertex *dst = ((OGL_Vertex *) (ilpBuff->vertex_data)) + ci->wDest;
D3DMATRIX *mat = odev->world_mat;
D3DVERTEX *src = ((LPD3DVERTEX) (This->desc.lpData + vs)) + ci->wStart;
OGL_Vertex *dst = ((OGL_Vertex *) (This->vertex_data)) + ci->wDest;
D3DMATRIX *mat = lpDeviceGL->world_mat;
TRACE(" World Matrix : (%p)\n", mat);
dump_mat(mat);
ilpBuff->vertex_type = D3DVT_VERTEX;
This->vertex_type = D3DVT_VERTEX;
for (nb = 0; nb < ci->dwCount; nb++) {
/* For the moment, no normal transformation... */
......@@ -567,14 +565,14 @@ static void execute(IDirect3DExecuteBufferImpl *This,
}
} else if (ci->dwFlags == D3DPROCESSVERTICES_TRANSFORM) {
int nb;
D3DLVERTEX *src = ((LPD3DLVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
OGL_LVertex *dst = ((OGL_LVertex *) (ilpBuff->vertex_data)) + ci->wDest;
D3DMATRIX *mat = odev->world_mat;
D3DLVERTEX *src = ((LPD3DLVERTEX) (This->desc.lpData + vs)) + ci->wStart;
OGL_LVertex *dst = ((OGL_LVertex *) (This->vertex_data)) + ci->wDest;
D3DMATRIX *mat = lpDeviceGL->world_mat;
TRACE(" World Matrix : (%p)\n", mat);
dump_mat(mat);
ilpBuff->vertex_type = D3DVT_LVERTEX;
This->vertex_type = D3DVT_LVERTEX;
for (nb = 0; nb < ci->dwCount; nb++) {
dst->c = src->u4.color;
......@@ -592,10 +590,10 @@ static void execute(IDirect3DExecuteBufferImpl *This,
dst++;
}
} else if (ci->dwFlags == D3DPROCESSVERTICES_COPY) {
D3DTLVERTEX *src = ((LPD3DTLVERTEX) (ilpBuff->desc.lpData + vs)) + ci->wStart;
D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (ilpBuff->vertex_data)) + ci->wDest;
D3DTLVERTEX *src = ((LPD3DTLVERTEX) (This->desc.lpData + vs)) + ci->wStart;
D3DTLVERTEX *dst = ((LPD3DTLVERTEX) (This->vertex_data)) + ci->wDest;
ilpBuff->vertex_type = D3DVT_TLVERTEX;
This->vertex_type = D3DVT_TLVERTEX;
memcpy(dst, src, ci->dwCount * sizeof(D3DTLVERTEX));
} else {
......@@ -627,7 +625,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
for (i = 0; i < count; i++) {
LPD3DBRANCH ci = (LPD3DBRANCH) instr;
if ((ilpBuff->data.dsStatus.dwStatus & ci->dwMask) == ci->dwValue) {
if ((This->data.dsStatus.dwStatus & ci->dwMask) == ci->dwValue) {
if (!ci->bNegate) {
TRACE(" Should branch to %ld\n", ci->dwOffset);
}
......@@ -654,7 +652,7 @@ static void execute(IDirect3DExecuteBufferImpl *This,
for (i = 0; i < count; i++) {
LPD3DSTATUS ci = (LPD3DSTATUS) instr;
ilpBuff->data.dsStatus = *ci;
This->data.dsStatus = *ci;
instr += size;
}
......@@ -668,11 +666,8 @@ static void execute(IDirect3DExecuteBufferImpl *This,
}
}
end_of_buffer:
end_of_buffer:
LEAVE_GL();
#else
FIXME("Need to make this function compile again !!!\n");
#endif
}
HRESULT WINAPI
......@@ -868,7 +863,7 @@ HRESULT d3dexecutebuffer_create(IDirect3DExecuteBufferImpl **obj, IDirect3DImpl
object->d3ddev = d3ddev;
/* Initializes memory */
memcpy(&object->desc, &lpDesc, lpDesc->dwSize);
memcpy(&object->desc, lpDesc, lpDesc->dwSize);
/* No buffer given */
if ((object->desc.dwFlags & D3DDEB_LPDATA) == 0)
......
......@@ -426,7 +426,7 @@ Thunk_IDirect3DImpl_1_CreateMaterial(LPDIRECT3D iface,
&ret_val,
pUnkOuter);
*lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, &ret_val);
*lplpDirect3DMaterial = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial, ret_val);
TRACE(" returning interface %p.\n", *lplpDirect3DMaterial);
......@@ -457,7 +457,7 @@ Thunk_IDirect3DImpl_2_CreateMaterial(LPDIRECT3D2 iface,
&ret_val,
pUnkOuter);
*lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, &ret_val);
*lplpDirect3DMaterial2 = COM_INTERFACE_CAST(IDirect3DMaterialImpl, IDirect3DMaterial3, IDirect3DMaterial2, ret_val);
TRACE(" returning interface %p.\n", *lplpDirect3DMaterial2);
......
......@@ -281,7 +281,7 @@ ICOM_VTABLE(IDirect3D3) VTABLE_IDirect3D3 =
XCAST(AddRef) Thunk_IDirect3DImpl_3_AddRef,
XCAST(Release) Thunk_IDirect3DImpl_3_Release,
XCAST(EnumDevices) GL_IDirect3DImpl_3_EnumDevices,
XCAST(CreateLight) Main_IDirect3DImpl_3_2T_1T_CreateLight,
XCAST(CreateLight) GL_IDirect3DImpl_3_2T_1T_CreateLight,
XCAST(CreateMaterial) GL_IDirect3DImpl_3_2T_1T_CreateMaterial,
XCAST(CreateViewport) GL_IDirect3DImpl_3_2T_1T_CreateViewport,
XCAST(FindDevice) Main_IDirect3DImpl_3_2T_FindDevice,
......@@ -308,7 +308,7 @@ ICOM_VTABLE(IDirect3D2) VTABLE_IDirect3D2 =
XCAST(QueryInterface) Thunk_IDirect3DImpl_2_QueryInterface,
XCAST(AddRef) Thunk_IDirect3DImpl_2_AddRef,
XCAST(Release) Thunk_IDirect3DImpl_2_Release,
XCAST(EnumDevices) Thunk_IDirect3DImpl_2_EnumDevices,
XCAST(EnumDevices) GL_IDirect3DImpl_2_EnumDevices,
XCAST(CreateLight) Thunk_IDirect3DImpl_2_CreateLight,
XCAST(CreateMaterial) Thunk_IDirect3DImpl_2_CreateMaterial,
XCAST(CreateViewport) Thunk_IDirect3DImpl_2_CreateViewport,
......@@ -334,7 +334,7 @@ ICOM_VTABLE(IDirect3D) VTABLE_IDirect3D =
XCAST(AddRef) Thunk_IDirect3DImpl_1_AddRef,
XCAST(Release) Thunk_IDirect3DImpl_1_Release,
XCAST(Initialize) Main_IDirect3DImpl_1_Initialize,
XCAST(EnumDevices) Thunk_IDirect3DImpl_1_EnumDevices,
XCAST(EnumDevices) GL_IDirect3DImpl_1_EnumDevices,
XCAST(CreateLight) Thunk_IDirect3DImpl_1_CreateLight,
XCAST(CreateMaterial) Thunk_IDirect3DImpl_1_CreateMaterial,
XCAST(CreateViewport) Thunk_IDirect3DImpl_1_CreateViewport,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment