From: Nikolay Sivov nsivov@codeweavers.com
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/d3dx9_36/preshader.c | 10 +++++--- dlls/d3dx9_36/shader.c | 43 +++++++++++++++++++++++++++++++++++ dlls/d3dx9_36/tests/texture.c | 2 -- dlls/d3dx9_36/texture.c | 6 ----- 4 files changed, 50 insertions(+), 11 deletions(-)
diff --git a/dlls/d3dx9_36/preshader.c b/dlls/d3dx9_36/preshader.c index c19c30d428b..5f40c34bcb4 100644 --- a/dlls/d3dx9_36/preshader.c +++ b/dlls/d3dx9_36/preshader.c @@ -1728,16 +1728,20 @@ HRESULT d3dx_evaluate_parameter(struct d3dx_param_eval *peval, const struct d3dx HRESULT hr; unsigned int i; unsigned int elements, elements_param, elements_table; + BOOL is_dirty; float *oc;
TRACE("peval %p, param %p, param_value %p.\n", peval, param, param_value);
- if (is_const_tab_input_dirty(&peval->pres.inputs, ULONG64_MAX)) + if ((is_dirty = is_const_tab_input_dirty(&peval->pres.inputs, ULONG64_MAX))) { set_constants(&peval->pres.regs, &peval->pres.inputs, - next_update_version(peval->version_counter), - NULL, NULL, peval->param_type, FALSE, FALSE); + next_update_version(peval->version_counter), NULL, NULL, + peval->param_type, FALSE, FALSE); + }
+ if (is_dirty || peval->pres.regs.table_sizes[PRES_REGTAB_INPUT]) + { if (FAILED(hr = execute_preshader(&peval->pres))) return hr; } diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c index a776a1d9a94..3ed7bcc5b70 100644 --- a/dlls/d3dx9_36/shader.c +++ b/dlls/d3dx9_36/shader.c @@ -18,6 +18,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <assert.h>
#include "d3dx9_private.h" #include "d3dcommon.h" @@ -2615,6 +2616,15 @@ static const struct ID3DXTextureShaderVtbl d3dx9_texture_shader_vtbl = d3dx9_texture_shader_SetMatrixTransposePointerArray };
+static inline struct d3dx9_texture_shader *unsafe_impl_from_ID3DXTextureShader(ID3DXTextureShader *iface) +{ + if (!iface) + return NULL; + + assert(iface->lpVtbl == &d3dx9_texture_shader_vtbl); + return impl_from_ID3DXTextureShader(iface); +} + HRESULT WINAPI D3DXCreateTextureShader(const DWORD *function, ID3DXTextureShader **texture_shader) { struct d3dx9_texture_shader *object; @@ -2660,6 +2670,39 @@ HRESULT WINAPI D3DXCreateTextureShader(const DWORD *function, ID3DXTextureShader return D3D_OK; }
+void WINAPI texture_shader_fill_2d(D3DXVECTOR4 *out, const D3DXVECTOR2 *texcoord, + const D3DXVECTOR2 *texelsize, void *data) +{ + struct d3dx9_texture_shader *shader = data; + struct d3dx_parameter param = { 0 }; + float *inputs; + + inputs = (float *)shader->eval->pres.regs.tables[PRES_REGTAB_INPUT]; + + *(inputs++) = texcoord->x; + *(inputs++) = texcoord->y; + *(inputs++) = 0.0f; + *(inputs++) = 0.0f; + + *(inputs++) = texelsize->x; + *(inputs++) = texelsize->y; + *(inputs++) = 0.0f; + *(inputs++) = 0.0f; + + param.type = D3DXPT_FLOAT; + param.bytes = 4 * sizeof(float); + d3dx_evaluate_parameter(shader->eval, ¶m, out); +} + +HRESULT WINAPI D3DXFillTextureTX(struct IDirect3DTexture9 *texture, ID3DXTextureShader *texture_shader) +{ + struct d3dx9_texture_shader *shader = unsafe_impl_from_ID3DXTextureShader(texture_shader); + + TRACE("texture %p, texture_shader %p.\n", texture, texture_shader); + + return D3DXFillTexture(texture, texture_shader_fill_2d, shader); +} + static unsigned int get_instr_length(const DWORD *byte_code, unsigned int major, unsigned int minor) { DWORD opcode = *byte_code & 0xffff; diff --git a/dlls/d3dx9_36/tests/texture.c b/dlls/d3dx9_36/tests/texture.c index 2fb05d57856..0f7c6c45ef2 100644 --- a/dlls/d3dx9_36/tests/texture.c +++ b/dlls/d3dx9_36/tests/texture.c @@ -2527,7 +2527,6 @@ float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR ok(SUCCEEDED(hr), "Got unexpected hr %#x.\n", hr);
hr = D3DXFillTextureTX(texture, tx); - todo_wine ok(SUCCEEDED(hr), "Got unexpected hr %#x.\n", hr);
hr = IDirect3DTexture9_LockRect(texture, 0, &lr, NULL, D3DLOCK_READONLY); @@ -2541,7 +2540,6 @@ float4 main(float3 pos : POSITION, float3 size : PSIZE) : COLOR /* The third position coordinate is apparently undefined for 2D textures. */ unsigned int color = data[y * lr.Pitch / sizeof(*data) + x] & 0xffffff00;
- todo_wine ok(compare_color(color, expected, 1), "Unexpected color %08x at (%u, %u).\n", color, x, y); } } diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c index 46bca5eb4e6..04df331c79a 100644 --- a/dlls/d3dx9_36/texture.c +++ b/dlls/d3dx9_36/texture.c @@ -1382,12 +1382,6 @@ HRESULT WINAPI D3DXFillTexture(struct IDirect3DTexture9 *texture, LPD3DXFILL2D f return D3D_OK; }
-HRESULT WINAPI D3DXFillTextureTX(struct IDirect3DTexture9 *texture, ID3DXTextureShader *texture_shader) -{ - FIXME("texture %p, texture_shader %p stub.\n", texture, texture_shader); - return E_NOTIMPL; -} - HRESULT WINAPI D3DXCreateCubeTextureFromFileInMemoryEx(IDirect3DDevice9 *device, const void *src_data, UINT src_data_size, UINT size, UINT mip_levels, DWORD usage, D3DFORMAT format, D3DPOOL pool, DWORD filter, DWORD mip_filter, D3DCOLOR color_key, D3DXIMAGE_INFO *src_info,