From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com Signed-off-by: Matteo Bruni mbruni@codeweavers.com --- v2: Slightly improved a couple of tests.
dlls/d3dx9_36/shader.c | 28 ++++++++++++++++++++++++---- dlls/d3dx9_36/tests/texture.c | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 56 insertions(+), 6 deletions(-)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c index fe0f99180ac..d5b58222ca2 100644 --- a/dlls/d3dx9_36/shader.c +++ b/dlls/d3dx9_36/shader.c @@ -2349,6 +2349,8 @@ struct d3dx9_texture_shader { ID3DXTextureShader ID3DXTextureShader_iface; LONG ref; + + ID3DXBuffer *byte_code; };
static inline struct d3dx9_texture_shader *impl_from_ID3DXTextureShader(ID3DXTextureShader *iface) @@ -2392,6 +2394,8 @@ static ULONG WINAPI d3dx9_texture_shader_Release(ID3DXTextureShader *iface)
if (!refcount) { + if (texture_shader->byte_code) + ID3DXBuffer_Release(texture_shader->byte_code); HeapFree(GetProcessHeap(), 0, texture_shader); }
@@ -2400,9 +2404,14 @@ static ULONG WINAPI d3dx9_texture_shader_Release(ID3DXTextureShader *iface)
static HRESULT WINAPI d3dx9_texture_shader_GetFunction(ID3DXTextureShader *iface, struct ID3DXBuffer **function) { - FIXME("iface %p, function %p stub.\n", iface, function); + struct d3dx9_texture_shader *texture_shader = impl_from_ID3DXTextureShader(iface);
- return E_NOTIMPL; + TRACE("iface %p, function %p.\n", iface, function); + + *function = texture_shader->byte_code; + ID3DXBuffer_AddRef(*function); + + return S_OK; }
static HRESULT WINAPI d3dx9_texture_shader_GetConstantBuffer(ID3DXTextureShader *iface, struct ID3DXBuffer **constant_buffer) @@ -2594,19 +2603,30 @@ static const struct ID3DXTextureShaderVtbl d3dx9_texture_shader_vtbl = HRESULT WINAPI D3DXCreateTextureShader(const DWORD *function, ID3DXTextureShader **texture_shader) { struct d3dx9_texture_shader *object; + unsigned int size; + HRESULT hr;
TRACE("function %p, texture_shader %p.\n", function, texture_shader);
if (!function || !texture_shader) return D3DERR_INVALIDCALL;
- object = HeapAlloc(GetProcessHeap(), 0, sizeof(*object)); - if (!object) + if (!(size = D3DXGetShaderSize(function))) + return D3DXERR_INVALIDDATA; + + if (!(object = heap_alloc_zero(sizeof(*object)))) return E_OUTOFMEMORY;
object->ID3DXTextureShader_iface.lpVtbl = &d3dx9_texture_shader_vtbl; object->ref = 1;
+ if (FAILED(hr = D3DXCreateBuffer(size, &object->byte_code))) + { + IUnknown_Release(&object->ID3DXTextureShader_iface); + return hr; + } + memcpy(ID3DXBuffer_GetBufferPointer(object->byte_code), function, size); + *texture_shader = &object->ID3DXTextureShader_iface;
return D3D_OK; diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c index bec7ba48279..26e5aa3dbb6 100644 --- a/dlls/d3dx9_36/tests/texture.c +++ b/dlls/d3dx9_36/tests/texture.c @@ -2353,17 +2353,20 @@ float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR }; IDirect3DVolumeTexture9 *volume_texture; IDirect3DCubeTexture9 *cube_texture; + D3DXCONSTANTTABLE_DESC ctab_desc; + ID3DXBuffer *buffer, *buffer2; D3DPRESENT_PARAMETERS d3dpp; IDirect3DTexture9 *texture; IDirect3DDevice9 *device; ID3DXTextureShader *tx; unsigned int x, y, z; - ID3DXBuffer *buffer; unsigned int *data; D3DLOCKED_RECT lr; D3DLOCKED_BOX lb; IDirect3D9 *d3d; D3DCAPS9 caps; + D3DXHANDLE h; + DWORD size; HRESULT hr; HWND wnd;
@@ -2386,15 +2389,42 @@ float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR ok(SUCCEEDED(hr), "Got unexpected hr %#x.\n", hr);
hr = tx->lpVtbl->GetFunction(tx, &buffer); - todo_wine ok(SUCCEEDED(hr), "Failed to get texture shader bytecode.\n"); + ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr); + + hr = tx->lpVtbl->GetFunction(tx, &buffer2); + ok(hr == D3D_OK, "Unexpected hr %#x.\n", hr); + ok(buffer2 == buffer, "Unexpected buffer object.\n"); + ID3DXBuffer_Release(buffer2); + + size = ID3DXBuffer_GetBufferSize(buffer); + ok(size == 224, "Unexpected buffer size %u.\n", size); + + ID3DXBuffer_Release(buffer); + + /* Constant buffer */ + hr = tx->lpVtbl->GetConstantBuffer(tx, &buffer); +todo_wine + ok(SUCCEEDED(hr), "Failed to get texture shader constant buffer.\n"); if (FAILED(hr)) { skip("Texture shaders not supported, skipping further tests.\n"); IUnknown_Release(tx); return; } + + size = ID3DXBuffer_GetBufferSize(buffer); + ok(!size, "Unexpected buffer size %u.\n", size); + ID3DXBuffer_Release(buffer);
+ hr = tx->lpVtbl->GetDesc(tx, &ctab_desc); + ok(hr == S_OK, "Failed to get constant description, hr %#x.\n", hr); + ok(!ctab_desc.Constants, "Unexpected number of constants %u.\n", ctab_desc.Constants); + + /* Constant table access calls, without constant table. */ + h = tx->lpVtbl->GetConstant(tx, NULL, 0); + ok(!h, "Unexpected handle %p.\n", h); + if (!(wnd = CreateWindowA("static", "d3dx9_test", WS_OVERLAPPEDWINDOW, 0, 0, 640, 480, NULL, NULL, NULL, NULL))) {