Mesa (master): radv: Modify radv_descriptor_set for MSVC legality

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jan 26 09:25:38 UTC 2021


Module: Mesa
Branch: master
Commit: 879b5f41f4c23b24871be430e1d97c6ac6bf1ba7
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=879b5f41f4c23b24871be430e1d97c6ac6bf1ba7

Author: James Park <jpark37 at lagfreegames.com>
Date:   Thu Nov 26 19:26:56 2020 -0800

radv: Modify radv_descriptor_set for MSVC legality

Reviewed-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7793>

---

 src/amd/vulkan/radv_cmd_buffer.c     | 58 ++++++++++++++++++----------------
 src/amd/vulkan/radv_debug.c          |  6 ++--
 src/amd/vulkan/radv_descriptor_set.c | 60 ++++++++++++++++++------------------
 src/amd/vulkan/radv_private.h        | 12 +++++---
 4 files changed, 72 insertions(+), 64 deletions(-)

diff --git a/src/amd/vulkan/radv_cmd_buffer.c b/src/amd/vulkan/radv_cmd_buffer.c
index 0b706336b5a..34468909989 100644
--- a/src/amd/vulkan/radv_cmd_buffer.c
+++ b/src/amd/vulkan/radv_cmd_buffer.c
@@ -789,7 +789,7 @@ radv_emit_descriptor_pointers(struct radv_cmd_buffer *cmd_buffer,
 			struct radv_descriptor_set *set =
 				descriptors_state->sets[start + i];
 
-			radv_emit_shader_pointer_body(device, cs, set->va, true);
+			radv_emit_shader_pointer_body(device, cs, set->header.va, true);
 		}
 	}
 }
