wined3d: Report incorrect filtering settings in ValidateDevice.
This commit is contained in:
parent
422eebd2c3
commit
8b1727ae62
|
@ -236,6 +236,93 @@ static void test_mipmap_gen(IDirect3DDevice9 *device)
|
||||||
IDirect3DTexture9_Release(texture);
|
IDirect3DTexture9_Release(texture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_filter(IDirect3DDevice9 *device) {
|
||||||
|
HRESULT hr;
|
||||||
|
IDirect3DTexture9 *texture;
|
||||||
|
IDirect3D9 *d3d9;
|
||||||
|
DWORD passes = 0;
|
||||||
|
unsigned int i;
|
||||||
|
struct filter_tests {
|
||||||
|
DWORD magfilter, minfilter, mipfilter;
|
||||||
|
BOOL has_texture;
|
||||||
|
HRESULT result;
|
||||||
|
} tests[] = {
|
||||||
|
{ D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_NONE, D3DTEXF_POINT, D3DTEXF_NONE, FALSE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_NONE, FALSE, D3D_OK },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT, FALSE, D3D_OK },
|
||||||
|
|
||||||
|
{ D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_NONE, TRUE, D3D_OK },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_POINT, TRUE, D3D_OK },
|
||||||
|
|
||||||
|
{ D3DTEXF_NONE, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_LINEAR, D3DTEXF_NONE, D3DTEXF_NONE, TRUE, D3DERR_UNSUPPORTEDTEXTUREFILTER },
|
||||||
|
{ D3DTEXF_LINEAR, D3DTEXF_POINT, D3DTEXF_NONE, TRUE, E_FAIL },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_LINEAR, D3DTEXF_NONE, TRUE, E_FAIL },
|
||||||
|
{ D3DTEXF_POINT, D3DTEXF_POINT, D3DTEXF_LINEAR, TRUE, E_FAIL },
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
hr = IDirect3DDevice9_GetDirect3D(device, &d3d9);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_GetDirect3D(levels = 1) returned %08x\n", hr);
|
||||||
|
hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, 0,
|
||||||
|
D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F);
|
||||||
|
if(FAILED(hr)) {
|
||||||
|
skip("D3DFMT_A32B32G32R32F not supported\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
hr = IDirect3D9_CheckDeviceFormat(d3d9, 0, D3DDEVTYPE_HAL, D3DFMT_X8R8G8B8, D3DUSAGE_QUERY_FILTER,
|
||||||
|
D3DRTYPE_TEXTURE, D3DFMT_A32B32G32R32F);
|
||||||
|
if(SUCCEEDED(hr)) {
|
||||||
|
skip("D3DFMT_A32B32G32R32F supports filtering\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDirect3DDevice9_CreateTexture(device, 128, 128, 0, 0, D3DFMT_A32B32G32R32F,
|
||||||
|
D3DPOOL_MANAGED, &texture, 0);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_CreateTexture returned %08x\n", hr);
|
||||||
|
|
||||||
|
/* Needed for ValidateDevice */
|
||||||
|
hr = IDirect3DDevice9_SetFVF(device, D3DFVF_XYZ | D3DFVF_TEX1);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_SetFVF returned %08x\n", hr);
|
||||||
|
|
||||||
|
for(i = 0; i < (sizeof(tests) / sizeof(tests[0])); i++) {
|
||||||
|
if(tests[i].has_texture) {
|
||||||
|
hr = IDirect3DDevice9_SetTexture(device, 0, (IDirect3DBaseTexture9 *) texture);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %08x\n", hr);
|
||||||
|
} else {
|
||||||
|
hr = IDirect3DDevice9_SetTexture(device, 0, NULL);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_SetTexture returned %08x\n", hr);
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MAGFILTER, tests[i].magfilter);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr);
|
||||||
|
hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MINFILTER, tests[i].minfilter);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr);
|
||||||
|
hr = IDirect3DDevice9_SetSamplerState(device, 0, D3DSAMP_MIPFILTER, tests[i].mipfilter);
|
||||||
|
ok(hr == D3D_OK, "IDirect3DDevice9_SetSamplerState returned %08x\n", hr);
|
||||||
|
|
||||||
|
passes = 0xdeadbeef;
|
||||||
|
hr = IDirect3DDevice9_ValidateDevice(device, &passes);
|
||||||
|
ok(hr == tests[i].result, "ValidateDevice failed: Texture %s, min %u, mag %u, mip %u. Got %08x, expected %08x\n",
|
||||||
|
tests[i].has_texture ? "TRUE" : "FALSE", tests[i].magfilter, tests[i].minfilter,
|
||||||
|
tests[i].mipfilter, hr, tests[i].result);
|
||||||
|
if(SUCCEEDED(hr)) {
|
||||||
|
ok(passes != 0, "ValidateDevice succeeded, passes is %u\n", passes);
|
||||||
|
} else {
|
||||||
|
ok(passes == 0xdeadbeef, "ValidateDevice failed, passes is %u\n", passes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
hr = IDirect3DDevice9_SetTexture(device, 0, NULL);
|
||||||
|
|
||||||
|
out:
|
||||||
|
IDirect3D9_Release(d3d9);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(texture)
|
START_TEST(texture)
|
||||||
{
|
{
|
||||||
D3DCAPS9 caps;
|
D3DCAPS9 caps;
|
||||||
|
@ -257,4 +344,5 @@ START_TEST(texture)
|
||||||
test_texture_stage_states(device_ptr, caps.MaxTextureBlendStages);
|
test_texture_stage_states(device_ptr, caps.MaxTextureBlendStages);
|
||||||
test_cube_textures(device_ptr, caps.TextureCaps);
|
test_cube_textures(device_ptr, caps.TextureCaps);
|
||||||
test_mipmap_gen(device_ptr);
|
test_mipmap_gen(device_ptr);
|
||||||
|
test_filter(device_ptr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5576,10 +5576,46 @@ static HRESULT WINAPI IWineD3DDeviceImpl_GetFrontBufferData(IWineD3DDevice *if
|
||||||
|
|
||||||
static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface, DWORD* pNumPasses) {
|
static HRESULT WINAPI IWineD3DDeviceImpl_ValidateDevice(IWineD3DDevice *iface, DWORD* pNumPasses) {
|
||||||
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
|
IWineD3DDeviceImpl *This = (IWineD3DDeviceImpl *)iface;
|
||||||
|
IWineD3DBaseTextureImpl *texture;
|
||||||
|
const GlPixelFormatDesc *gl_info;
|
||||||
|
DWORD i;
|
||||||
|
|
||||||
|
TRACE("(%p) : %p \n", This, pNumPasses);
|
||||||
|
|
||||||
|
for(i = 0; i < MAX_COMBINED_SAMPLERS; i++) {
|
||||||
|
if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] == WINED3DTEXF_NONE) {
|
||||||
|
WARN("Sampler state %u has minfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
|
||||||
|
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
|
||||||
|
}
|
||||||
|
if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] == WINED3DTEXF_NONE) {
|
||||||
|
WARN("Sampler state %u has magfilter D3DTEXF_NONE, returning D3DERR_UNSUPPORTEDTEXTUREFILTER\n", i);
|
||||||
|
return WINED3DERR_UNSUPPORTEDTEXTUREFILTER;
|
||||||
|
}
|
||||||
|
|
||||||
|
texture = (IWineD3DBaseTextureImpl *) This->stateBlock->textures[i];
|
||||||
|
if(!texture) continue;
|
||||||
|
getFormatDescEntry(texture->resource.format, &GLINFO_LOCATION, &gl_info);
|
||||||
|
if(gl_info->Flags & WINED3DFMT_FLAG_FILTERING) continue;
|
||||||
|
|
||||||
|
if(This->stateBlock->samplerState[i][WINED3DSAMP_MAGFILTER] != WINED3DTEXF_POINT) {
|
||||||
|
WARN("Non-filterable texture and mag filter enabled on samper %u, returning E_FAIL\n", i);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
if(This->stateBlock->samplerState[i][WINED3DSAMP_MINFILTER] != WINED3DTEXF_POINT) {
|
||||||
|
WARN("Non-filterable texture and min filter enabled on samper %u, returning E_FAIL\n", i);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
if(This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_NONE &&
|
||||||
|
This->stateBlock->samplerState[i][WINED3DSAMP_MIPFILTER] != WINED3DTEXF_POINT /* sic! */) {
|
||||||
|
WARN("Non-filterable texture and mip filter enabled on samper %u, returning E_FAIL\n", i);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* return a sensible default */
|
/* return a sensible default */
|
||||||
*pNumPasses = 1;
|
*pNumPasses = 1;
|
||||||
/* TODO: If the window is minimized then validate device should return something other than WINED3D_OK */
|
|
||||||
FIXME("(%p) : stub\n", This);
|
TRACE("returning D3D_OK\n");
|
||||||
return WINED3D_OK;
|
return WINED3D_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue