early-access version 1375
This commit is contained in:
		| @@ -1,7 +1,7 @@ | ||||
| yuzu emulator early access | ||||
| ============= | ||||
|  | ||||
| This is the source code for early-access 1373. | ||||
| This is the source code for early-access 1375. | ||||
|  | ||||
| ## Legal Notice | ||||
|  | ||||
|   | ||||
| @@ -64,8 +64,10 @@ if (MSVC) | ||||
| else() | ||||
|     add_compile_options( | ||||
|         -Wall | ||||
|         -Werror=array-bounds | ||||
|         -Werror=implicit-fallthrough | ||||
|         -Werror=missing-declarations | ||||
|         -Werror=missing-field-initializers | ||||
|         -Werror=reorder | ||||
|         -Werror=switch | ||||
|         -Werror=uninitialized | ||||
|   | ||||
| @@ -179,22 +179,22 @@ void Maxwell3D::ProcessMethodCall(u32 method, u32 argument, u32 nonshadow_argume | ||||
|         return ProcessMacroBind(argument); | ||||
|     case MAXWELL3D_REG_INDEX(firmware[4]): | ||||
|         return ProcessFirmwareCall4(); | ||||
|     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]): | ||||
|     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[3]): | ||||
|     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[6]): | ||||
|     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[9]): | ||||
|     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[12]): | ||||
|     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[15]): | ||||
|     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) + 2: | ||||
|     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) + 5: | ||||
|     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) + 8: | ||||
|     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) + 11: | ||||
|     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) + 14: | ||||
|     case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15: | ||||
|         return StartCBData(method); | ||||
|     case MAXWELL3D_REG_INDEX(cb_bind[0]): | ||||
|         return ProcessCBBind(0); | ||||
| @@ -286,22 +286,22 @@ void Maxwell3D::CallMultiMethod(u32 method, const u32* base_start, u32 amount, | ||||
|         return; | ||||
|     } | ||||
|     switch (method) { | ||||
|     case MAXWELL3D_REG_INDEX(const_buffer.cb_data[0]): | ||||
|     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[3]): | ||||
|     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[6]): | ||||
|     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[9]): | ||||
|     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[12]): | ||||
|     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[15]): | ||||
|     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) + 2: | ||||
|     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) + 5: | ||||
|     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) + 8: | ||||
|     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) + 11: | ||||
|     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) + 14: | ||||
|     case MAXWELL3D_REG_INDEX(const_buffer.cb_data) + 15: | ||||
|         ProcessCBMultiData(method, base_start, amount); | ||||
|         break; | ||||
|     default: | ||||
| @@ -592,7 +592,7 @@ void Maxwell3D::ProcessCBData(u32 value) { | ||||
| } | ||||
|  | ||||
| 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.id = method - first_cb_data; | ||||
|     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) { | ||||
|             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.id = method - first_cb_data; | ||||
|         cb_data_state.current = method; | ||||
|   | ||||
| @@ -1336,7 +1336,7 @@ public: | ||||
|                     u32 cb_address_high; | ||||
|                     u32 cb_address_low; | ||||
|                     u32 cb_pos; | ||||
|                     u32 cb_data[NumCBData]; | ||||
|                     std::array<u32, NumCBData> cb_data; | ||||
|  | ||||
|                     GPUVAddr BufferAddress() const { | ||||
|                         return static_cast<GPUVAddr>( | ||||
|   | ||||
| @@ -672,7 +672,7 @@ VkFrontFace FrontFace(Maxwell::FrontFace front_face) { | ||||
|     return {}; | ||||
| } | ||||
|  | ||||
| VkCullModeFlags CullFace(Maxwell::CullFace cull_face) { | ||||
| VkCullModeFlagBits CullFace(Maxwell::CullFace cull_face) { | ||||
|     switch (cull_face) { | ||||
|     case Maxwell::CullFace::Front: | ||||
|         return VK_CULL_MODE_FRONT_BIT; | ||||
|   | ||||
| @@ -63,7 +63,7 @@ VkBlendFactor BlendFactor(Maxwell::Blend::Factor factor); | ||||
|  | ||||
| VkFrontFace FrontFace(Maxwell::FrontFace front_face); | ||||
|  | ||||
| VkCullModeFlags CullFace(Maxwell::CullFace cull_face); | ||||
| VkCullModeFlagBits CullFace(Maxwell::CullFace cull_face); | ||||
|  | ||||
| VkComponentSwizzle SwizzleSource(Tegra::Texture::SwizzleSource swizzle); | ||||
|  | ||||
|   | ||||
| @@ -181,6 +181,7 @@ std::vector<vk::ShaderModule> VKGraphicsPipeline::CreateShaderModules( | ||||
|         .pNext = nullptr, | ||||
|         .flags = 0, | ||||
|         .codeSize = 0, | ||||
|         .pCode = nullptr, | ||||
|     }; | ||||
|  | ||||
|     std::vector<vk::ShaderModule> shader_modules; | ||||
| @@ -326,8 +327,8 @@ vk::Pipeline VKGraphicsPipeline::CreatePipeline(const SPIRVProgram& program, | ||||
|         .rasterizerDiscardEnable = | ||||
|             static_cast<VkBool32>(state.rasterize_enable == 0 ? VK_TRUE : VK_FALSE), | ||||
|         .polygonMode = VK_POLYGON_MODE_FILL, | ||||
|         .cullMode = | ||||
|             dynamic.cull_enable ? MaxwellToVK::CullFace(dynamic.CullFace()) : VK_CULL_MODE_NONE, | ||||
|         .cullMode = static_cast<VkCullModeFlags>( | ||||
|             dynamic.cull_enable ? MaxwellToVK::CullFace(dynamic.CullFace()) : VK_CULL_MODE_NONE), | ||||
|         .frontFace = MaxwellToVK::FrontFace(dynamic.FrontFace()), | ||||
|         .depthBiasEnable = state.depth_bias_enable, | ||||
|         .depthBiasConstantFactor = 0.0f, | ||||
|   | ||||
| @@ -60,7 +60,7 @@ struct TextureCacheRuntime { | ||||
|     MemoryAllocator& memory_allocator; | ||||
|     StagingBufferPool& staging_buffer_pool; | ||||
|     BlitImageHelper& blit_image_helper; | ||||
|     std::unordered_map<RenderPassKey, vk::RenderPass> renderpass_cache; | ||||
|     std::unordered_map<RenderPassKey, vk::RenderPass> renderpass_cache{}; | ||||
|  | ||||
|     void Finish(); | ||||
|  | ||||
|   | ||||
| @@ -129,6 +129,15 @@ void AsyncShaders::QueueOpenGLShader(const OpenGL::Device& device, | ||||
|         .compiler_settings = compiler_settings, | ||||
|         .registry = registry, | ||||
|         .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(); | ||||
| } | ||||
| @@ -143,6 +152,15 @@ void AsyncShaders::QueueVulkanShader(Vulkan::VKPipelineCache* pp_cache, | ||||
|     std::unique_lock lock(queue_mutex); | ||||
|     pending_queue.push({ | ||||
|         .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, | ||||
|         .vk_device = &device, | ||||
|         .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(CalculateLevelSize(LevelInfo{{32, 32}, {0, 0, 4}, {1, 1}, 4, 0}, 0) == 0x4000); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::R8_SINT, {1920, 1080, 1}, {0, 2, 0}, 1, 0, 7) == | ||||
|               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(P::ASTC_2D_12X12_UNORM, {8192, 4096}, {0, 2}, 1, 0, 12) == | ||||
|               0x50d200); | ||||
|  | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 0) == 0); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 1) == 0x400000); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 2) == 0x500000); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 3) == 0x540000); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 4) == 0x550000); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 5) == 0x554000); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 6) == 0x555000); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 7) == 0x555400); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 8) == 0x555600); | ||||
| static_assert(CalculateLevelOffset(P::A8B8G8R8_UNORM, {1024, 1024}, {0, 4}, 1, 0, 9) == 0x555800); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    0) == 0); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    1) == 0x400000); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    2) == 0x500000); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    3) == 0x540000); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    4) == 0x550000); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    5) == 0x554000); | ||||
| static_assert(CalculateLevelOffset(PixelFormat::A8B8G8R8_UNORM, {1024, 1024, 1}, {0, 4, 0}, 1, 0, | ||||
|                                    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, | ||||
|                                 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); | ||||
| } | ||||
|  | ||||
| static_assert(ValidateLayerSize(P::ASTC_2D_12X12_UNORM, 8192, 4096, 2, 0, 12) == 0x50d800); | ||||
| static_assert(ValidateLayerSize(P::A8B8G8R8_UNORM, 1024, 1024, 2, 0, 10) == 0x556000); | ||||
| static_assert(ValidateLayerSize(P::BC3_UNORM, 128, 128, 2, 0, 8) == 0x6000); | ||||
| static_assert(ValidateLayerSize(PixelFormat::ASTC_2D_12X12_UNORM, 8192, 4096, 2, 0, 12) == | ||||
|               0x50d800); | ||||
| 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"); | ||||
| 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"); | ||||
|  | ||||
| } // 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_PERFORMANCE_BIT_EXT, | ||||
|         .pfnUserCallback = Callback, | ||||
|         .pUserData = nullptr, | ||||
|     }); | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user