From eb27db8681643cbde80a9e04e25e7fb42d07fdf3 Mon Sep 17 00:00:00 2001 From: Jesse Natalie Date: Mon, 1 Mar 2021 09:37:57 -0800 Subject: [PATCH] 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 Reviewed-By: Bill Kristiansen Part-of: --- src/gallium/drivers/d3d12/d3d12_draw.cpp | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/gallium/drivers/d3d12/d3d12_draw.cpp b/src/gallium/drivers/d3d12/d3d12_draw.cpp index 557ea58..0513dc5 100644 --- a/src/gallium/drivers/d3d12/d3d12_draw.cpp +++ b/src/gallium/drivers/d3d12/d3d12_draw.cpp @@ -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); -- 2.7.4