forked from MoonsideGames/Refresh
				
			Compare commits
	
		
			5 Commits 
		
	
	
		
			329ffab6b8
			...
			864d381d2a
		
	
	| Author | SHA1 | Date | 
|---|---|---|
|  | 864d381d2a | |
|  | 903192cb4c | |
|  | 4cdd6a497a | |
|  | 28b4253fdf | |
|  | e4215efe5e | 
|  | @ -8,7 +8,7 @@ option(BUILD_SHARED_LIBS "Build shared library" ON) | ||||||
| 
 | 
 | ||||||
| # Version | # Version | ||||||
| SET(LIB_MAJOR_VERSION "1") | SET(LIB_MAJOR_VERSION "1") | ||||||
| SET(LIB_MINOR_VERSION "9") | SET(LIB_MINOR_VERSION "10") | ||||||
| SET(LIB_REVISION "0") | SET(LIB_REVISION "0") | ||||||
| SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}") | SET(LIB_VERSION "${LIB_MAJOR_VERSION}.${LIB_MINOR_VERSION}.${LIB_REVISION}") | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,7 +55,7 @@ extern "C" { | ||||||
| /* Version API */ | /* Version API */ | ||||||
| 
 | 
 | ||||||
| #define REFRESH_MAJOR_VERSION   1 | #define REFRESH_MAJOR_VERSION   1 | ||||||
| #define REFRESH_MINOR_VERSION	9 | #define REFRESH_MINOR_VERSION	10 | ||||||
| #define REFRESH_PATCH_VERSION	0 | #define REFRESH_PATCH_VERSION	0 | ||||||
| 
 | 
 | ||||||
| #define REFRESH_COMPILED_VERSION ( \ | #define REFRESH_COMPILED_VERSION ( \ | ||||||
|  | @ -376,6 +376,14 @@ typedef struct Refresh_TextureSlice | ||||||
| 	uint32_t level; | 	uint32_t level; | ||||||
| } Refresh_TextureSlice; | } Refresh_TextureSlice; | ||||||
| 
 | 
 | ||||||
|  | typedef struct Refresh_IndirectDrawCommand | ||||||
|  | { | ||||||
|  | 	uint32_t vertexCount; | ||||||
|  | 	uint32_t instanceCount; | ||||||
|  | 	uint32_t firstVertex; | ||||||
|  | 	uint32_t firstInstance; | ||||||
|  | } Refresh_IndirectDrawCommand; | ||||||
|  | 
 | ||||||
| /* State structures */ | /* State structures */ | ||||||
| 
 | 
 | ||||||
| typedef struct Refresh_SamplerStateCreateInfo | typedef struct Refresh_SamplerStateCreateInfo | ||||||
|  | @ -666,6 +674,7 @@ REFRESHAPI void Refresh_DrawPrimitives( | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Similar to Refresh_DrawPrimitives, but draw parameters are set from a buffer.
 | /* Similar to Refresh_DrawPrimitives, but draw parameters are set from a buffer.
 | ||||||
|  |  * The buffer layout should match the layout of Refresh_IndirectDrawCommand. | ||||||
|  * |  * | ||||||
|  * buffer:              A buffer containing draw parameters. |  * buffer:              A buffer containing draw parameters. | ||||||
|  * offsetInBytes:       The offset to start reading from the draw buffer. |  * offsetInBytes:       The offset to start reading from the draw buffer. | ||||||
|  | @ -1159,15 +1168,9 @@ REFRESHAPI Refresh_TextureFormat Refresh_GetSwapchainFormat( | ||||||
|  * 	A command buffer may only be used on the thread that |  * 	A command buffer may only be used on the thread that | ||||||
|  * 	it was acquired on. Using it on any other thread is an error. |  * 	it was acquired on. Using it on any other thread is an error. | ||||||
|  * |  * | ||||||
|  * fixed: |  | ||||||
|  * 	If a command buffer is designated as fixed, it can be |  | ||||||
|  * 	acquired once, have commands recorded into it, and |  | ||||||
|  * 	be re-submitted indefinitely. |  | ||||||
|  * |  | ||||||
|  */ |  */ | ||||||
| REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | REFRESHAPI Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device | ||||||
| 	uint8_t fixed |  | ||||||
| ); | ); | ||||||
| 
 | 
 | ||||||
