On Thu, 8 Jul 2021 at 01:13, Zebediah Figura zfigura@codeweavers.com wrote:
@@ -573,11 +581,31 @@ static void d3d11_device_context_set_constant_buffers(ID3D11DeviceContext1 *ifac return; }
- if (!offsets != !counts)
- {
WARN("Got offsets pointer %p but counts pointer %p; ignoring call.\n", offsets, counts);
return;
- }
- for (i = 0; i < buffer_count; ++i) { struct d3d_buffer *buffer = unsafe_impl_from_ID3D11Buffer(buffers[i]);
wined3d_buffers[i] = buffer ? buffer->wined3d_buffer : NULL;
if (offsets && (offsets[i] & 15))
{
WARN("Offset %u is not aligned to a multiple of 16.\n", offsets[i]);
return;
}
if (counts && (counts[i] & 15))
{
WARN("Count %u is not aligned to a multiple of 16.\n", counts[i]);
return;
}
wined3d_buffers[i].buffer = buffer ? buffer->wined3d_buffer : NULL;
wined3d_buffers[i].offset = (offsets ? offsets[i] : 0) * 16;
wined3d_buffers[i].size = (counts ? counts[i] : 4096) * 16;
}
wined3d_mutex_lock();
There are two different kinds of "16" above, which probably doesn't make thing clearer. For one of those, we could use "sizeof(struct wined3d_vec4)". I think the other one may be "D3D11_COMMONSHADER_CONSTANT_BUFFER_PARTIAL_UPDATE_EXTENTS_BYTE_ALIGNMENT", although that's perhaps a little unwieldy. We could still define our own constant though.
@@ -2713,7 +2713,7 @@ static bool wined3d_context_vk_update_descriptors(struct wined3d_context_vk *con switch (binding->shader_descriptor_type) { case WINED3D_SHADER_DESCRIPTOR_TYPE_CBV:
if (!(buffer = state->cb[binding->shader_type][binding->resource_idx]))
if (!(buffer = state->cb[binding->shader_type][binding->resource_idx].buffer)) { if (!wined3d_shader_descriptor_writes_vk_add_write(writes, vk_descriptor_set, binding->binding_idx, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,
Note that this patch doesn't implement constant buffer offsetting for the Vulkan backend. (Which is fine, if perhaps a little unfortunate.)
@@ -1867,6 +1867,12 @@ static void state_init_default(struct wined3d_state *state, const struct wined3d
for (i = 0; i < WINED3D_MAX_STREAMS; ++i) state->streams[i].frequency = 1;
- for (i = 0; i < WINED3D_SHADER_TYPE_COUNT; ++i)
- {
for (j = 0; j < MAX_CONSTANT_BUFFERS; ++j)
state->cb[i][j].size = MAX_IMMEDIATE_CONSTANT_BUFFER_SIZE * 16;
- }
}
Using MAX_IMMEDIATE_CONSTANT_BUFFER_SIZE here is perhaps convenient, but it's somewhat of an abuse. Immediate constant buffers are constant buffers defined inline in the shader bytecode, accessed through the "icb" register.