d3d12: Handle null constant buffers

RuneScape ends up hitting this path, and it's easy enough to get
some well-defined behavior instead of a crash.

Reviewed-by: Eric Anholt <eric@anholt.net>
Reviewed-By: Bill Kristiansen <billkris@microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9342>
This commit is contained in:
Jesse Natalie 2021-03-01 09:37:57 -08:00 committed by Marge Bot
parent 6a8c51dc5a
commit eb27db8681
1 changed files with 11 additions and 9 deletions

View File

@ -59,16 +59,18 @@ fill_cbv_descriptors(struct d3d12_context *ctx,
unsigned binding = shader->cb_bindings[i].binding;
struct pipe_constant_buffer *buffer = &ctx->cbufs[stage][binding];
assert(buffer->buffer_size > 0);
assert(buffer->buffer);
struct d3d12_resource *res = d3d12_resource(buffer->buffer);
d3d12_transition_resource_state(ctx, res, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
D3D12_CONSTANT_BUFFER_VIEW_DESC cbv_desc = {};
cbv_desc.BufferLocation = d3d12_resource_gpu_virtual_address(res) + buffer->buffer_offset;
cbv_desc.SizeInBytes = MIN2(D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * 16,
align(buffer->buffer_size, 256));
d3d12_batch_reference_resource(batch, res);
if (buffer) {
assert(buffer->buffer_size > 0);
assert(buffer->buffer);
struct d3d12_resource *res = d3d12_resource(buffer->buffer);
d3d12_transition_resource_state(ctx, res, D3D12_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER);
cbv_desc.BufferLocation = d3d12_resource_gpu_virtual_address(res) + buffer->buffer_offset;
cbv_desc.SizeInBytes = MIN2(D3D12_REQ_CONSTANT_BUFFER_ELEMENT_COUNT * 16,
align(buffer->buffer_size, 256));
d3d12_batch_reference_resource(batch, res);
}
struct d3d12_descriptor_handle handle;
d3d12_descriptor_heap_alloc_handle(batch->view_heap, &handle);