@@ -2630,16 +2630,17 @@ radv_flush_push_descriptors(struct radv_cmd_buffer *cmd_buffer,
 {
 	struct radv_descriptor_state *descriptors_state =
 		radv_get_descriptors_state(cmd_buffer, bind_point);
-	struct radv_descriptor_set *set = &descriptors_state->push_set.set;
+	struct radv_descriptor_set *set =
+		(struct radv_descriptor_set *)&descriptors_state->push_set.set;
 	unsigned bo_offset;
 
-	if (!radv_cmd_buffer_upload_data(cmd_buffer, set->size, 32,
-					 set->mapped_ptr,
+	if (!radv_cmd_buffer_upload_data(cmd_buffer, set->header.size, 32,
+					 set->header.mapped_ptr,
 					 &bo_offset))
 		return;
 
-	set->va = radv_buffer_get_va(cmd_buffer->upload.upload_bo);
-	set->va += bo_offset;
+	set->header.va = radv_buffer_get_va(cmd_buffer->upload.upload_bo);
+	set->header.va += bo_offset;
 }
 
 static void
@@ -2661,7 +2662,7 @@ radv_flush_indirect_descriptor_sets(struct radv_cmd_buffer *cmd_buffer,
 		uint64_t set_va = 0;
 		struct radv_descriptor_set *set = descriptors_state->sets[i];
 		if (descriptors_state->valid & (1u << i))
-			set_va = set->va;
+			set_va = set->header.va;
 		uptr[0] = set_va & 0xffffffff;
 	}
 
@@ -4115,13 +4116,13 @@ radv_bind_descriptor_set(struct radv_cmd_buffer *cmd_buffer,
 	assert(set);
 
 	if (!cmd_buffer->device->use_global_bo_list) {
-		for (unsigned j = 0; j < set->buffer_count; ++j)
+		for (unsigned j = 0; j < set->header.buffer_count; ++j)
 			if (set->descriptors[j])
 				radv_cs_add_buffer(ws, cmd_buffer->cs, set->descriptors[j]);
 	}
 
-	if(set->bo)
-		radv_cs_add_buffer(ws, cmd_buffer->cs, set->bo);
+	if(set->header.bo)
+		radv_cs_add_buffer(ws, cmd_buffer->cs, set->header.bo);
 }
 
 void radv_CmdBindDescriptorSets(
@@ -4158,7 +4159,7 @@ void radv_CmdBindDescriptorSets(
 			uint32_t *dst = descriptors_state->dynamic_buffers + idx * 4;
 			assert(dyn_idx < dynamicOffsetCount);
 
-			struct radv_descriptor_range *range = set->dynamic_descriptors + j;
+			struct radv_descriptor_range *range = set->header.dynamic_descriptors + j;
 
 			if (!range->va) {
 				memset(dst, 0, 4 * 4);
@@ -4194,18 +4195,18 @@ static bool radv_init_push_descriptor_set(struct radv_cmd_buffer *cmd_buffer,
 {
 	struct radv_descriptor_state *descriptors_state =
 		radv_get_descriptors_state(cmd_buffer, bind_point);
-	set->size = layout->size;
-	set->layout = layout;
+	set->header.size = layout->size;
+	set->header.layout = layout;
 
-	if (descriptors_state->push_set.capacity < set->size) {
-		size_t new_size = MAX2(set->size, 1024);
+	if (descriptors_state->push_set.capacity < set->header.size) {
+		size_t new_size = MAX2(set->header.size, 1024);
 		new_size = MAX2(new_size, 2 * descriptors_state->push_set.capacity);
 		new_size = MIN2(new_size, 96 * MAX_PUSH_DESCRIPTORS);
 
-		free(set->mapped_ptr);
-		set->mapped_ptr = malloc(new_size);
+		free(set->header.mapped_ptr);
+		set->header.mapped_ptr = malloc(new_size);
 
-		if (!set->mapped_ptr) {
+		if (!set->header.mapped_ptr) {
 			descriptors_state->push_set.capacity = 0;
 			cmd_buffer->record_result = VK_ERROR_OUT_OF_HOST_MEMORY;
 			return false;
@@ -4226,22 +4227,23 @@ void radv_meta_push_descriptor_set(
 	const VkWriteDescriptorSet*          pDescriptorWrites)
 {
 	RADV_FROM_HANDLE(radv_pipeline_layout, layout, _layout);
-	struct radv_descriptor_set *push_set = &cmd_buffer->meta_push_descriptors;
+	struct radv_descriptor_set *push_set =
+		(struct radv_descriptor_set *)&cmd_buffer->meta_push_descriptors;
 	unsigned bo_offset;
 
 	assert(set == 0);
 	assert(layout->set[set].layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
 
-	push_set->size = layout->set[set].layout->size;
-	push_set->layout = layout->set[set].layout;
+	push_set->header.size = layout->set[set].layout->size;
+	push_set->header.layout = layout->set[set].layout;
 
-	if (!radv_cmd_buffer_upload_alloc(cmd_buffer, push_set->size, 32,
+	if (!radv_cmd_buffer_upload_alloc(cmd_buffer, push_set->header.size, 32,
 	                                  &bo_offset,
-	                                  (void**) &push_set->mapped_ptr))
+	                                  (void**) &push_set->header.mapped_ptr))
 		return;
 
-	push_set->va = radv_buffer_get_va(cmd_buffer->upload.upload_bo);
-	push_set->va += bo_offset;
+	push_set->header.va = radv_buffer_get_va(cmd_buffer->upload.upload_bo);
+	push_set->header.va += bo_offset;
 
 	radv_update_descriptor_sets(cmd_buffer->device, cmd_buffer,
 	                            radv_descriptor_set_to_handle(push_set),
@@ -4262,7 +4264,8 @@ void radv_CmdPushDescriptorSetKHR(
 	RADV_FROM_HANDLE(radv_pipeline_layout, layout, _layout);
 	struct radv_descriptor_state *descriptors_state =
 		radv_get_descriptors_state(cmd_buffer, pipelineBindPoint);
-	struct radv_descriptor_set *push_set = &descriptors_state->push_set.set;
+	struct radv_descriptor_set *push_set =
+		(struct radv_descriptor_set *)&descriptors_state->push_set.set;
 
 	assert(layout->set[set].layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
 
@@ -4299,7 +4302,8 @@ void radv_CmdPushDescriptorSetWithTemplateKHR(
 	RADV_FROM_HANDLE(radv_descriptor_update_template, templ, descriptorUpdateTemplate);
 	struct radv_descriptor_state *descriptors_state =
 		radv_get_descriptors_state(cmd_buffer, templ->bind_point);
-	struct radv_descriptor_set *push_set = &descriptors_state->push_set.set;
+	struct radv_descriptor_set *push_set =
+		(struct radv_descriptor_set *)&descriptors_state->push_set.set;
 
 	assert(layout->set[set].layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
 
diff --git a/src/amd/vulkan/radv_debug.c b/src/amd/vulkan/radv_debug.c
index 41e46093db0..0d94ddd77e2 100644
--- a/src/amd/vulkan/radv_debug.c
+++ b/src/amd/vulkan/radv_debug.c
@@ -199,11 +199,11 @@ radv_dump_descriptor_set(struct radv_device *device,
 
 	if (!set)
 		return;
-	layout = set->layout;
+	layout = set->header.layout;
 
-	for (i = 0; i < set->layout->binding_count; i++) {
+	for (i = 0; i < set->header.layout->binding_count; i++) {
 		uint32_t *desc =
-			set->mapped_ptr + layout->binding[i].offset / 4;
+			set->header.mapped_ptr + layout->binding[i].offset / 4;
 
 		switch (layout->binding[i].type) {
 		case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
diff --git a/src/amd/vulkan/radv_descriptor_set.c b/src/amd/vulkan/radv_descriptor_set.c
index d5f946d8538..ff1c2df08f9 100644
--- a/src/amd/vulkan/radv_descriptor_set.c
+++ b/src/amd/vulkan/radv_descriptor_set.c
@@ -559,7 +559,7 @@ radv_descriptor_set_create(struct radv_device *device,
 		buffer_count = layout->binding[layout->binding_count - 1].buffer_offset +
 		               *variable_count * stride;
 	}
-	unsigned range_offset = sizeof(struct radv_descriptor_set) +
+	unsigned range_offset = sizeof(struct radv_descriptor_set_header) +
 		sizeof(struct radeon_winsys_bo *) * buffer_count;
 	unsigned mem_size = range_offset +
 		sizeof(struct radv_descriptor_range) * layout->dynamic_offset_count;
@@ -580,15 +580,15 @@ radv_descriptor_set_create(struct radv_device *device,
 
 	memset(set, 0, mem_size);
 
-	vk_object_base_init(&device->vk, &set->base,
+	vk_object_base_init(&device->vk, &set->header.base,
 			    VK_OBJECT_TYPE_DESCRIPTOR_SET);
 
 	if (layout->dynamic_offset_count) {
-		set->dynamic_descriptors = (struct radv_descriptor_range*)((uint8_t*)set + range_offset);
+		set->header.dynamic_descriptors = (struct radv_descriptor_range*)((uint8_t*)set + range_offset);
 	}
 
-	set->layout = layout;
-	set->buffer_count = buffer_count;
+	set->header.layout = layout;
+	set->header.buffer_count = buffer_count;
 	uint32_t layout_size = layout->size;
 	if (variable_count) {
 		assert(layout->has_variable_descriptors);
@@ -601,7 +601,7 @@ radv_descriptor_set_create(struct radv_device *device,
 	}
 	layout_size = align_u32(layout_size, 32);
 	if (layout_size) {
-		set->size = layout_size;
+		set->header.size = layout_size;
 
 		if (!pool->host_memory_base && pool->entry_count == pool->max_entry_count) {
 			vk_free2(&device->vk.alloc, NULL, set);
@@ -612,9 +612,9 @@ radv_descriptor_set_create(struct radv_device *device,
 		 * time looking for gaps if the app only allocates &
 		 * resets via the pool. */
 		if (pool->current_offset + layout_size <= pool->size) {
-			set->bo = pool->bo;
-			set->mapped_ptr = (uint32_t*)(pool->mapped_ptr + pool->current_offset);
-			set->va = set->bo ? (radv_buffer_get_va(set->bo) + pool->current_offset) : 0;
+			set->header.bo = pool->bo;
+			set->header.mapped_ptr = (uint32_t*)(pool->mapped_ptr + pool->current_offset);
+			set->header.va = pool->bo ? (radv_buffer_get_va(set->header.bo) + pool->current_offset) : 0;
 			if (!pool->host_memory_base) {
 				pool->entries[pool->entry_count].offset = pool->current_offset;
 				pool->entries[pool->entry_count].size = layout_size;
@@ -636,9 +636,9 @@ radv_descriptor_set_create(struct radv_device *device,
 				vk_free2(&device->vk.alloc, NULL, set);
 				return vk_error(device->instance, VK_ERROR_OUT_OF_POOL_MEMORY);
 			}
-			set->bo = pool->bo;
-			set->mapped_ptr = (uint32_t*)(pool->mapped_ptr + offset);
-			set->va = set->bo ? (radv_buffer_get_va(set->bo) + offset) : 0;
+			set->header.bo = pool->bo;
+			set->header.mapped_ptr = (uint32_t*)(pool->mapped_ptr + offset);
+			set->header.va = pool->bo ? (radv_buffer_get_va(set->header.bo) + offset) : 0;
 			memmove(&pool->entries[index + 1], &pool->entries[index],
 				sizeof(pool->entries[0]) * (pool->entry_count - index));
 			pool->entries[index].offset = offset;
@@ -661,7 +661,7 @@ radv_descriptor_set_create(struct radv_device *device,
 
 			const uint32_t *samplers = (const uint32_t*)((const char*)layout + layout->binding[i].immutable_samplers_offset);
 			for (unsigned j = 0; j < layout->binding[i].array_size; ++j) {
-				memcpy(set->mapped_ptr + offset, samplers + 4 * j, 16);
+				memcpy(set->header.mapped_ptr + offset, samplers + 4 * j, 16);
 				offset += layout->binding[i].size / 4;
 			}
 
@@ -679,8 +679,8 @@ radv_descriptor_set_destroy(struct radv_device *device,
 {
 	assert(!pool->host_memory_base);
 
-	if (free_bo && set->size && !pool->host_memory_base) {
-		uint32_t offset = (uint8_t*)set->mapped_ptr - pool->mapped_ptr;
+	if (free_bo && set->header.size && !pool->host_memory_base) {
+		uint32_t offset = (uint8_t*)set->header.mapped_ptr - pool->mapped_ptr;
 		for (int i = 0; i < pool->entry_count; ++i) {
 			if (pool->entries[i].offset == offset) {
 				memmove(&pool->entries[i], &pool->entries[i+1],
@@ -690,7 +690,7 @@ radv_descriptor_set_destroy(struct radv_device *device,
 			}
 		}
 	}
-	vk_object_base_finish(&set->base);
+	vk_object_base_finish(&set->header.base);
 	vk_free2(&device->vk.alloc, NULL, set);
 }
 
@@ -1143,8 +1143,8 @@ void radv_update_descriptor_sets(
 		RADV_FROM_HANDLE(radv_descriptor_set, set,
 		                 dstSetOverride ? dstSetOverride : writeset->dstSet);
 		const struct radv_descriptor_set_binding_layout *binding_layout =
-			set->layout->binding + writeset->dstBinding;
-		uint32_t *ptr = set->mapped_ptr;
+			set->header.layout->binding + writeset->dstBinding;
+		uint32_t *ptr = set->header.mapped_ptr;
 		struct radeon_winsys_bo **buffer_list =  set->descriptors;
 		/* Immutable samplers are not copied into push descriptors when they are
 		 * allocated, so if we are writing push descriptors we have to copy the
@@ -1152,7 +1152,7 @@ void radv_update_descriptor_sets(
 		 */
 		const bool copy_immutable_samplers = cmd_buffer &&
 			binding_layout->immutable_samplers_offset && !binding_layout->immutable_samplers_equal;
-		const uint32_t *samplers = radv_immutable_samplers(set->layout, binding_layout);
+		const uint32_t *samplers = radv_immutable_samplers(set->header.layout, binding_layout);
 
 		ptr += binding_layout->offset / 4;
 
@@ -1170,8 +1170,8 @@ void radv_update_descriptor_sets(
 			case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
 				unsigned idx = writeset->dstArrayElement + j;
 				idx += binding_layout->dynamic_offset_offset;
-				assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR));
-				write_dynamic_buffer_descriptor(device, set->dynamic_descriptors + idx,
+				assert(!(set->header.layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR));
+				write_dynamic_buffer_descriptor(device, set->header.dynamic_descriptors + idx,
 								buffer_list, writeset->pBufferInfo + j);
 				break;
 			}
@@ -1230,11 +1230,11 @@ void radv_update_descriptor_sets(
 		RADV_FROM_HANDLE(radv_descriptor_set, dst_set,
 		                 copyset->dstSet);
 		const struct radv_descriptor_set_binding_layout *src_binding_layout =
-			src_set->layout->binding + copyset->srcBinding;
+			src_set->header.layout->binding + copyset->srcBinding;
 		const struct radv_descriptor_set_binding_layout *dst_binding_layout =
-			dst_set->layout->binding + copyset->dstBinding;
-		uint32_t *src_ptr = src_set->mapped_ptr;
-		uint32_t *dst_ptr = dst_set->mapped_ptr;
+			dst_set->header.layout->binding + copyset->dstBinding;
+		uint32_t *src_ptr = src_set->header.mapped_ptr;
+		uint32_t *dst_ptr = dst_set->header.mapped_ptr;
 		struct radeon_winsys_bo **src_buffer_list = src_set->descriptors;
 		struct radeon_winsys_bo **dst_buffer_list = dst_set->descriptors;
 
@@ -1272,8 +1272,8 @@ void radv_update_descriptor_sets(
 				src_idx += src_binding_layout->dynamic_offset_offset;
 				dst_idx += dst_binding_layout->dynamic_offset_offset;
 
-				src_range = src_set->dynamic_descriptors + src_idx;
-				dst_range = dst_set->dynamic_descriptors + dst_idx;
+				src_range = src_set->header.dynamic_descriptors + src_idx;
+				dst_range = dst_set->header.dynamic_descriptors + dst_idx;
 				*dst_range = *src_range;
 				break;
 			}
@@ -1422,7 +1422,7 @@ void radv_update_descriptor_set_with_template(struct radv_device *device,
 
 	for (i = 0; i < templ->entry_count; ++i) {
 		struct radeon_winsys_bo **buffer_list = set->descriptors + templ->entry[i].buffer_offset;
-		uint32_t *pDst = set->mapped_ptr + templ->entry[i].dst_offset;
+		uint32_t *pDst = set->header.mapped_ptr + templ->entry[i].dst_offset;
 		const uint8_t *pSrc = ((const uint8_t *) pData) + templ->entry[i].src_offset;
 		uint32_t j;
 
@@ -1436,8 +1436,8 @@ void radv_update_descriptor_set_with_template(struct radv_device *device,
 			case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
 			case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: {
 				const unsigned idx = templ->entry[i].dst_offset + j;
-				assert(!(set->layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR));
-				write_dynamic_buffer_descriptor(device, set->dynamic_descriptors + idx,
+				assert(!(set->header.layout->flags & VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR));
+				write_dynamic_buffer_descriptor(device, set->header.dynamic_descriptors + idx,
 								buffer_list, (struct VkDescriptorBufferInfo *) pSrc);
 				break;
 			}
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 3a7c1b1c0f7..9969b1d7938 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -905,7 +905,7 @@ struct radv_descriptor_range {
 	uint32_t size;
 };
 
-struct radv_descriptor_set {
+struct radv_descriptor_set_header {
 	struct vk_object_base base;
 	const struct radv_descriptor_set_layout *layout;
 	uint32_t size;
@@ -915,13 +915,17 @@ struct radv_descriptor_set {
 	uint64_t va;
 	uint32_t *mapped_ptr;
 	struct radv_descriptor_range *dynamic_descriptors;
+};
+
+struct radv_descriptor_set {
+	struct radv_descriptor_set_header header;
 
-	struct radeon_winsys_bo *descriptors[0];
+	struct radeon_winsys_bo *descriptors[];
 };
 
 struct radv_push_descriptor_set
 {
-	struct radv_descriptor_set set;
+	struct radv_descriptor_set_header set;
 	uint32_t capacity;
 };
 
@@ -1457,7 +1461,7 @@ struct radv_cmd_buffer {
 
 	uint8_t push_constants[MAX_PUSH_CONSTANTS_SIZE];
 	VkShaderStageFlags push_constant_stages;
-	struct radv_descriptor_set meta_push_descriptors;
+	struct radv_descriptor_set_header meta_push_descriptors;
 
 	struct radv_descriptor_state descriptors[MAX_BIND_POINTS];
 



More information about the mesa-commit mailing list