- first draft of D3DCLIPSTATUS8 handling (not really used for now)

- add a new DEBUG_SINGLE_MODE #define (for debug caps needs)
- better traces for surface dumping
- much better Texture support on Utilities functions and on
  CheckDeviceType
- D3DRS_ZVISIBLE as unsupported (as seen in msdn)
This commit is contained in:
Raphael Junqueira 2004-05-19 04:33:42 +00:00 committed by Alexandre Julliard
parent dfbf36d3e8
commit 40dd9692d9
6 changed files with 261 additions and 53 deletions

View File

@ -1095,9 +1095,10 @@ struct IDirect3DStateBlockImpl {
SAVEDSTATES Changed; SAVEDSTATES Changed;
SAVEDSTATES Set; SAVEDSTATES Set;
/* ClipPlane */ /* Clipping */
double clipplane[MAX_CLIPPLANES][4]; double clipplane[MAX_CLIPPLANES][4];
D3DCLIPSTATUS8 clip_status;
/* Stream Source */ /* Stream Source */
UINT stream_stride[MAX_STREAMS]; UINT stream_stride[MAX_STREAMS];
IDirect3DVertexBuffer8 *stream_source[MAX_STREAMS]; IDirect3DVertexBuffer8 *stream_source[MAX_STREAMS];

View File

@ -330,7 +330,8 @@ UINT WINAPI IDirect3DDevice8Impl_GetAvailableTextureMem(LPDIRECT3DDEVICE8 i
HRESULT WINAPI IDirect3DDevice8Impl_ResourceManagerDiscardBytes(LPDIRECT3DDEVICE8 iface, DWORD Bytes) { HRESULT WINAPI IDirect3DDevice8Impl_ResourceManagerDiscardBytes(LPDIRECT3DDEVICE8 iface, DWORD Bytes) {
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK; FIXME("(%p) : stub\n", This);
return D3D_OK;
} }
HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface, IDirect3D8** ppD3D8) { HRESULT WINAPI IDirect3DDevice8Impl_GetDirect3D(LPDIRECT3DDEVICE8 iface, IDirect3D8** ppD3D8) {
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
@ -480,7 +481,8 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateAdditionalSwapChain(LPDIRECT3DDEVICE
} }
HRESULT WINAPI IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) { HRESULT WINAPI IDirect3DDevice8Impl_Reset(LPDIRECT3DDEVICE8 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK; FIXME("(%p) : stub\n", This);
return D3D_OK;
} }
HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface, HRESULT WINAPI IDirect3DDevice8Impl_Present(LPDIRECT3DDEVICE8 iface,
CONST RECT* pSourceRect, CONST RECT* pDestRect, CONST RECT* pSourceRect, CONST RECT* pDestRect,
@ -2492,6 +2494,15 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
if (disable & D3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); } if (disable & D3DCLIPPLANE3) { glDisable(GL_CLIP_PLANE3); checkGLcall("glDisable(clip plane 3)"); }
if (disable & D3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); } if (disable & D3DCLIPPLANE4) { glDisable(GL_CLIP_PLANE4); checkGLcall("glDisable(clip plane 4)"); }
if (disable & D3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); } if (disable & D3DCLIPPLANE5) { glDisable(GL_CLIP_PLANE5); checkGLcall("glDisable(clip plane 5)"); }
/** update clipping status */
if (enable) {
This->StateBlock->clip_status.ClipUnion = 0;
This->StateBlock->clip_status.ClipIntersection = 0xFFFFFFFF;
} else {
This->StateBlock->clip_status.ClipUnion = 0;
This->StateBlock->clip_status.ClipIntersection = 0;
}
} }
break; break;
@ -3000,9 +3011,34 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
} }
break; break;
/* Unhandled yet...! */
case D3DRS_LASTPIXEL : case D3DRS_LASTPIXEL :
{
if (Value) {
TRACE("Last Pixel Drawing Enabled\n");
} else {
FIXME("Last Pixel Drawing Disabled, not handled yet\n");
}
}
break;
case D3DRS_SOFTWAREVERTEXPROCESSING :
{
if (Value) {
TRACE("Software Processing Enabled\n");
} else {
TRACE("Software Processing Disabled\n");
}
}
break;
/** not supported */
case D3DRS_ZVISIBLE : case D3DRS_ZVISIBLE :
{
LEAVE_GL();
return D3DERR_INVALIDCALL;
}
/* Unhandled yet...! */
case D3DRS_EDGEANTIALIAS : case D3DRS_EDGEANTIALIAS :
case D3DRS_WRAP0 : case D3DRS_WRAP0 :
case D3DRS_WRAP1 : case D3DRS_WRAP1 :
@ -3012,7 +3048,6 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
case D3DRS_WRAP5 : case D3DRS_WRAP5 :
case D3DRS_WRAP6 : case D3DRS_WRAP6 :
case D3DRS_WRAP7 : case D3DRS_WRAP7 :
case D3DRS_SOFTWAREVERTEXPROCESSING :
case D3DRS_POINTSPRITEENABLE : case D3DRS_POINTSPRITEENABLE :
case D3DRS_MULTISAMPLEANTIALIAS : case D3DRS_MULTISAMPLEANTIALIAS :
case D3DRS_MULTISAMPLEMASK : case D3DRS_MULTISAMPLEMASK :
@ -3022,7 +3057,7 @@ HRESULT WINAPI IDirect3DDevice8Impl_SetRenderState(LPDIRECT3DDEVICE8 iface, D3
case D3DRS_POSITIONORDER : case D3DRS_POSITIONORDER :
case D3DRS_NORMALORDER : case D3DRS_NORMALORDER :
/*Put back later: FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); */ /*Put back later: FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value); */
TRACE("(%p)->(%d,%ld) not handled yet\n", This, State, Value); FIXME("(%p)->(%d,%ld) not handled yet\n", This, State, Value);
break; break;
default: default:
FIXME("(%p)->(%d,%ld) unrecognized\n", This, State, Value); FIXME("(%p)->(%d,%ld) unrecognized\n", This, State, Value);
@ -3097,11 +3132,23 @@ HRESULT WINAPI IDirect3DDevice8Impl_CreateStateBlock(LPDIRECT3DDEVICE8 iface,
HRESULT WINAPI IDirect3DDevice8Impl_SetClipStatus(LPDIRECT3DDEVICE8 iface, CONST D3DCLIPSTATUS8* pClipStatus) { HRESULT WINAPI IDirect3DDevice8Impl_SetClipStatus(LPDIRECT3DDEVICE8 iface, CONST D3DCLIPSTATUS8* pClipStatus) {
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK; FIXME("(%p) : stub\n", This);
if (NULL == pClipStatus) {
return D3DERR_INVALIDCALL;
}
This->UpdateStateBlock->clip_status.ClipUnion = pClipStatus->ClipUnion;
This->UpdateStateBlock->clip_status.ClipIntersection = pClipStatus->ClipIntersection;
return D3D_OK;
} }
HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface, D3DCLIPSTATUS8* pClipStatus) { HRESULT WINAPI IDirect3DDevice8Impl_GetClipStatus(LPDIRECT3DDEVICE8 iface, D3DCLIPSTATUS8* pClipStatus) {
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);
FIXME("(%p) : stub\n", This); return D3D_OK; FIXME("(%p) : stub\n", This);
if (NULL == pClipStatus) {
return D3DERR_INVALIDCALL;
}
pClipStatus->ClipUnion = This->UpdateStateBlock->clip_status.ClipUnion;
pClipStatus->ClipIntersection = This->UpdateStateBlock->clip_status.ClipIntersection;
return D3D_OK;
} }
HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) { HRESULT WINAPI IDirect3DDevice8Impl_GetTexture(LPDIRECT3DDEVICE8 iface, DWORD Stage,IDirect3DBaseTexture8** ppTexture) {
ICOM_THIS(IDirect3DDevice8Impl,iface); ICOM_THIS(IDirect3DDevice8Impl,iface);

View File

@ -264,6 +264,10 @@ HRESULT WINAPI IDirect3D8Impl_GetAdapterIdentifier (LPDIRECT3D8 iface,
return D3D_OK; return D3D_OK;
} }
/*#define DEBUG_SINGLE_MODE*/
#undef DEBUG_SINGLE_MODE
UINT WINAPI IDirect3D8Impl_GetAdapterModeCount (LPDIRECT3D8 iface, UINT WINAPI IDirect3D8Impl_GetAdapterModeCount (LPDIRECT3D8 iface,
UINT Adapter) { UINT Adapter) {
ICOM_THIS(IDirect3D8Impl,iface); ICOM_THIS(IDirect3D8Impl,iface);
@ -275,12 +279,16 @@ UINT WINAPI IDirect3D8Impl_GetAdapterModeCount (LPDIRECT3D8 iface,
} }
if (Adapter == 0) { /* Display */ if (Adapter == 0) { /* Display */
DEVMODEW DevModeW;
int i = 0; int i = 0;
#if !defined( DEBUG_SINGLE_MODE )
DEVMODEW DevModeW;
while (EnumDisplaySettingsExW(NULL, i, &DevModeW, 0)) { while (EnumDisplaySettingsExW(NULL, i, &DevModeW, 0)) {
i++; i++;
} }
#else
i = 1;
#endif
TRACE_(d3d_caps)("(%p}->(Adapter: %d) => %d\n", This, Adapter, i); TRACE_(d3d_caps)("(%p}->(Adapter: %d) => %d\n", This, Adapter, i);
return i; return i;
} else { } else {
@ -296,13 +304,16 @@ HRESULT WINAPI IDirect3D8Impl_EnumAdapterModes (LPDIRECT3D8 iface,
TRACE_(d3d_caps)("(%p}->(Adapter:%d, mode:%d, pMode:%p)\n", This, Adapter, Mode, pMode); TRACE_(d3d_caps)("(%p}->(Adapter:%d, mode:%d, pMode:%p)\n", This, Adapter, Mode, pMode);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) { if (NULL == pMode ||
Adapter >= IDirect3D8Impl_GetAdapterCount(iface) ||
Mode >= IDirect3D8Impl_GetAdapterModeCount(iface, Adapter)) {
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
} }
if (Adapter == 0) { /* Display */ if (Adapter == 0) { /* Display */
HDC hdc;
int bpp = 0; int bpp = 0;
#if !defined( DEBUG_SINGLE_MODE )
HDC hdc;
DEVMODEW DevModeW; DEVMODEW DevModeW;
if (EnumDisplaySettingsExW(NULL, Mode, &DevModeW, 0)) if (EnumDisplaySettingsExW(NULL, Mode, &DevModeW, 0))
@ -332,8 +343,16 @@ HRESULT WINAPI IDirect3D8Impl_EnumAdapterModes (LPDIRECT3D8 iface,
case 24: /* pMode->Format = D3DFMT_R5G6B5; break;*/ /* Make 24bit appear as 32 bit */ case 24: /* pMode->Format = D3DFMT_R5G6B5; break;*/ /* Make 24bit appear as 32 bit */
case 32: pMode->Format = D3DFMT_A8R8G8B8; break; case 32: pMode->Format = D3DFMT_A8R8G8B8; break;
default: pMode->Format = D3DFMT_UNKNOWN; default: pMode->Format = D3DFMT_UNKNOWN;
} }
TRACE_(d3d_caps)("W %d H %d rr %d fmt (%x,%s) bpp %u\n", pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format, debug_d3dformat(pMode->Format), bpp); #else
if (Mode > 0) return D3DERR_INVALIDCALL;
pMode->Width = 800;
pMode->Height = 600;
pMode->RefreshRate = D3DADAPTER_DEFAULT;
pMode->Format = D3DFMT_A8R8G8B8;
bpp = 32;
#endif
TRACE_(d3d_caps)("W %d H %d rr %d fmt (%x,%s) bpp %u\n", pMode->Width, pMode->Height, pMode->RefreshRate, pMode->Format, debug_d3dformat(pMode->Format), bpp);
} else { } else {
FIXME_(d3d_caps)("Adapter not primary display\n"); FIXME_(d3d_caps)("Adapter not primary display\n");
@ -347,7 +366,8 @@ HRESULT WINAPI IDirect3D8Impl_GetAdapterDisplayMode (LPDIRECT3D8 iface,
ICOM_THIS(IDirect3D8Impl,iface); ICOM_THIS(IDirect3D8Impl,iface);
TRACE_(d3d_caps)("(%p}->(Adapter: %d, pMode: %p)\n", This, Adapter, pMode); TRACE_(d3d_caps)("(%p}->(Adapter: %d, pMode: %p)\n", This, Adapter, pMode);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) { if (NULL == pMode ||
Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL; return D3DERR_INVALIDCALL;
} }
@ -393,6 +413,11 @@ HRESULT WINAPI IDirect3D8Impl_CheckDeviceType (LPDIRECT3D8 iface,
DisplayFormat, debug_d3dformat(DisplayFormat), DisplayFormat, debug_d3dformat(DisplayFormat),
BackBufferFormat, debug_d3dformat(BackBufferFormat), BackBufferFormat, debug_d3dformat(BackBufferFormat),
Windowed); Windowed);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL;
}
/* /*
switch (DisplayFormat) { switch (DisplayFormat) {
case D3DFMT_A8R8G8B8: case D3DFMT_A8R8G8B8:
@ -401,7 +426,13 @@ HRESULT WINAPI IDirect3D8Impl_CheckDeviceType (LPDIRECT3D8 iface,
break; break;
} }
*/ */
switch (DisplayFormat) {
/*case D3DFMT_R5G6B5:*/
case D3DFMT_R3G3B2:
return D3DERR_NOTAVAILABLE;
default:
break;
}
return D3D_OK; return D3D_OK;
} }
@ -409,7 +440,7 @@ HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat (LPDIRECT3D8 iface,
UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, UINT Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat,
DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) { DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat) {
ICOM_THIS(IDirect3D8Impl,iface); ICOM_THIS(IDirect3D8Impl,iface);
TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%lu,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s))\n", TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType:(%u,%s), AdptFmt:(%u,%s), Use:(%lu,%s), ResTyp:(%x,%s), CheckFmt:(%u,%s)) ",
This, This,
Adapter, Adapter,
DeviceType, debug_d3ddevicetype(DeviceType), DeviceType, debug_d3ddevicetype(DeviceType),
@ -418,37 +449,79 @@ HRESULT WINAPI IDirect3D8Impl_CheckDeviceFormat (LPDIRECT3D8 iface,
RType, debug_d3dressourcetype(RType), RType, debug_d3dressourcetype(RType),
CheckFormat, debug_d3dformat(CheckFormat)); CheckFormat, debug_d3dformat(CheckFormat));
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL;
}
if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) { if (GL_SUPPORT(EXT_TEXTURE_COMPRESSION_S3TC)) {
switch (CheckFormat) { switch (CheckFormat) {
case D3DFMT_DXT1: case D3DFMT_DXT1:
case D3DFMT_DXT3: case D3DFMT_DXT3:
case D3DFMT_DXT5: case D3DFMT_DXT5:
return D3D_OK; TRACE_(d3d_caps)("[OK]\n");
return D3D_OK;
default: default:
break; /* Avoid compiler warnings */ break; /* Avoid compiler warnings */
} }
} }
switch (CheckFormat) { switch (CheckFormat) {
case D3DFMT_UYVY: /*****
case D3DFMT_YUY2: * check supported using GL_SUPPORT
*/
case D3DFMT_DXT1: case D3DFMT_DXT1:
case D3DFMT_DXT2: case D3DFMT_DXT2:
case D3DFMT_DXT3: case D3DFMT_DXT3:
case D3DFMT_DXT4: case D3DFMT_DXT4:
case D3DFMT_DXT5: case D3DFMT_DXT5:
case D3DFMT_X8L8V8U8:
case D3DFMT_L6V5U5: /*****
/*case D3DFMT_V8U8:*/ * supported
case D3DFMT_L8: */
/*case D3DFMT_R5G6B5: */
/*case D3DFMT_X1R5G5B5:*/
/*case D3DFMT_A1R5G5B5: */
/*case D3DFMT_A4R4G4B4:*/
/*****
* unsupported
*/
/* color buffer */
/*case D3DFMT_X8R8G8B8:*/
case D3DFMT_A8R3G3B2:
/* Paletted */
case D3DFMT_P8: case D3DFMT_P8:
case D3DFMT_A8P8: case D3DFMT_A8P8:
/* Luminance */
case D3DFMT_L8:
case D3DFMT_A8L8:
case D3DFMT_A4L4:
/* Bump */
/*case D3DFMT_V8U8:*/
/*case D3DFMT_V16U16:*/
case D3DFMT_L6V5U5:
case D3DFMT_X8L8V8U8:
case D3DFMT_Q8W8V8U8:
case D3DFMT_W11V11U10:
/****
* currently hard to support
*/
case D3DFMT_UYVY:
case D3DFMT_YUY2:
/* Since we do not support these formats right now, don't pretend to. */ /* Since we do not support these formats right now, don't pretend to. */
TRACE_(d3d_caps)("[FAILED]\n");
return D3DERR_NOTAVAILABLE; return D3DERR_NOTAVAILABLE;
default: default:
break; break;
} }
TRACE_(d3d_caps)("[OK]\n");
return D3D_OK; return D3D_OK;
} }
@ -464,6 +537,10 @@ HRESULT WINAPI IDirect3D8Impl_CheckDeviceMultiSampleType(LPDIRECT3D8 iface,
Windowed, Windowed,
MultiSampleType); MultiSampleType);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL;
}
if (D3DMULTISAMPLE_NONE == MultiSampleType) if (D3DMULTISAMPLE_NONE == MultiSampleType)
return D3D_OK; return D3D_OK;
return D3DERR_NOTAVAILABLE; return D3DERR_NOTAVAILABLE;
@ -481,6 +558,10 @@ HRESULT WINAPI IDirect3D8Impl_CheckDepthStencilMatch(LPDIRECT3D8 iface,
RenderTargetFormat, debug_d3dformat(RenderTargetFormat), RenderTargetFormat, debug_d3dformat(RenderTargetFormat),
DepthStencilFormat, debug_d3dformat(DepthStencilFormat)); DepthStencilFormat, debug_d3dformat(DepthStencilFormat));
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL;
}
#if 0 #if 0
switch (DepthStencilFormat) { switch (DepthStencilFormat) {
case D3DFMT_D24X4S4: case D3DFMT_D24X4S4:
@ -508,6 +589,10 @@ HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Adapter, D
TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps); TRACE_(d3d_caps)("(%p)->(Adptr:%d, DevType: %x, pCaps: %p)\n", This, Adapter, DeviceType, pCaps);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL;
}
/* Note: GL seems to trap if GetDeviceCaps is called before any HWND's created /* Note: GL seems to trap if GetDeviceCaps is called before any HWND's created
ie there is no GL Context - Get a default rendering context to enable the ie there is no GL Context - Get a default rendering context to enable the
function query some info from GL */ function query some info from GL */
@ -780,6 +865,11 @@ HRESULT WINAPI IDirect3D8Impl_GetDeviceCaps(LPDIRECT3D8 iface, UINT Adapter, D
HMONITOR WINAPI IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT Adapter) { HMONITOR WINAPI IDirect3D8Impl_GetAdapterMonitor(LPDIRECT3D8 iface, UINT Adapter) {
ICOM_THIS(IDirect3D8Impl,iface); ICOM_THIS(IDirect3D8Impl,iface);
FIXME_(d3d_caps)("(%p)->(Adptr:%d)\n", This, Adapter); FIXME_(d3d_caps)("(%p)->(Adptr:%d)\n", This, Adapter);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return NULL;
}
return D3D_OK; return D3D_OK;
} }
@ -800,9 +890,9 @@ static void IDirect3D8Impl_FillGLCaps(LPDIRECT3D8 iface, Display* display) {
TRACE_(d3d_caps)("(%p, %p)\n", This, display); TRACE_(d3d_caps)("(%p, %p)\n", This, display);
if (NULL != display) { if (NULL != display) {
test = glXQueryVersion(NULL, &major, &minor); test = glXQueryVersion(display, &major, &minor);
This->gl_info.glx_version = ((major & 0x0000FFFF) << 16) | (minor & 0x0000FFFF); This->gl_info.glx_version = ((major & 0x0000FFFF) << 16) | (minor & 0x0000FFFF);
gl_string = glXGetClientString(NULL, GLX_VENDOR); gl_string = glXGetClientString(display, GLX_VENDOR);
} else { } else {
gl_string = glGetString(GL_VENDOR); gl_string = glGetString(GL_VENDOR);
} }
@ -1109,6 +1199,10 @@ HRESULT WINAPI IDirect3D8Impl_CreateDevice (LPDIRECT3D8 iface,
TRACE("(%p)->(Adptr:%d, DevType: %x, FocusHwnd: %p, BehFlags: %lx, PresParms: %p, RetDevInt: %p)\n", This, Adapter, DeviceType, TRACE("(%p)->(Adptr:%d, DevType: %x, FocusHwnd: %p, BehFlags: %lx, PresParms: %p, RetDevInt: %p)\n", This, Adapter, DeviceType,
hFocusWindow, BehaviourFlags, pPresentationParameters, ppReturnedDeviceInterface); hFocusWindow, BehaviourFlags, pPresentationParameters, ppReturnedDeviceInterface);
if (Adapter >= IDirect3D8Impl_GetAdapterCount(iface)) {
return D3DERR_INVALIDCALL;
}
/* Allocate the storage for the device */ /* Allocate the storage for the device */
object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDevice8Impl)); object = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(IDirect3DDevice8Impl));
if (NULL == object) { if (NULL == object) {

View File

@ -178,6 +178,10 @@ HRESULT WINAPI IDirect3DDeviceImpl_InitStartupStateBlock(IDirect3DDevice8Impl* T
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POSITIONORDER, D3DORDER_CUBIC); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_POSITIONORDER, D3DORDER_CUBIC);
IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_NORMALORDER, D3DORDER_LINEAR); IDirect3DDevice8Impl_SetRenderState(iface, D3DRS_NORMALORDER, D3DORDER_LINEAR);
/** clipping status */
This->StateBlock->clip_status.ClipUnion = 0;
This->StateBlock->clip_status.ClipIntersection = 0xFFFFFFFF;
/* Texture Stage States - Put directly into state block, we will call function below */ /* Texture Stage States - Put directly into state block, we will call function below */
for (i = 0; i < GL_LIMITS(textures); i++) { for (i = 0; i < GL_LIMITS(textures); i++) {
memcpy(&This->StateBlock->transforms[D3DTS_TEXTURE0 + i], &idmatrix, sizeof(idmatrix)); memcpy(&This->StateBlock->transforms[D3DTS_TEXTURE0 + i], &idmatrix, sizeof(idmatrix));
@ -487,7 +491,7 @@ HRESULT WINAPI IDirect3DDeviceImpl_ApplyStateBlock(IDirect3DDevice8Impl* This,
for (i=0; i<MAX_STREAMS; i++) { for (i=0; i<MAX_STREAMS; i++) {
if (pSB->Set.stream_source[i] && pSB->Changed.stream_source[i]) if (pSB->Set.stream_source[i] && pSB->Changed.stream_source[i])
IDirect3DDevice8Impl_SetStreamSource(iface, i, pSB->stream_source[i], pSB->stream_stride[i]); IDirect3DDevice8Impl_SetStreamSource(iface, i, pSB->stream_source[i], pSB->stream_stride[i]);
} }
for (i = 0; i < GL_LIMITS(clipplanes); i++) { for (i = 0; i < GL_LIMITS(clipplanes); i++) {
if (pSB->Set.clipplane[i] && pSB->Changed.clipplane[i]) { if (pSB->Set.clipplane[i] && pSB->Changed.clipplane[i]) {

View File

@ -591,10 +591,12 @@ HRESULT WINAPI IDirect3DSurface8Impl_LoadTexture(LPDIRECT3DSURFACE8 iface, GLenu
FIXME("Using DXT1/3/5 without advertized support\n"); FIXME("Using DXT1/3/5 without advertized support\n");
} }
} else { } else {
TRACE("Calling glTexImage2D %x i=%d, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n",
TRACE("Calling glTexImage2D %x i=%d, d3dfmt=%s, intfmt=%x, w=%d, h=%d,0=%d, glFmt=%x, glType=%x, Mem=%p\n",
gl_target, gl_target,
gl_level, gl_level,
D3DFmt2GLIntFmt(This->Device, This->myDesc.Format), debug_d3dformat(This->myDesc.Format),
D3DFmt2GLIntFmt(This->Device, This->myDesc.Format),
This->myDesc.Width, This->myDesc.Width,
This->myDesc.Height, This->myDesc.Height,
0, 0,
@ -623,9 +625,16 @@ HRESULT WINAPI IDirect3DSurface8Impl_LoadTexture(LPDIRECT3DSURFACE8 iface, GLenu
char buffer[4096]; char buffer[4096];
++gen; ++gen;
if ((gen % 10) == 0) { if ((gen % 10) == 0) {
snprintf(buffer, sizeof(buffer), "/tmp/surface%u_level%u_%u.ppm", gl_target, gl_level, gen); snprintf(buffer, sizeof(buffer), "/tmp/surface%p_type%u_level%u_%u.ppm", This, gl_target, gl_level, gen);
IDirect3DSurface8Impl_SaveSnapshot((LPDIRECT3DSURFACE8) This, buffer); IDirect3DSurface8Impl_SaveSnapshot((LPDIRECT3DSURFACE8) This, buffer);
} }
/*
* debugging crash code
if (gen == 250) {
void** test = NULL;
*test = 0;
}
*/
} }
#endif #endif
} }

View File

@ -376,30 +376,41 @@ SHORT D3DFmtGetBpp(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
switch (fmt) { switch (fmt) {
/* color buffer */ /* color buffer */
case D3DFMT_P8: retVal = 1; break;
case D3DFMT_R3G3B2: retVal = 1; break; case D3DFMT_R3G3B2: retVal = 1; break;
case D3DFMT_V8U8: retVal = 2; break;
case D3DFMT_R5G6B5: retVal = 2; break; case D3DFMT_R5G6B5: retVal = 2; break;
case D3DFMT_R8G8B8: retVal = 3; break;
case D3DFMT_A1R5G5B5: retVal = 2; break;
case D3DFMT_X1R5G5B5: retVal = 2; break; case D3DFMT_X1R5G5B5: retVal = 2; break;
case D3DFMT_A4R4G4B4: retVal = 2; break; case D3DFMT_A4R4G4B4: retVal = 2; break;
case D3DFMT_X4R4G4B4: retVal = 2; break; case D3DFMT_X4R4G4B4: retVal = 2; break;
case D3DFMT_A1R5G5B5: retVal = 2; break;
case D3DFMT_R8G8B8: retVal = 3; break;
case D3DFMT_X8R8G8B8: retVal = 4; break;
case D3DFMT_A8R8G8B8: retVal = 4; break; case D3DFMT_A8R8G8B8: retVal = 4; break;
case D3DFMT_X8R8G8B8: retVal = 4; break;
/* Paletted */
case D3DFMT_P8: retVal = 1; break;
case D3DFMT_A8P8: retVal = 2; break;
/* depth/stencil buffer */ /* depth/stencil buffer */
case D3DFMT_D16_LOCKABLE: retVal = 2; break; case D3DFMT_D16_LOCKABLE: retVal = 2; break;
case D3DFMT_D16: retVal = 2; break; case D3DFMT_D16: retVal = 2; break;
case D3DFMT_D32: retVal = 4; break;
case D3DFMT_D15S1: retVal = 2; break; case D3DFMT_D15S1: retVal = 2; break;
case D3DFMT_D24X4S4: retVal = 4; break; case D3DFMT_D24X4S4: retVal = 4; break;
case D3DFMT_D24S8: retVal = 4; break; case D3DFMT_D24S8: retVal = 4; break;
case D3DFMT_D24X8: retVal = 4; break; case D3DFMT_D24X8: retVal = 4; break;
case D3DFMT_D32: retVal = 4; break; /* Luminance */
case D3DFMT_L8: retVal = 1; break;
case D3DFMT_A4L4: retVal = 1; break;
case D3DFMT_A8L8: retVal = 2; break;
/* Bump */
case D3DFMT_V8U8: retVal = 2; break;
case D3DFMT_L6V5U5: retVal = 2; break;
case D3DFMT_V16U16: retVal = 4; break;
case D3DFMT_X8L8V8U8: retVal = 4; break;
/* Compressed */ /* Compressed */
case D3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */ case D3DFMT_DXT1: retVal = 1; break; /* Actually 8 bytes per 16 pixels - Special cased later */
case D3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */ case D3DFMT_DXT3: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
case D3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */ case D3DFMT_DXT5: retVal = 1; break; /* Actually 16 bytes per 16 pixels */
/* to see */
case D3DFMT_A8: retVal = 1; break;
/* unknown */ /* unknown */
case D3DFMT_UNKNOWN: case D3DFMT_UNKNOWN:
/* Guess at the highest value of the above */ /* Guess at the highest value of the above */
@ -431,16 +442,30 @@ GLint D3DFmt2GLIntFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
if (retVal == 0) { if (retVal == 0) {
switch (fmt) { switch (fmt) {
/* Paletted */
case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break; case D3DFMT_P8: retVal = GL_COLOR_INDEX8_EXT; break;
case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break; case D3DFMT_A8P8: retVal = GL_COLOR_INDEX8_EXT; break;
/* Luminance */
case D3DFMT_L8: retVal = GL_LUMINANCE8; break;
case D3DFMT_A8L8: retVal = GL_LUMINANCE8_ALPHA8; break;
case D3DFMT_A4L4: retVal = GL_LUMINANCE4_ALPHA4; break;
/* Bump */
case D3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break; case D3DFMT_V8U8: retVal = GL_COLOR_INDEX8_EXT; break;
case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break; case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX8_EXT; break;
case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break; case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
case D3DFMT_X8R8G8B8: retVal = GL_RGB8; break; /* color buffer */
case D3DFMT_R8G8B8: retVal = GL_RGB8; break; case D3DFMT_R3G3B2: retVal = GL_R3_G3_B2; break;
case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */ case D3DFMT_R5G6B5: retVal = GL_RGB5; break; /* fixme: internal format 6 for g? */
case D3DFMT_R8G8B8: retVal = GL_RGB8; break;
case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break; case D3DFMT_A1R5G5B5: retVal = GL_RGB5_A1; break;
case D3DFMT_X1R5G5B5: retVal = GL_RGB5_A1; break;
case D3DFMT_A4R4G4B4: retVal = GL_RGBA4; break;
case D3DFMT_X4R4G4B4: retVal = GL_RGBA4; break;
case D3DFMT_A8R8G8B8: retVal = GL_RGBA8; break;
case D3DFMT_X8R8G8B8: retVal = GL_RGBA8; break;
/* to see */
case D3DFMT_A8: retVal = GL_ALPHA8; break;
default: default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = GL_RGB8; retVal = GL_RGB8;
@ -466,16 +491,30 @@ GLenum D3DFmt2GLFmt(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
if (retVal == 0) { if (retVal == 0) {
switch (fmt) { switch (fmt) {
/* Paletted */
case D3DFMT_P8: retVal = GL_COLOR_INDEX; break; case D3DFMT_P8: retVal = GL_COLOR_INDEX; break;
case D3DFMT_A8P8: retVal = GL_COLOR_INDEX; break; case D3DFMT_A8P8: retVal = GL_COLOR_INDEX; break;
/* Luminance */
case D3DFMT_L8: retVal = GL_LUMINANCE; break;
case D3DFMT_A8L8: retVal = GL_LUMINANCE_ALPHA; break;
case D3DFMT_A4L4: retVal = GL_LUMINANCE_ALPHA; break;
/* Bump */
case D3DFMT_V8U8: retVal = GL_COLOR_INDEX; break; case D3DFMT_V8U8: retVal = GL_COLOR_INDEX; break;
case D3DFMT_V16U16: retVal = GL_COLOR_INDEX; break;
case D3DFMT_L6V5U5: retVal = GL_COLOR_INDEX; break;
case D3DFMT_X8L8V8U8: retVal = GL_COLOR_INDEX; break;
/* color buffer */
case D3DFMT_R3G3B2: retVal = GL_BGR; break;
case D3DFMT_R5G6B5: retVal = GL_RGB; break;
case D3DFMT_R8G8B8: retVal = GL_RGB; break;
case D3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
case D3DFMT_X1R5G5B5: retVal = GL_BGRA; break;
case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break; case D3DFMT_A4R4G4B4: retVal = GL_BGRA; break;
case D3DFMT_X4R4G4B4: retVal = GL_BGRA; break;
case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break; case D3DFMT_A8R8G8B8: retVal = GL_BGRA; break;
case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break; case D3DFMT_X8R8G8B8: retVal = GL_BGRA; break;
case D3DFMT_R8G8B8: retVal = GL_BGR; break; /* to see */
case D3DFMT_R5G6B5: retVal = GL_RGB; break; case D3DFMT_A8: retVal = GL_ALPHA; break;
case D3DFMT_A1R5G5B5: retVal = GL_BGRA; break;
default: default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = GL_BGR; retVal = GL_BGR;
@ -502,16 +541,30 @@ GLenum D3DFmt2GLType(IDirect3DDevice8Impl* This, D3DFORMAT fmt) {
if (retVal == 0) { if (retVal == 0) {
switch (fmt) { switch (fmt) {
/* Paletted */
case D3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break; case D3DFMT_P8: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break; case D3DFMT_A8P8: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break; /* Luminance */
case D3DFMT_L8: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break; case D3DFMT_A8L8: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_BYTE; break; case D3DFMT_A4L4: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_BYTE; break; /* Bump */
case D3DFMT_V8U8: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_V16U16: retVal = GL_UNSIGNED_SHORT; break;
case D3DFMT_L6V5U5: retVal = GL_UNSIGNED_SHORT_5_5_5_1; break;
case D3DFMT_X8L8V8U8: retVal = GL_UNSIGNED_BYTE; break;
/* Color buffer */
case D3DFMT_R3G3B2: retVal = GL_UNSIGNED_BYTE_2_3_3_REV; break;
case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break; case D3DFMT_R5G6B5: retVal = GL_UNSIGNED_SHORT_5_6_5; break;
case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break; case D3DFMT_R8G8B8: retVal = GL_UNSIGNED_BYTE; break;
case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break; case D3DFMT_A1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
case D3DFMT_X1R5G5B5: retVal = GL_UNSIGNED_SHORT_1_5_5_5_REV; break;
case D3DFMT_A4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
case D3DFMT_X4R4G4B4: retVal = GL_UNSIGNED_SHORT_4_4_4_4_REV; break;
case D3DFMT_A8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
case D3DFMT_X8R8G8B8: retVal = GL_UNSIGNED_INT_8_8_8_8_REV; break;
/* to see */
case D3DFMT_A8: retVal = GL_ALPHA; break;
default: default:
FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt)); FIXME("Unhandled fmt(%u,%s)\n", fmt, debug_d3dformat(fmt));
retVal = GL_UNSIGNED_BYTE; retVal = GL_UNSIGNED_BYTE;