early-access version 1375
This commit is contained in:
parent
fdf7221fd6
commit
2273e4c96b
@ -1,7 +1,7 @@
|
|||||||
yuzu emulator early access
|
yuzu emulator early access
|
||||||
=============
|
=============
|
||||||
|
|
||||||
This is the source code for early-access 1373.
|
This is the source code for early-access 1375.
|
||||||
|
|
||||||
## Legal Notice
|
## Legal Notice
|
||||||
|
|
||||||
|
@ -64,8 +64,10 @@ if (MSVC)
|
|||||||
else()
|
else()
|
||||||
add_compile_options(
|
add_compile_options(
|
||||||
-Wall
|
-Wall
|
||||||
|
-Werror=array-bounds
|
||||||
-Werror=implicit-fallthrough
|
-Werror=implicit-fallthrough
|
||||||
-Werror=missing-declarations
|
-Werror=missing-declarations
|
||||||
|
-Werror=missing-field-initializers
|
||||||
-Werror=reorder
|
-Werror=reorder
|
||||||
-Werror=switch
|
-Werror=switch
|
||||||
-Werror=uninitialized
|
-Werror=uninitialized
|
||||||
|
@ -179,22 +179,22 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume
|
|||||||
return ProcessMacroBind(argument);
|
return ProcessMacroBind(argument);
|
||||||
case MAXWELL3D_REG_INDEX(firmware[4]):
|
case MAXWELL3D_REG_INDEX(firmware[4]):
|
||||||
return ProcessFirmwareCall4();
|
return ProcessFirmwareCall4();
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data):
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[1]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 1:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[2]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 2:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[3]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 3:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[4]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 4:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[5]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 5:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[6]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 6:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[7]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 7:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[8]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 8:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[9]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 9:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[10]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 10:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[11]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 11:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[12]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 12:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[13]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 13:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[14]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 14:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[15]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15:
|
||||||
return StartCBData(method);
|
return StartCBData(method);
|
||||||
case MAXWELL3D_REG_INDEX(cb_bind[0]):
|
case MAXWELL3D_REG_INDEX(cb_bind[0]):
|
||||||
return ProcessCBBind(0);
|
return ProcessCBBind(0);
|
||||||
@ -286,22 +286,22 @@ void Maxwell3D::CallMultiMethod(u32 method, const u32* base_start, u32 amount,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
switch (method) {
|
switch (method) {
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data):
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[1]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 1:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[2]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 2:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[3]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 3:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[4]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 4:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[5]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 5:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[6]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 6:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[7]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 7:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[8]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 8:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[9]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 9:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[10]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 10:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[11]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 11:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[12]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 12:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[13]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 13:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[14]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 14:
|
||||||
case MAXWELL3D_REG_INDEX(const_buffer.cb_data[15]):
|
case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15:
|
||||||
ProcessCBMultiData(method, base_start, amount);
|
ProcessCBMultiData(method, base_start, amount);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -592,7 +592,7 @@ void Maxwell3D::ProcessCBData(u32 value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Maxwell3D::StartCBData(u32 method) {
|
void Maxwell3D::StartCBData(u32 method) {
|
||||||
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]);
|
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX(const_buffer.cb_data);
|
||||||
cb_data_state.start_pos = regs.const_buffer.cb_pos;
|
cb_data_state.start_pos = regs.const_buffer.cb_pos;
|
||||||
cb_data_state.id = method - first_cb_data;
|
cb_data_state.id = method - first_cb_data;
|
||||||
cb_data_state.current = method;
|
cb_data_state.current = method;
|
||||||
@ -605,7 +605,7 @@ void Maxwell3D::ProcessCBMultiData(u32 method, const u32* start_base, u32 amount
|
|||||||
if (cb_data_state.current != null_cb_data) {
|
if (cb_data_state.current != null_cb_data) {
|
||||||
FinishCBData();
|
FinishCBData();
|
||||||
}
|
}
|
||||||
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]);
|
constexpr u32 first_cb_data = MAXWELL3D_REG_INDEX(const_buffer.cb_data);
|
||||||
cb_data_state.start_pos = regs.const_buffer.cb_pos;
|
cb_data_state.start_pos = regs.const_buffer.cb_pos;
|
||||||
cb_data_state.id = method - first_cb_data;
|
cb_data_state.id = method - first_cb_data;
|
||||||
cb_data_state.current = method;
|
cb_data_state.current = method;
|
||||||
|
@ -1336,7 +1336,7 @@ public:
|
|||||||
u32 cb_address_high;
|
u32 cb_address_high;
|
||||||
u32 cb_address_low;
|
u32 cb_address_low;
|
||||||
u32 cb_pos;
|
u32 cb_pos;
|
||||||
u32 cb_data[NumCBData];
|
std::array<u32, NumCBData> cb_data;
|
||||||
|
|
||||||
GPUVAddr BufferAddress() const {
|
GPUVAddr BufferAddress() const {
|
||||||
return static_cast<GPUVAddr>(
|
return static_cast<GPUVAddr>(
|
||||||
|
@ -672,7 +672,7 @@ VkFrontFace FrontFace(Maxwell::FrontFace front_face) {
|
|||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
VkCullModeFlags CullFace(Maxwell::CullFace cull_face) {
|
VkCullModeFlagBits CullFace(Maxwell::CullFace cull_face) {
|
||||||
switch (cull_face) {
|
switch (cull_face) {
|
||||||
case Maxwell::CullFace::Front:
|
case Maxwell::CullFace::Front:
|
||||||
return VK_CULL_MODE_FRONT_BIT;
|
return VK_CULL_MODE_FRONT_BIT;
|
||||||
|
@ -63,7 +63,7 @@ VkBlendFactor BlendFactor(Maxwell::Blend::Factor factor);
|
|||||||
|
|
||||||
VkFrontFace FrontFace(Maxwell::FrontFace front_face);
|
VkFrontFace FrontFace(Maxwell::FrontFace front_face);
|
||||||
|
|
||||||
VkCullModeFlags CullFace(Maxwell::CullFace cull_face);
|
VkCullModeFlagBits CullFace(Maxwell::CullFace cull_face);
|
||||||
|
|
||||||
VkComponentSwizzle SwizzleSource(Tegra::Texture::SwizzleSource swizzle);
|
VkComponentSwizzle SwizzleSource(Tegra::Texture::SwizzleSource swizzle);
|
||||||
|
|
||||||
|
@ -181,6 +181,7 @@ std::vector<vk::ShaderModule> VKGraphicsPipeline::CreateShaderModules(
|
|||||||
.pNext = nullptr,
|
.pNext = nullptr,
|
||||||
.flags = 0,
|
.flags = 0,
|
||||||
.codeSize = 0,
|
.codeSize = 0,
|
||||||
|
.pCode = nullptr,
|
||||||
};
|
};
|
||||||
|
|
||||||
std::vector<vk::ShaderModule> shader_modules;
|
std::vector<vk::ShaderModule> shader_modules;
|
||||||
@ -326,8 +327,8 @@ vk::Pipeline VKGraphicsPipeline::CreatePipeline(const SPIRVProgram& program,
|
|||||||
.rasterizerDiscardEnable =
|
.rasterizerDiscardEnable =
|
||||||
static_cast<VkBool32>(state.rasterize_enable == 0 ? VK_TRUE : VK_FALSE),
|
static_cast<VkBool32>(state.rasterize_enable == 0 ? VK_TRUE : VK_FALSE),
|
||||||
.polygonMode = VK_POLYGON_MODE_FILL,
|
.polygonMode = VK_POLYGON_MODE_FILL,
|
||||||
.cullMode =
|
.cullMode = static_cast<VkCullModeFlags>(
|
||||||
dynamic.cull_enable ? MaxwellToVK::CullFace(dynamic.CullFace()) : VK_CULL_MODE_NONE,
|
dynamic.cull_enable ? MaxwellToVK::CullFace(dynamic.CullFace()) : VK_CULL_MODE_NONE),
|
||||||
.frontFace = MaxwellToVK::FrontFace(dynamic.FrontFace()),
|
.frontFace = MaxwellToVK::FrontFace(dynamic.FrontFace()),
|
||||||
.depthBiasEnable = state.depth_bias_enable,
|
.depthBiasEnable = state.depth_bias_enable,
|
||||||
.depthBiasConstantFactor = 0.0f,
|
.depthBiasConstantFactor = 0.0f,
|
||||||
|
@ -60,7 +60,7 @@ struct TextureCacheRuntime {
|
|||||||
MemoryAllocator& memory_allocator;
|
MemoryAllocator& memory_allocator;
|
||||||
StagingBufferPool& staging_buffer_pool;
|
StagingBufferPool& staging_buffer_pool;
|
||||||
BlitImageHelper& blit_image_helper;
|
BlitImageHelper& blit_image_helper;
|
||||||
std::unordered_map<RenderPassKey, vk::RenderPass> renderpass_cache;
|
std::unordered_map<RenderPassKey, vk::RenderPass> renderpass_cache{};
|
||||||
|
|
||||||
void Finish();
|
void Finish();
|
||||||
|
|
||||||
|
@ -129,6 +129,15 @@ void AsyncShaders::QueueOpenGLShader(const OpenGL::Device& device,
|
|||||||
.compiler_settings = compiler_settings,
|
.compiler_settings = compiler_settings,
|
||||||
.registry = registry,
|
.registry = registry,
|
||||||
.cpu_address = cpu_addr,
|
.cpu_address = cpu_addr,
|
||||||
|
.pp_cache = nullptr,
|
||||||
|
.vk_device = nullptr,
|
||||||
|
.scheduler = nullptr,
|
||||||
|
.descriptor_pool = nullptr,
|
||||||
|
.update_descriptor_queue = nullptr,
|
||||||
|
.bindings{},
|
||||||
|
.program{},
|
||||||
|
.key{},
|
||||||
|
.num_color_buffers = 0,
|
||||||
});
|
});
|
||||||
cv.notify_one();
|
cv.notify_one();
|
||||||
}
|
}
|
||||||
@ -143,6 +152,15 @@ void AsyncShaders::QueueVulkanShader(Vulkan::VKPipelineCache* pp_cache,
|
|||||||
std::unique_lock lock(queue_mutex);
|
std::unique_lock lock(queue_mutex);
|
||||||
pending_queue.push({
|
pending_queue.push({
|
||||||
.backend = Backend::Vulkan,
|
.backend = Backend::Vulkan,
|
||||||
|
.device = nullptr,
|
||||||
|
.shader_type{},
|
||||||
|
.uid = 0,
|
||||||
|
.code{},
|
||||||
|
.code_b{},
|
||||||
|
.main_offset = 0,
|
||||||
|
.compiler_settings{},
|
||||||
|
.registry{},
|
||||||
|
.cpu_address = 0,
|
||||||
.pp_cache = pp_cache,
|
.pp_cache = pp_cache,
|
||||||
.vk_device = &device,
|
.vk_device = &device,
|
||||||
.scheduler = &scheduler,
|
.scheduler = &scheduler,
|
||||||
|
@ -1193,25 +1193,35 @@ u32 MapSizeBytes(const ImageBase& image) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
using P = PixelFormat;
|
static_assert(CalculateLevelSize(LevelInfo{{1920, 1080, 1}, {0, 2, 0}, {1, 1}, 2, 0}, 0) ==
|
||||||
|
0x7f8000);
|
||||||
|
static_assert(CalculateLevelSize(LevelInfo{{32, 32, 1}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000);
|
||||||
|
|
||||||
static_assert(CalculateLevelSize(LevelInfo{{1920, 1080}, {0, 2, 0}, {1, 1}, 2, 0}, 0) == 0x7f8000);
|
static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 1, 0, 7) ==
|
||||||
static_assert(CalculateLevelSize(LevelInfo{{32, 32}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000);
|
0x2afc00);
|
||||||
|
static_assert(CalculateLevelOffset(PixelFormat::ASTC_2D_12X12_UNORM, {8192, 4096, 1}, {0, 2, 0}, 1,
|
||||||
|
0, 12) == 0x50d200);
|
||||||
|
|
||||||
static_assert(CalculateLevelOffset(P::R8_SINT, {1920, 1080}, {0, 2}, 1, 0, 7) == 0x2afc00);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
static_assert(CalculateLevelOffset(P::ASTC_2D_12X12_UNORM, {8192, 4096}, {0, 2}, 1, 0, 12) ==
|
0) == 0);
|
||||||
0x50d200);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
|
1) == 0x400000);
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 0) == 0);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 1) == 0x400000);
|
2) == 0x500000);
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 2) == 0x500000);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 3) == 0x540000);
|
3) == 0x540000);
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 4) == 0x550000);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 5) == 0x554000);
|
4) == 0x550000);
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 6) == 0x555000);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 7) == 0x555400);
|
5) == 0x554000);
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 8) == 0x555600);
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 9) == 0x555800);
|
6) == 0x555000);
|
||||||
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
|
7) == 0x555400);
|
||||||
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
|
8) == 0x555600);
|
||||||
|
static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0,
|
||||||
|
9) == 0x555800);
|
||||||
|
|
||||||
constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height,
|
constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 block_height,
|
||||||
u32 tile_width_spacing, u32 level) {
|
u32 tile_width_spacing, u32 level) {
|
||||||
@ -1221,13 +1231,14 @@ constexpr u32 ValidateLayerSize(PixelFormat format, u32 width, u32 height, u32 b
|
|||||||
return AlignLayerSize(offset, size, block, DefaultBlockHeight(format), tile_width_spacing);
|
return AlignLayerSize(offset, size, block, DefaultBlockHeight(format), tile_width_spacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
static_assert(ValidateLayerSize(P::ASTC_2D_12X12_UNORM, 8192, 4096, 2, 0, 12) == 0x50d800);
|
static_assert(ValidateLayerSize(PixelFormat::ASTC_2D_12X12_UNORM, 8192, 4096, 2, 0, 12) ==
|
||||||
static_assert(ValidateLayerSize(P::A8B8G8R8_UNORM, 1024, 1024, 2, 0, 10) == 0x556000);
|
0x50d800);
|
||||||
static_assert(ValidateLayerSize(P::BC3_UNORM, 128, 128, 2, 0, 8) == 0x6000);
|
static_assert(ValidateLayerSize(PixelFormat::A8B8G8R8_UNORM, 1024, 1024, 2, 0, 10) == 0x556000);
|
||||||
|
static_assert(ValidateLayerSize(PixelFormat::BC3_UNORM, 128, 128, 2, 0, 8) == 0x6000);
|
||||||
|
|
||||||
static_assert(ValidateLayerSize(P::A8B8G8R8_UNORM, 518, 572, 4, 3, 1) == 0x190000,
|
static_assert(ValidateLayerSize(PixelFormat::A8B8G8R8_UNORM, 518, 572, 4, 3, 1) == 0x190000,
|
||||||
"Tile width spacing is not working");
|
"Tile width spacing is not working");
|
||||||
static_assert(ValidateLayerSize(P::BC5_UNORM, 1024, 1024, 3, 4, 11) == 0x160000,
|
static_assert(ValidateLayerSize(PixelFormat::BC5_UNORM, 1024, 1024, 3, 4, 11) == 0x160000,
|
||||||
"Compressed tile width spacing is not working");
|
"Compressed tile width spacing is not working");
|
||||||
|
|
||||||
} // namespace VideoCommon
|
} // namespace VideoCommon
|
||||||
|
@ -39,6 +39,7 @@ vk::DebugUtilsMessenger CreateDebugCallback(const vk::Instance& instance) {
|
|||||||
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
|
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
|
||||||
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
|
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT,
|
||||||
.pfnUserCallback = Callback,
|
.pfnUserCallback = Callback,
|
||||||
|
.pUserData = nullptr,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user