| /* Acquires a texture to use for presentation.
 | /* Acquires a texture to use for presentation.
 | ||||||
|  |  | ||||||
|  | @ -789,13 +789,11 @@ void Refresh_UnclaimWindow( | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | Refresh_CommandBuffer* Refresh_AcquireCommandBuffer( | ||||||
| 	Refresh_Device *device, | 	Refresh_Device *device | ||||||
| 	uint8_t fixed |  | ||||||
| ) { | ) { | ||||||
| 	NULL_RETURN_NULL(device); | 	NULL_RETURN_NULL(device); | ||||||
| 	return device->AcquireCommandBuffer( | 	return device->AcquireCommandBuffer( | ||||||
| 		device->driverData, | 		device->driverData | ||||||
| 		fixed |  | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -470,8 +470,7 @@ struct Refresh_Device | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	Refresh_CommandBuffer* (*AcquireCommandBuffer)( | 	Refresh_CommandBuffer* (*AcquireCommandBuffer)( | ||||||
| 		Refresh_Renderer *driverData, | 		Refresh_Renderer *driverData | ||||||
| 		uint8_t fixed |  | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	Refresh_Texture* (*AcquireSwapchainTexture)( | 	Refresh_Texture* (*AcquireSwapchainTexture)( | ||||||
|  |  | ||||||
|  | @ -1500,10 +1500,6 @@ typedef struct VulkanCommandPool VulkanCommandPool; | ||||||
| typedef struct VulkanCommandBuffer | typedef struct VulkanCommandBuffer | ||||||
| { | { | ||||||
| 	VkCommandBuffer commandBuffer; | 	VkCommandBuffer commandBuffer; | ||||||
| 	uint8_t fixed; |  | ||||||
| 	uint8_t submitted; |  | ||||||
| 	uint8_t renderPassInProgress; |  | ||||||
| 
 |  | ||||||
| 	VulkanCommandPool *commandPool; | 	VulkanCommandPool *commandPool; | ||||||
| 
 | 
 | ||||||
| 	VulkanPresentData *presentDatas; | 	VulkanPresentData *presentDatas; | ||||||
|  | @ -4662,11 +4658,7 @@ static void VULKAN_INTERNAL_BeginCommandBuffer( | ||||||
| 	beginInfo.pNext = NULL; | 	beginInfo.pNext = NULL; | ||||||
| 	beginInfo.flags = 0; | 	beginInfo.flags = 0; | ||||||
| 	beginInfo.pInheritanceInfo = NULL; | 	beginInfo.pInheritanceInfo = NULL; | ||||||
| 
 | 	beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; | ||||||
| 	if (!commandBuffer->fixed) |  | ||||||
| 	{ |  | ||||||
| 		beginInfo.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	result = renderer->vkBeginCommandBuffer( | 	result = renderer->vkBeginCommandBuffer( | ||||||
| 		commandBuffer->commandBuffer, | 		commandBuffer->commandBuffer, | ||||||
|  | @ -6734,9 +6726,11 @@ static Refresh_Buffer* VULKAN_CreateBuffer( | ||||||
| static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( | static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanCommandBuffer *commandBuffer, | 	VulkanCommandBuffer *commandBuffer, | ||||||
| 	VkDeviceSize requiredSize | 	VkDeviceSize requiredSize, | ||||||
|  | 	VkDeviceSize alignment | ||||||
| ) { | ) { | ||||||
| 	VkDeviceSize size; | 	VkDeviceSize size; | ||||||
|  | 	VkDeviceSize offset; | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
| 	VulkanTransferBuffer *transferBuffer; | 	VulkanTransferBuffer *transferBuffer; | ||||||
| 
 | 
 | ||||||
|  | @ -6745,9 +6739,11 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 	for (i = 0; i < commandBuffer->transferBufferCount; i += 1) | 	for (i = 0; i < commandBuffer->transferBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		transferBuffer = commandBuffer->transferBuffers[i]; | 		transferBuffer = commandBuffer->transferBuffers[i]; | ||||||
|  | 		offset = transferBuffer->offset + alignment - (transferBuffer->offset % alignment); | ||||||
| 
 | 
 | ||||||
| 		if (transferBuffer->offset + requiredSize <= transferBuffer->buffer->size) | 		if (offset + requiredSize <= transferBuffer->buffer->size) | ||||||
| 		{ | 		{ | ||||||
|  | 			transferBuffer->offset = offset; | ||||||
| 			return transferBuffer; | 			return transferBuffer; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -6759,8 +6755,9 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 	for (i = 0; i < renderer->transferBufferPool.availableBufferCount; i += 1) | 	for (i = 0; i < renderer->transferBufferPool.availableBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		transferBuffer = renderer->transferBufferPool.availableBuffers[i]; | 		transferBuffer = renderer->transferBufferPool.availableBuffers[i]; | ||||||
|  | 		offset = transferBuffer->offset + alignment - (transferBuffer->offset % alignment); | ||||||
| 
 | 
 | ||||||
| 		if (transferBuffer->offset + requiredSize <= transferBuffer->buffer->size) | 		if (offset + requiredSize <= transferBuffer->buffer->size) | ||||||
| 		{ | 		{ | ||||||
| 			if (commandBuffer->transferBufferCount == commandBuffer->transferBufferCapacity) | 			if (commandBuffer->transferBufferCount == commandBuffer->transferBufferCapacity) | ||||||
| 			{ | 			{ | ||||||
|  | @ -6778,6 +6775,7 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 			renderer->transferBufferPool.availableBufferCount -= 1; | 			renderer->transferBufferPool.availableBufferCount -= 1; | ||||||
| 			SDL_UnlockMutex(renderer->transferBufferPool.lock); | 			SDL_UnlockMutex(renderer->transferBufferPool.lock); | ||||||
| 
 | 
 | ||||||
|  | 			transferBuffer->offset = offset; | ||||||
| 			return transferBuffer; | 			return transferBuffer; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | @ -6847,7 +6845,8 @@ static void VULKAN_SetTextureData( | ||||||
| 			textureSlice->rectangle.w, | 			textureSlice->rectangle.w, | ||||||
| 			textureSlice->rectangle.h, | 			textureSlice->rectangle.h, | ||||||
| 			vulkanTexture->format | 			vulkanTexture->format | ||||||
| 		) | 		), | ||||||
|  | 		VULKAN_INTERNAL_BytesPerPixel(vulkanTexture->format) | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	if (transferBuffer == NULL) | 	if (transferBuffer == NULL) | ||||||
|  | @ -6944,7 +6943,7 @@ static void VULKAN_SetTextureDataYUV( | ||||||
| 	uint32_t dataLength | 	uint32_t dataLength | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanTexture *tex; | 	VulkanTexture *tex = (VulkanTexture*) y; | ||||||
| 
 | 
 | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*)commandBuffer; | ||||||
| 	VulkanTransferBuffer *transferBuffer; | 	VulkanTransferBuffer *transferBuffer; | ||||||
|  | @ -6957,7 +6956,8 @@ static void VULKAN_SetTextureDataYUV( | ||||||
| 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer, | 		vulkanCommandBuffer, | ||||||
| 		yDataLength + uvDataLength | 		yDataLength + uvDataLength, | ||||||
|  | 		VULKAN_INTERNAL_BytesPerPixel(tex->format) | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	if (transferBuffer == NULL) | 	if (transferBuffer == NULL) | ||||||
|  | @ -6983,8 +6983,6 @@ static void VULKAN_SetTextureDataYUV( | ||||||
| 
 | 
 | ||||||
| 	/* Y */ | 	/* Y */ | ||||||
| 
 | 
 | ||||||
