wined3d: Test clearing regarding the scissor test and colorwrite.
This commit is contained in:
parent
429d0d3eb3
commit
f4d2449244
|
@ -277,6 +277,8 @@ static void clear_test(IDirect3DDevice9 *device)
|
|||
D3DRECT rect_negneg;
|
||||
DWORD color;
|
||||
D3DVIEWPORT9 old_vp, vp;
|
||||
RECT scissor;
|
||||
DWORD oldColorWrite;
|
||||
|
||||
hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed with %s\n", DXGetErrorString9(hr));
|
||||
|
@ -379,6 +381,89 @@ static void clear_test(IDirect3DDevice9 *device)
|
|||
ok(color == 0x00ffffff, "(478,362) has color %08x\n", color);
|
||||
color = getPixelColor(device, 482, 362);
|
||||
ok(color == 0x00ffffff, "(482,362) has color %08x\n", color);
|
||||
|
||||
hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
scissor.left = 160;
|
||||
scissor.right = 480;
|
||||
scissor.top = 120;
|
||||
scissor.bottom = 360;
|
||||
hr = IDirect3DDevice9_SetScissorRect(device, &scissor);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice_SetScissorRect failed with %s\n", DXGetErrorString9(hr));
|
||||
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_SCISSORTESTENABLE, TRUE);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice_SetScissorRect failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xff00ff00, 0.0, 0);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed with %s\n", DXGetErrorString9(hr));
|
||||
hr = IDirect3DDevice9_Clear(device, 1, &rect[1], D3DCLEAR_TARGET, 0xffff0000, 0.0, 0);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_SCISSORTESTENABLE, FALSE);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice_SetScissorRect failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
|
||||
color = getPixelColor(device, 158, 118);
|
||||
ok(color == 0x00ffffff, "Pixel 158/118 has color %08x\n", color);
|
||||
color = getPixelColor(device, 162, 118);
|
||||
ok(color == 0x00ffffff, "Pixel 162/118 has color %08x\n", color);
|
||||
color = getPixelColor(device, 158, 122);
|
||||
ok(color == 0x00ffffff, "Pixel 158/122 has color %08x\n", color);
|
||||
color = getPixelColor(device, 162, 122);
|
||||
ok(color == 0x00ff0000, "Pixel 162/122 has color %08x\n", color);
|
||||
|
||||
color = getPixelColor(device, 158, 358);
|
||||
ok(color == 0x00ffffff, "Pixel 158/358 has color %08x\n", color);
|
||||
color = getPixelColor(device, 162, 358);
|
||||
ok(color == 0x0000ff00, "Pixel 162/358 has color %08x\n", color);
|
||||
color = getPixelColor(device, 158, 358);
|
||||
ok(color == 0x00ffffff, "Pixel 158/358 has color %08x\n", color);
|
||||
color = getPixelColor(device, 162, 362);
|
||||
ok(color == 0x00ffffff, "Pixel 162/362 has color %08x\n", color);
|
||||
|
||||
color = getPixelColor(device, 478, 118);
|
||||
ok(color == 0x00ffffff, "Pixel 158/118 has color %08x\n", color);
|
||||
color = getPixelColor(device, 478, 122);
|
||||
ok(color == 0x0000ff00, "Pixel 162/118 has color %08x\n", color);
|
||||
color = getPixelColor(device, 482, 122);
|
||||
ok(color == 0x00ffffff, "Pixel 158/122 has color %08x\n", color);
|
||||
color = getPixelColor(device, 482, 358);
|
||||
ok(color == 0x00ffffff, "Pixel 162/122 has color %08x\n", color);
|
||||
|
||||
color = getPixelColor(device, 478, 358);
|
||||
ok(color == 0x0000ff00, "Pixel 478/358 has color %08x\n", color);
|
||||
color = getPixelColor(device, 478, 362);
|
||||
ok(color == 0x00ffffff, "Pixel 478/118 has color %08x\n", color);
|
||||
color = getPixelColor(device, 482, 358);
|
||||
ok(color == 0x00ffffff, "Pixel 482/122 has color %08x\n", color);
|
||||
color = getPixelColor(device, 482, 362);
|
||||
ok(color == 0x00ffffff, "Pixel 482/122 has color %08x\n", color);
|
||||
|
||||
color = getPixelColor(device, 318, 238);
|
||||
ok(color == 0x00ff0000, "Pixel 318/238 has color %08x\n", color);
|
||||
color = getPixelColor(device, 318, 242);
|
||||
ok(color == 0x0000ff00, "Pixel 318/242 has color %08x\n", color);
|
||||
color = getPixelColor(device, 322, 238);
|
||||
ok(color == 0x0000ff00, "Pixel 322/238 has color %08x\n", color);
|
||||
color = getPixelColor(device, 322, 242);
|
||||
ok(color == 0x0000ff00, "Pixel 322/242 has color %08x\n", color);
|
||||
|
||||
hr = IDirect3DDevice9_GetRenderState(device, D3DRS_COLORWRITEENABLE, &oldColorWrite);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_GetRenderState failed with %s\n", DXGetErrorString9(hr));
|
||||
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
hr = IDirect3DDevice9_Clear(device, 0, NULL, D3DCLEAR_TARGET, 0xffffffff, 0.0, 0);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_Clear failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
hr = IDirect3DDevice9_SetRenderState(device, D3DRS_COLORWRITEENABLE, oldColorWrite);
|
||||
ok(hr == D3D_OK, "IDirect3DDevice9_SetRenderState failed with %s\n", DXGetErrorString9(hr));
|
||||
|
||||
IDirect3DDevice9_Present(device, NULL, NULL, NULL, NULL);
|
||||
|
||||
/* Colorwriteenable does not affect the clear */
|
||||
color = getPixelColor(device, 320, 240);
|
||||
ok(color == 0x00ffffff, "Color write protected clear returned color %08x\n", color);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
|
|
|
@ -4816,6 +4816,13 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Coun
|
|||
IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
|
||||
break;
|
||||
}
|
||||
if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE] && (
|
||||
This->stateBlock->scissorRect.left > 0 || This->stateBlock->scissorRect.top > 0 ||
|
||||
This->stateBlock->scissorRect.right < target->currentDesc.Width ||
|
||||
This->stateBlock->scissorRect.bottom < target->currentDesc.Height)) {
|
||||
IWineD3DSurface_LoadLocation((IWineD3DSurface *) target, SFLAG_INDRAWABLE, NULL);
|
||||
break;
|
||||
}
|
||||
if(Count > 0 && pRects && (
|
||||
pRects[0].x1 > 0 || pRects[0].y1 > 0 ||
|
||||
pRects[0].x2 < target->currentDesc.Width ||
|
||||
|
@ -4868,35 +4875,32 @@ static HRESULT WINAPI IWineD3DDeviceImpl_Clear(IWineD3DDevice *iface, DWORD Coun
|
|||
glMask = glMask | GL_COLOR_BUFFER_BIT;
|
||||
}
|
||||
|
||||
vp_rect.left = vp->X;
|
||||
vp_rect.top = vp->Y;
|
||||
vp_rect.right = vp->X + vp->Width;
|
||||
vp_rect.bottom = vp->Y + vp->Height;
|
||||
if (!(Count > 0 && pRects)) {
|
||||
if (This->render_offscreen) {
|
||||
glScissor(This->stateBlock->viewport.X,
|
||||
This->stateBlock->viewport.Y,
|
||||
This->stateBlock->viewport.Width,
|
||||
This->stateBlock->viewport.Height);
|
||||
if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
|
||||
IntersectRect(&vp_rect, &vp_rect, &This->stateBlock->scissorRect);
|
||||
}
|
||||
if(This->render_offscreen) {
|
||||
glScissor(vp_rect.left, vp_rect.top,
|
||||
vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
|
||||
} else {
|
||||
glScissor(This->stateBlock->viewport.X,
|
||||
(drawable_height -
|
||||
(This->stateBlock->viewport.Y + This->stateBlock->viewport.Height)),
|
||||
This->stateBlock->viewport.Width,
|
||||
This->stateBlock->viewport.Height);
|
||||
glScissor(vp_rect.left, drawable_height - vp_rect.bottom,
|
||||
vp_rect.right - vp_rect.left, vp_rect.bottom - vp_rect.top);
|
||||
}
|
||||
checkGLcall("glScissor");
|
||||
glClear(glMask);
|
||||
checkGLcall("glClear");
|
||||
} else {
|
||||
/* The viewport cap still applies, we have to intersect each clear rect with the viewport
|
||||
* range because glClear ignores the viewport(and the viewport isn't even applied in this state)
|
||||
*/
|
||||
vp_rect.left = vp->X;
|
||||
vp_rect.top = vp->Y;
|
||||
vp_rect.right = vp->X + vp->Width;
|
||||
vp_rect.bottom = vp->Y + vp->Height;
|
||||
|
||||
/* Now process each rect in turn */
|
||||
for (i = 0; i < Count; i++) {
|
||||
/* Note gl uses lower left, width/height */
|
||||
IntersectRect((RECT *) &curRect, &vp_rect, (RECT *) &pRects[i]);
|
||||
if(This->stateBlock->renderState[WINED3DRS_SCISSORTESTENABLE]) {
|
||||
IntersectRect((RECT *) &curRect, (RECT *) &curRect, &This->stateBlock->scissorRect);
|
||||
}
|
||||
TRACE("(%p) Rect=(%d,%d)->(%d,%d) glRect=(%d,%d), len=%d, hei=%d\n", This,
|
||||
pRects[i].x1, pRects[i].y1, pRects[i].x2, pRects[i].y2,
|
||||
curRect.x1, (target->currentDesc.Height - curRect.y2),
|
||||
|
|
Loading…
Reference in New Issue