Skip to content

Commit 2f9ef59

Browse files
authored
Merge branch 'main' into metal
2 parents 58a8b70 + e834515 commit 2f9ef59

18 files changed

+202
-130
lines changed

.github/workflows/generate_pot.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
-o cemu.pot
3636
3737
- name: Upload artifact
38-
uses: actions/upload-artifact@v3
38+
uses: actions/upload-artifact@v4
3939
with:
4040
name: POT file
4141
path: ./cemu.pot

src/Cafe/GameProfile/GameProfile.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ bool gameProfile_loadEnumOption(IniParser& iniParser, const char* optionName, T&
140140
for(const T& v : T())
141141
{
142142
// test integer option
143-
if (boost::iequals(fmt::format("{}", static_cast<typename std::underlying_type<T>::type>(v)), *option_value))
143+
if (boost::iequals(fmt::format("{}", fmt::underlying(v)), *option_value))
144144
{
145145
option = v;
146146
return true;

src/Cafe/HW/Latte/Core/LatteShaderCache.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,9 @@ void LatteShaderCache_Load()
502502
g_renderer->DeleteTexture(g_shaderCacheLoaderState.textureDRCId);
503503

504504
g_bootSndPlayer.FadeOutSound();
505+
506+
if(Latte_GetStopSignal())
507+
LatteThread_Exit();
505508
}
506509

507510
void LatteShaderCache_ShowProgress(const std::function <bool(void)>& loadUpdateFunc, bool isPipelines)
@@ -651,8 +654,6 @@ void LatteShaderCache_LoadPipelineCache(uint64 cacheTitleId)
651654
else if (g_renderer->GetType() == RendererAPI::Metal)
652655
MetalPipelineCache::GetInstance().EndLoading();
653656
#endif
654-
if(Latte_GetStopSignal())
655-
LatteThread_Exit();
656657
}
657658

658659
bool LatteShaderCache_updatePipelineLoadingProgress()

src/Cafe/HW/Latte/Core/LatteThread.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ void LatteThread_Exit()
257257
LatteSHRC_UnloadAll();
258258
// close disk cache
259259
LatteShaderCache_Close();
260+
RendererOutputShader::ShutdownStatic();
260261
// destroy renderer but make sure that g_renderer remains valid until the destructor has finished
261262
if (g_renderer)
262263
{

src/Cafe/HW/Latte/Renderer/RendererOuputShader.cpp

+16-4
Original file line numberDiff line numberDiff line change
@@ -251,8 +251,8 @@ RendererOutputShader::RendererOutputShader(const std::string& vertex_source, con
251251
else
252252
finalFragmentSrc = PrependFragmentPreamble(fragment_source);
253253

254-
m_vertex_shader = g_renderer->shader_create(RendererShader::ShaderType::kVertex, 0, 0, vertex_source, false, false);
255-
m_fragment_shader = g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, finalFragmentSrc, false, false);
254+
m_vertex_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kVertex, 0, 0, vertex_source, false, false));
255+
m_fragment_shader.reset(g_renderer->shader_create(RendererShader::ShaderType::kFragment, 0, 0, finalFragmentSrc, false, false));
256256

257257
m_vertex_shader->PreponeCompilation(true);
258258
m_fragment_shader->PreponeCompilation(true);
@@ -302,8 +302,8 @@ void RendererOutputShader::SetUniformParameters(const LatteTextureView& texture_
302302
shader->SetUniform2fv(locations.m_loc_outputResolution, res, 1);
303303
}
304304
};
305-
setUniforms(m_vertex_shader, m_uniformLocations[0]);
306-
setUniforms(m_fragment_shader, m_uniformLocations[1]);
305+
setUniforms(m_vertex_shader.get(), m_uniformLocations[0]);
306+
setUniforms(m_fragment_shader.get(), m_uniformLocations[1]);
307307
}
308308

309309
RendererOutputShader* RendererOutputShader::s_copy_shader;
@@ -513,3 +513,15 @@ void RendererOutputShader::InitializeStatic()
513513
s_hermit_shader_ud = new RendererOutputShader(vertex_source_ud, s_hermite_shader_source);
514514
}
515515
}
516+
517+
void RendererOutputShader::ShutdownStatic()
518+
{
519+
delete s_copy_shader;
520+
delete s_copy_shader_ud;
521+
522+
delete s_bicubic_shader;
523+
delete s_bicubic_shader_ud;
524+
525+
delete s_hermit_shader;
526+
delete s_hermit_shader_ud;
527+
}

