2016-04-12 11:34 GMT+02:00 Paul Gofman <gofmanp(a)gmail.com>:
@@ -369,12 +410,17 @@ static HRESULT get_constants_desc(unsigned int *byte_code, struct d3dx_const_tab goto err_out; } count = 1; - hr = ID3DXConstantTable_GetConstantDesc(ctab, hc, &cdesc[i], &count); - if (FAILED(hr)) + if (FAILED(hr = ID3DXConstantTable_GetConstantDesc(ctab, hc, &cdesc[i], &count))) { FIXME("Could not get constant desc, hr %#x.\n", hr); goto err_out; } + if (count != 1) + { + FIXME("Unexpected constant descriptors count %u.\n", count); + hr = D3DERR_INVALIDCALL; + goto err_out; + }
Notice that, since you set count to 1 before calling GetConstantDesc(), the only possible results are 0 or 1 and the 0 case should be already handled by the "if (FAILED())" branch. You might use a temporary array of 3 elements and pass 3 as count, then only copy the first element to the destination so the rest of the code is unchanged while still giving a chance for the FIXME to trigger. Not sure it's worth it though, maybe just adding support for multiple descriptors (even only in struct d3dx_const_tab and the immediately related code) might be a better plan.
+static HRESULT set_constants_param(struct d3dx_regstore *rs, struct d3dx_const_tab *const_tab, + D3DXHANDLE hc, struct d3dx_parameter *param) +{ + ID3DXConstantTable *ctab = const_tab->ctab; + D3DXCONSTANT_DESC desc; + unsigned int const_count, param_count, i, j, n, table, start_offset; + unsigned int minor, major, major_stride, param_offset; + BOOL transpose, get_element; + unsigned int desc_count; + + desc_count = 1; + ID3DXConstantTable_GetConstantDesc(ctab, hc, &desc, &desc_count); + if (desc_count != 1) + { + FIXME("Unexpected constant descriptors count %u.\n", desc_count); + return D3DERR_INVALIDCALL; + }
Same here, in this case the descriptors are only used locally so both options above should be easier to do.
+ if (const_count != param_count) + { + FIXME("Number of elements or struct members differs between parameter and constant.\n"); + return D3DERR_INVALIDCALL; + }
You could print the two counts here. Not a big deal though. Looks good otherwise.