d3d12: Handle null constant buffers
authorJesse Natalie <jenatali@microsoft.com>
Mon, 1 Mar 2021 17:37:57 +0000 (09:37 -0800)
committerMarge Bot <eric+marge@anholt.net>
Mon, 1 Mar 2021 20:42:58 +0000 (20:42 +0000)
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>

src/gallium/drivers/d3d12/d3d12_draw.cpp

index 557ea58..0513dc5 100644 (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);