src/Cafe/HW/Latte/Renderer/RendererOuputShader.h

+5-4
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,16 @@ class RendererOutputShader
2121

2222
RendererShader* GetVertexShader() const
2323
{
24-
return m_vertex_shader;
24+
return m_vertex_shader.get();
2525
}
2626

2727
RendererShader* GetFragmentShader() const
2828
{
29-
return m_fragment_shader;
29+
return m_fragment_shader.get();
3030
}
3131

3232
static void InitializeStatic();
33+
static void ShutdownStatic();
3334

3435
static RendererOutputShader* s_copy_shader;
3536
static RendererOutputShader* s_copy_shader_ud;
@@ -47,8 +48,8 @@ class RendererOutputShader
4748
static std::string PrependFragmentPreamble(const std::string& shaderSrc);
4849

4950
protected:
50-
RendererShader* m_vertex_shader;
51-
RendererShader* m_fragment_shader;
51+
std::unique_ptr<RendererShader> m_vertex_shader;
52+
std::unique_ptr<RendererShader> m_fragment_shader;
5253

5354
struct UniformLocations
5455
{

src/Cafe/HW/Latte/Renderer/Vulkan/RendererShaderVk.cpp

+3
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,9 @@ RendererShaderVk::~RendererShaderVk()
211211
{
212212
while (!list_pipelineInfo.empty())
213213
delete list_pipelineInfo[0];
214+
215+
VkDevice vkDev = VulkanRenderer::GetInstance()->GetLogicalDevice();
216+
vkDestroyShaderModule(vkDev, m_shader_module, nullptr);
214217
}
215218

216219
void RendererShaderVk::Init()

src/Cafe/HW/Latte/Renderer/Vulkan/SwapchainInfoVk.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ void SwapchainInfoVk::Create()
6060
VkAttachmentDescription colorAttachment = {};
6161
colorAttachment.format = m_surfaceFormat.format;
6262
colorAttachment.samples = VK_SAMPLE_COUNT_1_BIT;
63-
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD;
63+
colorAttachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
6464
colorAttachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
6565
colorAttachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
6666
colorAttachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;

src/Cafe/HW/Latte/Renderer/Vulkan/SwapchainInfoVk.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ struct SwapchainInfoVk
7070
VkSurfaceFormatKHR m_surfaceFormat{};
7171
VkSwapchainKHR m_swapchain{};
7272
Vector2i m_desiredExtent{};
73+
VkExtent2D m_actualExtent{};
7374
uint32 swapchainImageIndex = (uint32)-1;
7475
uint64 m_presentId = 1;
7576
uint64 m_queueDepth = 0; // number of frames with pending presentation requests
@@ -92,5 +93,4 @@ struct SwapchainInfoVk
9293
VkSemaphore m_currentSemaphore = VK_NULL_HANDLE;
9394

9495
std::array<uint32, 2> m_swapchainQueueFamilyIndices;
95-
VkExtent2D m_actualExtent{};
9696
};

src/Cafe/HW/Latte/Renderer/Vulkan/VKRMemoryManager.cpp

+29-50
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,14 @@
44

55
/* VKRSynchronizedMemoryBuffer */
66

7+
VKRSynchronizedRingAllocator::~VKRSynchronizedRingAllocator()
8+
{
9+
for(auto& buf : m_buffers)
10+
{
11+
m_vkrMemMgr->DeleteBuffer(buf.vk_buffer, buf.vk_mem);
12+
}
13+
}
14+
715
void VKRSynchronizedRingAllocator::addUploadBufferSyncPoint(AllocatorBuffer_t& buffer, uint32 offset)
816
{
917
auto cmdBufferId = m_vkr->GetCurrentCommandBufferId();
@@ -233,6 +241,15 @@ void VKRSynchronizedHeapAllocator::GetStats(uint32& numBuffers, size_t& totalBuf
233241

234242
/* VkTextureChunkedHeap */
235243

244+
VkTextureChunkedHeap::~VkTextureChunkedHeap()
245+
{
246+
VkDevice device = VulkanRenderer::GetInstance()->GetLogicalDevice();
247+
for (auto& i : m_list_chunkInfo)
248+
{
249+
vkFreeMemory(device, i.mem, nullptr);
250+
}
251+
}
252+
236253
uint32 VkTextureChunkedHeap::allocateNewChunk(uint32 chunkIndex, uint32 minimumAllocationSize)
237254
{
238255
cemu_assert_debug(m_list_chunkInfo.size() == chunkIndex);
@@ -310,11 +327,11 @@ VKRBuffer* VKRBuffer::Create(VKR_BUFFER_TYPE bufferType, size_t bufferSize, VkMe
310327
VkDeviceMemory bufferMemory;
311328
bool allocSuccess;
312329
if (bufferType == VKR_BUFFER_TYPE::STAGING)
313-
allocSuccess = memMgr->CreateBuffer2(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, properties, buffer, bufferMemory);
330+
allocSuccess = memMgr->CreateBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_SRC_BIT, properties, buffer, bufferMemory);
314331
else if (bufferType == VKR_BUFFER_TYPE::INDEX)
315-
allocSuccess = memMgr->CreateBuffer2(bufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, properties, buffer, bufferMemory);
332+
allocSuccess = memMgr->CreateBuffer(bufferSize, VK_BUFFER_USAGE_INDEX_BUFFER_BIT, properties, buffer, bufferMemory);
316333
else if (bufferType == VKR_BUFFER_TYPE::STRIDE)
317-
allocSuccess = memMgr->CreateBuffer2(bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, properties, buffer, bufferMemory);
334+
allocSuccess = memMgr->CreateBuffer(bufferSize, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, properties, buffer, bufferMemory);
318335
else
319336
cemu_assert_debug(false);
320337
if (!allocSuccess)
@@ -363,28 +380,14 @@ uint32 VkBufferChunkedHeap::allocateNewChunk(uint32 chunkIndex, uint32 minimumAl
363380
return allocationSize;
364381
}
365382

366-
uint32_t VKRMemoryManager::FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) const
367-
{
368-
VkPhysicalDeviceMemoryProperties memProperties;
369-
vkGetPhysicalDeviceMemoryProperties(m_vkr->GetPhysicalDevice(), &memProperties);
370-
371-
for (uint32 i = 0; i < memProperties.memoryTypeCount; i++)
372-
{
373-
if ((typeFilter & (1 << i)) != 0 && (memProperties.memoryTypes[i].propertyFlags & properties) == properties)
374-
return i;
375-
}
376-
m_vkr->UnrecoverableError(fmt::format("failed to find suitable memory type ({0:#08x} {1:#08x})", typeFilter, properties).c_str());
377-
return 0;
378-
}
379-
380-
bool VKRMemoryManager::FindMemoryType2(uint32 typeFilter, VkMemoryPropertyFlags properties, uint32& memoryIndex) const
383+
bool VKRMemoryManager::FindMemoryType(uint32 typeFilter, VkMemoryPropertyFlags properties, uint32& memoryIndex) const
381384
{
382385
VkPhysicalDeviceMemoryProperties memProperties;
383386
vkGetPhysicalDeviceMemoryProperties(m_vkr->GetPhysicalDevice(), &memProperties);
384387

385388
for (uint32_t i = 0; i < memProperties.memoryTypeCount; i++)
386389
{
387-
if (typeFilter & (1 << i) && memProperties.memoryTypes[i].propertyFlags == properties)
390+
if (typeFilter & (1 << i) && (memProperties.memoryTypes[i].propertyFlags & properties) == properties)
388391
{
389392
memoryIndex = i;
390393
return true;
@@ -455,31 +458,7 @@ size_t VKRMemoryManager::GetTotalMemoryForBufferType(VkBufferUsageFlags usage, V
455458
return total;
456459
}
457460

458-
void VKRMemoryManager::CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const
459-
{
460-
VkBufferCreateInfo bufferInfo{};
461-
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
462-
bufferInfo.usage = usage;
463-
bufferInfo.size = size;
464-
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
465-
if (vkCreateBuffer(m_vkr->GetLogicalDevice(), &bufferInfo, nullptr, &buffer) != VK_SUCCESS)
466-
m_vkr->UnrecoverableError("Failed to create buffer");
467-
468-
VkMemoryRequirements memRequirements;
469-
vkGetBufferMemoryRequirements(m_vkr->GetLogicalDevice(), buffer, &memRequirements);
470-
471-
VkMemoryAllocateInfo allocInfo{};
472-
allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
473-
allocInfo.allocationSize = memRequirements.size;
474-
allocInfo.memoryTypeIndex = FindMemoryType(memRequirements.memoryTypeBits, properties);
475-
476-
if (vkAllocateMemory(m_vkr->GetLogicalDevice(), &allocInfo, nullptr, &bufferMemory) != VK_SUCCESS)
477-
m_vkr->UnrecoverableError("Failed to allocate buffer memory");
478-
if (vkBindBufferMemory(m_vkr->GetLogicalDevice(), buffer, bufferMemory, 0) != VK_SUCCESS)
479-
m_vkr->UnrecoverableError("Failed to bind buffer memory");
480-
}
481-
482-
bool VKRMemoryManager::CreateBuffer2(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const
461+
bool VKRMemoryManager::CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const
483462
{
484463
VkBufferCreateInfo bufferInfo{};
485464
bufferInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
@@ -488,7 +467,7 @@ bool VKRMemoryManager::CreateBuffer2(VkDeviceSize size, VkBufferUsageFlags usage
488467
bufferInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
489468
if (vkCreateBuffer(m_vkr->GetLogicalDevice(), &bufferInfo, nullptr, &buffer) != VK_SUCCESS)
490469
{
491-
cemuLog_log(LogType::Force, "Failed to create buffer (CreateBuffer2)");
470+
cemuLog_log(LogType::Force, "Failed to create buffer (CreateBuffer)");
492471
return false;
493472
}
494473

@@ -498,7 +477,7 @@ bool VKRMemoryManager::CreateBuffer2(VkDeviceSize size, VkBufferUsageFlags usage
498477
VkMemoryAllocateInfo allocInfo{};
499478
allocInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
500479
allocInfo.allocationSize = memRequirements.size;
501-
if (!FindMemoryType2(memRequirements.memoryTypeBits, properties, allocInfo.memoryTypeIndex))
480+
if (!FindMemoryType(memRequirements.memoryTypeBits, properties, allocInfo.memoryTypeIndex))
502481
{
503482
vkDestroyBuffer(m_vkr->GetLogicalDevice(), buffer, nullptr);
504483
return false;
@@ -511,7 +490,7 @@ bool VKRMemoryManager::CreateBuffer2(VkDeviceSize size, VkBufferUsageFlags usage
511490
if (vkBindBufferMemory(m_vkr->GetLogicalDevice(), buffer, bufferMemory, 0) != VK_SUCCESS)
512491
{
513492
vkDestroyBuffer(m_vkr->GetLogicalDevice(), buffer, nullptr);
514-
cemuLog_log(LogType::Force, "Failed to bind buffer (CreateBuffer2)");
493+
cemuLog_log(LogType::Force, "Failed to bind buffer (CreateBuffer)");
515494
return false;
516495
}
517496
return true;
@@ -533,7 +512,7 @@ bool VKRMemoryManager::CreateBufferFromHostMemory(void* hostPointer, VkDeviceSiz
533512

534513
if (vkCreateBuffer(m_vkr->GetLogicalDevice(), &bufferInfo, nullptr, &buffer) != VK_SUCCESS)
535514
{
536-
cemuLog_log(LogType::Force, "Failed to create buffer (CreateBuffer2)");
515+
cemuLog_log(LogType::Force, "Failed to create buffer (CreateBuffer)");
537516
return false;
538517
}
539518

@@ -554,7 +533,7 @@ bool VKRMemoryManager::CreateBufferFromHostMemory(void* hostPointer, VkDeviceSiz
554533

555534
allocInfo.pNext = &importHostMem;
556535

557-
if (!FindMemoryType2(memRequirements.memoryTypeBits, properties, allocInfo.memoryTypeIndex))
536+
if (!FindMemoryType(memRequirements.memoryTypeBits, properties, allocInfo.memoryTypeIndex))
558537
{
559538
vkDestroyBuffer(m_vkr->GetLogicalDevice(), buffer, nullptr);
560539
return false;
@@ -598,7 +577,7 @@ VkImageMemAllocation* VKRMemoryManager::imageMemoryAllocate(VkImage image)
598577
map_textureHeap.emplace(typeFilter, texHeap);
599578
}
600579
else
601-
texHeap = it->second;
580+
texHeap = it->second.get();
602581

603582
// alloc mem from heap
604583
uint32 allocationSize = (uint32)memRequirements.size;

src/Cafe/HW/Latte/Renderer/Vulkan/VKRMemoryManager.h

+5-6
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class VkTextureChunkedHeap : private ChunkedHeap<>
4848
{
4949
public:
5050
VkTextureChunkedHeap(class VKRMemoryManager* memoryManager, uint32 typeFilter) : m_vkrMemoryManager(memoryManager), m_typeFilter(typeFilter) { };
51+
~VkTextureChunkedHeap();
5152

5253
struct ChunkInfo
5354
{
@@ -148,6 +149,7 @@ class VKRSynchronizedRingAllocator
148149
public:
149150
VKRSynchronizedRingAllocator(class VulkanRenderer* vkRenderer, class VKRMemoryManager* vkMemoryManager, VKR_BUFFER_TYPE bufferType, uint32 minimumBufferAllocSize) : m_vkr(vkRenderer), m_vkrMemMgr(vkMemoryManager), m_bufferType(bufferType), m_minimumBufferAllocSize(minimumBufferAllocSize) {};
150151
VKRSynchronizedRingAllocator(const VKRSynchronizedRingAllocator&) = delete; // disallow copy
152+
~VKRSynchronizedRingAllocator();
151153

152154
struct BufferSyncPoint_t
153155
{
@@ -256,7 +258,7 @@ class VKRMemoryManager
256258
}
257259

258260
// texture memory management
259-
std::unordered_map<uint32, VkTextureChunkedHeap*> map_textureHeap; // one heap per memory type
261+
std::unordered_map<uint32, std::unique_ptr<VkTextureChunkedHeap>> map_textureHeap; // one heap per memory type
260262
std::vector<uint8> m_textureUploadBuffer;
261263

262264
// texture upload buffer
@@ -286,9 +288,7 @@ class VKRMemoryManager
286288
m_vertexStrideMetalBuffer.CleanupBuffer(latestFinishedCommandBufferId);
287289
}
288290

289-
// memory helpers
290-
uint32_t FindMemoryType(uint32_t typeFilter, VkMemoryPropertyFlags properties) const;
291-
bool FindMemoryType2(uint32 typeFilter, VkMemoryPropertyFlags properties, uint32& memoryIndex) const; // searches for exact properties. Can gracefully fail without throwing exception (returns false)
291+
bool FindMemoryType(uint32 typeFilter, VkMemoryPropertyFlags properties, uint32& memoryIndex) const; // searches for exact properties. Can gracefully fail without throwing exception (returns false)
292292
std::vector<uint32> FindMemoryTypes(uint32_t typeFilter, VkMemoryPropertyFlags properties) const;
293293

294294
// image memory allocation
@@ -298,8 +298,7 @@ class VKRMemoryManager
298298
// buffer management
299299
size_t GetTotalMemoryForBufferType(VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, size_t minimumBufferSize = 16 * 1024 * 1024);
300300

301-
void CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const;
302-
bool CreateBuffer2(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const; // same as CreateBuffer but doesn't throw exception on failure
301+
bool CreateBuffer(VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const; // same as CreateBuffer but doesn't throw exception on failure
303302
bool CreateBufferFromHostMemory(void* hostPointer, VkDeviceSize size, VkBufferUsageFlags usage, VkMemoryPropertyFlags properties, VkBuffer& buffer, VkDeviceMemory& bufferMemory) const;
304303

305304
void DeleteBuffer(VkBuffer& buffer, VkDeviceMemory& deviceMem) const;

src/Cafe/HW/Latte/Renderer/Vulkan/VulkanAPI.h

+3
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,7 @@ VKFUNC_DEVICE(vkCmdDraw);
165165
VKFUNC_DEVICE(vkCmdCopyBufferToImage);
166166
VKFUNC_DEVICE(vkCmdCopyImageToBuffer);
167167
VKFUNC_DEVICE(vkCmdClearColorImage);
168+
VKFUNC_DEVICE(vkCmdClearAttachments);
168169
VKFUNC_DEVICE(vkCmdBindIndexBuffer);
169170
VKFUNC_DEVICE(vkCmdBindVertexBuffers);
170171
VKFUNC_DEVICE(vkCmdDrawIndexed);
@@ -198,6 +199,7 @@ VKFUNC_DEVICE(vkCmdEndTransformFeedbackEXT);
198199

199200
// query
200201
VKFUNC_DEVICE(vkCreateQueryPool);
202+
VKFUNC_DEVICE(vkDestroyQueryPool);
201203
VKFUNC_DEVICE(vkCmdResetQueryPool);
202204
VKFUNC_DEVICE(vkCmdBeginQuery);
203205
VKFUNC_DEVICE(vkCmdEndQuery);
@@ -236,6 +238,7 @@ VKFUNC_DEVICE(vkAllocateDescriptorSets);
236238
VKFUNC_DEVICE(vkFreeDescriptorSets);
237239
VKFUNC_DEVICE(vkUpdateDescriptorSets);
238240
VKFUNC_DEVICE(vkCreateDescriptorPool);
241+
VKFUNC_DEVICE(vkDestroyDescriptorPool);
239242
VKFUNC_DEVICE(vkDestroyDescriptorSetLayout);
240243

241244
#undef VKFUNC_INIT

0 commit comments

Comments
 (0)