d3d10: Improve constant buffer stride and size_unpacked calculation.
This commit is contained in:
parent
e07e2ac3f7
commit
bd83a874b3
|
@ -1156,6 +1156,7 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_variable *l, const ch
|
||||||
DWORD offset;
|
DWORD offset;
|
||||||
D3D10_CBUFFER_TYPE d3d10_cbuffer_type;
|
D3D10_CBUFFER_TYPE d3d10_cbuffer_type;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
unsigned int stride = 0;
|
||||||
|
|
||||||
/* Generate our own type, it isn't in the fx blob. */
|
/* Generate our own type, it isn't in the fx blob. */
|
||||||
l->type = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*l->type));
|
l->type = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*l->type));
|
||||||
|
@ -1283,9 +1284,49 @@ static HRESULT parse_fx10_local_buffer(struct d3d10_effect_variable *l, const ch
|
||||||
TRACE("Variable buffer offset: %u.\n", typem->buffer_offset);
|
TRACE("Variable buffer offset: %u.\n", typem->buffer_offset);
|
||||||
|
|
||||||
l->type->size_packed += v->type->size_packed;
|
l->type->size_packed += v->type->size_packed;
|
||||||
l->type->size_unpacked += v->type->size_unpacked;
|
|
||||||
|
/*
|
||||||
|
* For the complete constantbuffer the size_unpacked = stride,
|
||||||
|
* the stride is calculated like this:
|
||||||
|
*
|
||||||
|
* 1) if the constant buffer variables are packed with packoffset
|
||||||
|
* - stride = the highest used constant
|
||||||
|
* - the complete stride has to be a multiple of 0x10
|
||||||
|
*
|
||||||
|
* 2) if the constant buffer variables are NOT packed with packoffset
|
||||||
|
* - sum of unpacked size for all variables which fit in a 0x10 part
|
||||||
|
* - if the size exceeds a 0x10 part, the rest of the old part is skipped
|
||||||
|
* and a new part is started
|
||||||
|
* - if the variable is a struct it is always used a new part
|
||||||
|
* - the complete stride has to be a multiple of 0x10
|
||||||
|
*
|
||||||
|
* e.g.:
|
||||||
|
* 0x4, 0x4, 0x4, 0x8, 0x4, 0x14, 0x4
|
||||||
|
* part 0x10 0x10 0x20 -> 0x40
|
||||||
|
*/
|
||||||
|
if (v->flag & D3D10_EFFECT_VARIABLE_EXPLICIT_BIND_POINT)
|
||||||
|
{
|
||||||
|
if ((v->type->size_unpacked + v->buffer_offset) > stride)
|
||||||
|
{
|
||||||
|
stride = v->type->size_unpacked + v->buffer_offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (v->type->type_class == D3D10_SVC_STRUCT)
|
||||||
|
{
|
||||||
|
stride = (stride + 0xf) & ~0xf;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ((stride & 0xf) + v->type->size_unpacked) > 0x10)
|
||||||
|
{
|
||||||
|
stride = (stride + 0xf) & ~0xf;
|
||||||
|
}
|
||||||
|
|
||||||
|
stride += v->type->size_unpacked;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
l->type->stride = l->type->size_unpacked = (l->type->size_unpacked + 0xf) & ~0xf;
|
l->type->stride = l->type->size_unpacked = (stride + 0xf) & ~0xf;
|
||||||
|
|
||||||
TRACE("Constant buffer:\n");
|
TRACE("Constant buffer:\n");
|
||||||
TRACE("\tType name: %s.\n", debugstr_a(l->type->name));
|
TRACE("\tType name: %s.\n", debugstr_a(l->type->name));
|
||||||
|
|
Loading…
Reference in New Issue