| 	tex = (VulkanTexture*) y; |  | ||||||
| 
 |  | ||||||
| 	SDL_memcpy( | 	SDL_memcpy( | ||||||
| 		stagingBufferPointer, | 		stagingBufferPointer, | ||||||
| 		dataPtr, | 		dataPtr, | ||||||
|  | @ -7336,7 +7334,8 @@ static void VULKAN_SetBufferData( | ||||||
| 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | 	transferBuffer = VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer, | 		vulkanCommandBuffer, | ||||||
| 		dataLength | 		dataLength, | ||||||
|  | 		renderer->physicalDeviceProperties.properties.limits.optimalBufferCopyOffsetAlignment | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	if (transferBuffer == NULL) | 	if (transferBuffer == NULL) | ||||||
|  | @ -8477,8 +8476,6 @@ static void VULKAN_BeginRenderPass( | ||||||
| 		VK_SUBPASS_CONTENTS_INLINE | 		VK_SUBPASS_CONTENTS_INLINE | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	vulkanCommandBuffer->renderPassInProgress = 1; |  | ||||||
| 
 |  | ||||||
| 	SDL_stack_free(clearValues); | 	SDL_stack_free(clearValues); | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < colorAttachmentCount; i += 1) | 	for (i = 0; i < colorAttachmentCount; i += 1) | ||||||
|  | @ -8615,7 +8612,6 @@ static void VULKAN_EndRenderPass( | ||||||
| 	vulkanCommandBuffer->renderPassDepthTexture = NULL; | 	vulkanCommandBuffer->renderPassDepthTexture = NULL; | ||||||
| 
 | 
 | ||||||
| 	vulkanCommandBuffer->currentGraphicsPipeline = NULL; | 	vulkanCommandBuffer->currentGraphicsPipeline = NULL; | ||||||
| 	vulkanCommandBuffer->renderPassInProgress = 0; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_BindGraphicsPipeline( | static void VULKAN_BindGraphicsPipeline( | ||||||
|  | @ -9190,8 +9186,7 @@ static VulkanCommandBuffer* VULKAN_INTERNAL_GetInactiveCommandBufferFromPool( | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer( | static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData | ||||||
| 	uint8_t fixed |  | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VkResult result; | 	VkResult result; | ||||||
|  | @ -9214,33 +9209,8 @@ static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer( | ||||||
| 	commandBuffer->fragmentUniformBuffer = NULL; | 	commandBuffer->fragmentUniformBuffer = NULL; | ||||||
| 	commandBuffer->computeUniformBuffer = NULL; | 	commandBuffer->computeUniformBuffer = NULL; | ||||||
| 
 | 
 | ||||||
| 	commandBuffer->fixed = fixed; |  | ||||||
| 	commandBuffer->submitted = 0; |  | ||||||
| 
 |  | ||||||
| 	commandBuffer->renderPassInProgress = 0; |  | ||||||
| 	commandBuffer->renderPassColorTargetCount = 0; | 	commandBuffer->renderPassColorTargetCount = 0; | ||||||
| 
 | 
 | ||||||
| 	result = renderer->vkResetCommandBuffer( |  | ||||||
| 		commandBuffer->commandBuffer, |  | ||||||
| 		VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	if (result != VK_SUCCESS) |  | ||||||
| 	{ |  | ||||||
| 		LogVulkanResultAsError("vkResetCommandBuffer", result); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	result = renderer->vkResetFences( |  | ||||||
| 		renderer->logicalDevice, |  | ||||||
| 		1, |  | ||||||
| 		&commandBuffer->inFlightFence |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	if (result != VK_SUCCESS) |  | ||||||
| 	{ |  | ||||||
| 		LogVulkanResultAsError("vkResetFences", result); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	VULKAN_INTERNAL_BeginCommandBuffer(renderer, commandBuffer); | 	VULKAN_INTERNAL_BeginCommandBuffer(renderer, commandBuffer); | ||||||
| 
 | 
 | ||||||
| 	return (Refresh_CommandBuffer*) commandBuffer; | 	return (Refresh_CommandBuffer*) commandBuffer; | ||||||
|  | @ -9644,6 +9614,7 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
| 	VulkanUniformBuffer *uniformBuffer; | 	VulkanUniformBuffer *uniformBuffer; | ||||||
| 	DescriptorSetData *descriptorSetData; | 	DescriptorSetData *descriptorSetData; | ||||||
|  | 	VkResult result; | ||||||
| 
 | 
 | ||||||
| 	/* Bound uniform buffers are now available */ | 	/* Bound uniform buffers are now available */ | ||||||
| 
 | 
 | ||||||
|  | @ -9773,12 +9744,35 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 
 | 
 | ||||||
| 	SDL_UnlockMutex(renderer->acquireCommandBufferLock); | 	SDL_UnlockMutex(renderer->acquireCommandBufferLock); | ||||||
| 
 | 
 | ||||||
| 	/* Resent presentation data */ | 	/* Reset presentation data */ | ||||||
| 
 | 
 | ||||||
| 	commandBuffer->presentDataCount = 0; | 	commandBuffer->presentDataCount = 0; | ||||||
| 	commandBuffer->waitSemaphoreCount = 0; | 	commandBuffer->waitSemaphoreCount = 0; | ||||||
| 	commandBuffer->signalSemaphoreCount = 0; | 	commandBuffer->signalSemaphoreCount = 0; | ||||||
| 
 | 
 | ||||||
|  | 	/* Reset Vulkan state */ | ||||||
|  | 
 | ||||||
|  | 	result = renderer->vkResetCommandBuffer( | ||||||
|  | 		commandBuffer->commandBuffer, | ||||||
|  | 		VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	if (result != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		LogVulkanResultAsError("vkResetCommandBuffer", result); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	result = renderer->vkResetFences( | ||||||
|  | 		renderer->logicalDevice, | ||||||
|  | 		1, | ||||||
|  | 		&commandBuffer->inFlightFence | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	if (result != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		LogVulkanResultAsError("vkResetFences", result); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/* Remove this command buffer from the submitted list */ | 	/* Remove this command buffer from the submitted list */ | ||||||
| 	for (i = 0; i < renderer->submittedCommandBufferCount; i += 1) | 	for (i = 0; i < renderer->submittedCommandBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
|  | @ -9910,7 +9904,6 @@ static void VULKAN_Submit( | ||||||
| 			); | 			); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		((VulkanCommandBuffer*)pCommandBuffers[i])->submitted = 1; |  | ||||||
| 		renderer->submittedCommandBuffers[renderer->submittedCommandBufferCount] = (VulkanCommandBuffer*) pCommandBuffers[i]; | 		renderer->submittedCommandBuffers[renderer->submittedCommandBufferCount] = (VulkanCommandBuffer*) pCommandBuffers[i]; | ||||||
| 		renderer->submittedCommandBufferCount += 1; | 		renderer->submittedCommandBufferCount += 1; | ||||||
| 
 | 
 | ||||||
|  | @ -9948,13 +9941,9 @@ static void VULKAN_Submit( | ||||||
| 
 | 
 | ||||||
| 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | ||||||
| 	{ | 	{ | ||||||
| 		/* If we set a timeout of 0, we can query the command buffer state */ | 		vulkanResult = renderer->vkGetFenceStatus( | ||||||
| 		vulkanResult = renderer->vkWaitForFences( |  | ||||||
| 			renderer->logicalDevice, | 			renderer->logicalDevice, | ||||||
| 			1, | 			renderer->submittedCommandBuffers[i]->inFlightFence | ||||||
| 			&renderer->submittedCommandBuffers[i]->inFlightFence, |  | ||||||
| 			VK_TRUE, |  | ||||||
| 			0 |  | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		if (vulkanResult == VK_SUCCESS) | 		if (vulkanResult == VK_SUCCESS) | ||||||
|  | @ -10537,6 +10526,7 @@ static uint8_t VULKAN_INTERNAL_CreateLogicalDevice( | ||||||
| 	SDL_zero(deviceFeatures); | 	SDL_zero(deviceFeatures); | ||||||
| 	deviceFeatures.fillModeNonSolid = VK_TRUE; | 	deviceFeatures.fillModeNonSolid = VK_TRUE; | ||||||
| 	deviceFeatures.samplerAnisotropy = VK_TRUE; | 	deviceFeatures.samplerAnisotropy = VK_TRUE; | ||||||
|  | 	deviceFeatures.multiDrawIndirect = VK_TRUE; | ||||||
| 
 | 
 | ||||||
| 	/* creating the logical device */ | 	/* creating the logical device */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue