ddraw: Set _TSS_ALPHA_OP to _SELECT_ARG1 in case of NULL texture in fixup_texture_alpha_op().
Signed-off-by: Paul Gofman <gofmanp@gmail.com> Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
3b29fc0a87
commit
cc2e05bdc7
|
@ -2667,7 +2667,7 @@ static void fixup_texture_alpha_op(struct d3d_device *device)
|
||||||
/* This fixup is required by the way D3DTBLEND_MODULATE maps to texture stage states.
|
/* This fixup is required by the way D3DTBLEND_MODULATE maps to texture stage states.
|
||||||
See d3d_device3_SetRenderState() for details. */
|
See d3d_device3_SetRenderState() for details. */
|
||||||
struct wined3d_texture *tex;
|
struct wined3d_texture *tex;
|
||||||
BOOL tex_alpha = FALSE;
|
BOOL tex_alpha = TRUE;
|
||||||
DDPIXELFORMAT ddfmt;
|
DDPIXELFORMAT ddfmt;
|
||||||
|
|
||||||
if (!(device->legacyTextureBlending && device->texture_map_blend == D3DTBLEND_MODULATE))
|
if (!(device->legacyTextureBlending && device->texture_map_blend == D3DTBLEND_MODULATE))
|
||||||
|
@ -2680,8 +2680,8 @@ static void fixup_texture_alpha_op(struct d3d_device *device)
|
||||||
wined3d_resource_get_desc(wined3d_texture_get_resource(tex), &desc);
|
wined3d_resource_get_desc(wined3d_texture_get_resource(tex), &desc);
|
||||||
ddfmt.dwSize = sizeof(ddfmt);
|
ddfmt.dwSize = sizeof(ddfmt);
|
||||||
ddrawformat_from_wined3dformat(&ddfmt, desc.format);
|
ddrawformat_from_wined3dformat(&ddfmt, desc.format);
|
||||||
if (ddfmt.u5.dwRGBAlphaBitMask)
|
if (!ddfmt.u5.dwRGBAlphaBitMask)
|
||||||
tex_alpha = TRUE;
|
tex_alpha = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Args 1 and 2 are already set to WINED3DTA_TEXTURE/WINED3DTA_CURRENT in case of D3DTBLEND_MODULATE */
|
/* Args 1 and 2 are already set to WINED3DTA_TEXTURE/WINED3DTA_CURRENT in case of D3DTBLEND_MODULATE */
|
||||||
|
|
|
@ -9506,6 +9506,7 @@ static void test_texturemapblend(void)
|
||||||
DDCOLORKEY ckey;
|
DDCOLORKEY ckey;
|
||||||
D3DCOLOR color;
|
D3DCOLOR color;
|
||||||
ULONG refcount;
|
ULONG refcount;
|
||||||
|
DWORD value;
|
||||||
HWND window;
|
HWND window;
|
||||||
DDBLTFX fx;
|
DDBLTFX fx;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
@ -9548,20 +9549,24 @@ static void test_texturemapblend(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = IDirect3DDevice3_GetDirect3D(device, &d3d);
|
hr = IDirect3DDevice3_GetDirect3D(device, &d3d);
|
||||||
ok(SUCCEEDED(hr), "Failed to get d3d interface, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw);
|
hr = IDirect3D3_QueryInterface(d3d, &IID_IDirectDraw4, (void **)&ddraw);
|
||||||
ok(SUCCEEDED(hr), "Failed to get ddraw interface, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_GetRenderTarget(device, &rt);
|
hr = IDirect3DDevice3_GetRenderTarget(device, &rt);
|
||||||
ok(SUCCEEDED(hr), "Failed to get render target, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
viewport = create_viewport(device, 0, 0, 640, 480);
|
viewport = create_viewport(device, 0, 0, 640, 480);
|
||||||
hr = IDirect3DDevice3_SetCurrentViewport(device, viewport);
|
hr = IDirect3DDevice3_SetCurrentViewport(device, viewport);
|
||||||
ok(SUCCEEDED(hr), "Failed to set current viewport, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IDirect3DDevice3_GetRenderState(device, D3DRENDERSTATE_TEXTUREMAPBLEND, &texturemapblend);
|
hr = IDirect3DDevice3_GetRenderState(device, D3DRENDERSTATE_TEXTUREMAPBLEND, &texturemapblend);
|
||||||
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
ok(texturemapblend == D3DTBLEND_MODULATE, "Got unexpected texture map blend %#x.\n", texturemapblend);
|
ok(texturemapblend == D3DTBLEND_MODULATE, "Got unexpected texture map blend %#x.\n", texturemapblend);
|
||||||
|
|
||||||
|
hr = IDirect3DDevice3_GetTextureStageState(device, 0, D3DTSS_ALPHAOP, &value);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
ok(value == D3DTOP_SELECTARG1, "Got unexpected D3DTSS_ALPHAOP value %#x.\n", value);
|
||||||
|
|
||||||
/* Test alpha with DDPF_ALPHAPIXELS texture - should be taken from texture
|
/* Test alpha with DDPF_ALPHAPIXELS texture - should be taken from texture
|
||||||
* alpha channel.
|
* alpha channel.
|
||||||
*
|
*
|
||||||
|
@ -9582,15 +9587,29 @@ static void test_texturemapblend(void)
|
||||||
U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff;
|
U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff;
|
||||||
U5(U4(surface_desc).ddpfPixelFormat).dwRGBAlphaBitMask = 0xff000000;
|
U5(U4(surface_desc).ddpfPixelFormat).dwRGBAlphaBitMask = 0xff000000;
|
||||||
hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
|
hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
|
||||||
ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IDirectDrawSurface4_QueryInterface(surface, &IID_IDirect3DTexture2, (void **)&texture);
|
hr = IDirectDrawSurface4_QueryInterface(surface, &IID_IDirect3DTexture2, (void **)&texture);
|
||||||
ok(SUCCEEDED(hr), "Failed to get texture interface, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_SetTexture(device, 0, texture);
|
hr = IDirect3DDevice3_SetTexture(device, 0, texture);
|
||||||
ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IDirect3DDevice3_GetTextureStageState(device, 0, D3DTSS_ALPHAOP, &value);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
ok(value == D3DTOP_SELECTARG1, "Got unexpected D3DTSS_ALPHAOP value %#x.\n", value);
|
||||||
|
|
||||||
|
hr = IDirect3DDevice3_SetTexture(device, 0, NULL);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IDirect3DDevice3_GetTextureStageState(device, 0, D3DTSS_ALPHAOP, &value);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
ok(value == D3DTOP_SELECTARG1, "Got unexpected D3DTSS_ALPHAOP value %#x.\n", value);
|
||||||
|
|
||||||
|
hr = IDirect3DDevice3_SetTexture(device, 0, texture);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IDirect3DViewport3_Clear(viewport, 1, &clear_rect, D3DCLEAR_TARGET);
|
hr = IDirect3DViewport3_Clear(viewport, 1, &clear_rect, D3DCLEAR_TARGET);
|
||||||
ok(SUCCEEDED(hr), "Failed to clear render target, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
memset(&fx, 0, sizeof(fx));
|
memset(&fx, 0, sizeof(fx));
|
||||||
fx.dwSize = sizeof(fx);
|
fx.dwSize = sizeof(fx);
|
||||||
|
@ -9615,8 +9634,12 @@ static void test_texturemapblend(void)
|
||||||
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
|
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
|
||||||
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
/* Disable the call to test that the device has this state by default. */
|
||||||
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_TEXTUREMAPBLEND, D3DTBLEND_MODULATE);
|
hr = IDirect3DDevice3_SetRenderState(device, D3DRENDERSTATE_TEXTUREMAPBLEND, D3DTBLEND_MODULATE);
|
||||||
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Texture stage state does not change so legacy texture blending stays enabled. */
|
/* Texture stage state does not change so legacy texture blending stays enabled. */
|
||||||
hr = IDirect3DDevice3_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
hr = IDirect3DDevice3_SetTextureStageState(device, 0, D3DTSS_COLOROP, D3DTOP_MODULATE);
|
||||||
|
@ -9727,7 +9750,7 @@ static void test_texturemapblend(void)
|
||||||
ok(compare_color(color, 0x000000ff, 2), "Got unexpected color 0x%08x.\n", color);
|
ok(compare_color(color, 0x000000ff, 2), "Got unexpected color 0x%08x.\n", color);
|
||||||
|
|
||||||
hr = IDirect3DDevice3_SetTexture(device, 0, NULL);
|
hr = IDirect3DDevice3_SetTexture(device, 0, NULL);
|
||||||
ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
IDirect3DTexture2_Release(texture);
|
IDirect3DTexture2_Release(texture);
|
||||||
refcount = IDirectDrawSurface4_Release(surface);
|
refcount = IDirectDrawSurface4_Release(surface);
|
||||||
ok(!refcount, "Surface not properly released, refcount %u.\n", refcount);
|
ok(!refcount, "Surface not properly released, refcount %u.\n", refcount);
|
||||||
|
@ -9748,33 +9771,37 @@ static void test_texturemapblend(void)
|
||||||
U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff;
|
U4(U4(surface_desc).ddpfPixelFormat).dwBBitMask = 0x000000ff;
|
||||||
|
|
||||||
hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
|
hr = IDirectDraw4_CreateSurface(ddraw, &surface_desc, &surface, NULL);
|
||||||
ok(SUCCEEDED(hr), "Failed to create surface, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IDirectDrawSurface4_QueryInterface(surface, &IID_IDirect3DTexture2, (void **)&texture);
|
hr = IDirectDrawSurface4_QueryInterface(surface, &IID_IDirect3DTexture2, (void **)&texture);
|
||||||
ok(SUCCEEDED(hr), "Failed to get texture interface, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_SetTexture(device, 0, texture);
|
hr = IDirect3DDevice3_SetTexture(device, 0, texture);
|
||||||
ok(SUCCEEDED(hr), "Failed to set texture, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
|
hr = IDirect3DDevice3_GetTextureStageState(device, 0, D3DTSS_ALPHAOP, &value);
|
||||||
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
ok(value == D3DTOP_SELECTARG2, "Got unexpected D3DTSS_ALPHAOP value %#x.\n", value);
|
||||||
|
|
||||||
hr = IDirect3DViewport3_Clear(viewport, 1, &clear_rect, D3DCLEAR_TARGET);
|
hr = IDirect3DViewport3_Clear(viewport, 1, &clear_rect, D3DCLEAR_TARGET);
|
||||||
ok(SUCCEEDED(hr), "Failed to clear render target, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
U5(fx).dwFillColor = 0xff0000ff;
|
U5(fx).dwFillColor = 0xff0000ff;
|
||||||
hr = IDirectDrawSurface4_Blt(surface, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
|
hr = IDirectDrawSurface4_Blt(surface, NULL, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
|
||||||
ok(SUCCEEDED(hr), "Failed to clear texture, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
U5(fx).dwFillColor = 0x800000ff;
|
U5(fx).dwFillColor = 0x800000ff;
|
||||||
hr = IDirectDrawSurface4_Blt(surface, &rect, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
|
hr = IDirectDrawSurface4_Blt(surface, &rect, NULL, NULL, DDBLT_COLORFILL | DDBLT_WAIT, &fx);
|
||||||
ok(SUCCEEDED(hr), "Failed to clear texture, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
hr = IDirect3DDevice3_BeginScene(device);
|
hr = IDirect3DDevice3_BeginScene(device);
|
||||||
ok(SUCCEEDED(hr), "Failed to begin scene, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_DrawPrimitive(device, D3DPT_TRIANGLESTRIP,
|
hr = IDirect3DDevice3_DrawPrimitive(device, D3DPT_TRIANGLESTRIP,
|
||||||
D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, &test1_quads[0], 4, 0);
|
D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, &test1_quads[0], 4, 0);
|
||||||
ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_DrawPrimitive(device, D3DPT_TRIANGLESTRIP,
|
hr = IDirect3DDevice3_DrawPrimitive(device, D3DPT_TRIANGLESTRIP,
|
||||||
D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, &test1_quads[4], 4, 0);
|
D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1, &test1_quads[4], 4, 0);
|
||||||
ok(SUCCEEDED(hr), "Failed to draw, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
hr = IDirect3DDevice3_EndScene(device);
|
hr = IDirect3DDevice3_EndScene(device);
|
||||||
ok(SUCCEEDED(hr), "Failed to end scene, hr %#x.\n", hr);
|
ok(hr == D3D_OK, "Got unexpected hr %#x.\n", hr);
|
||||||
|
|
||||||
color = get_surface_color(rt, 5, 5);
|
color = get_surface_color(rt, 5, 5);
|
||||||
ok(compare_color(color, 0x000000ff, 2), "Got unexpected color 0x%08x.\n", color);
|
ok(compare_color(color, 0x000000ff, 2), "Got unexpected color 0x%08x.\n", color);
|
||||||
|
|
Loading…
Reference in New Issue