forked from eden-emu/eden
		
	dirty_flags: Deduplicate code between OpenGL and Vulkan
This commit is contained in:
		
							parent
							
								
									a8c9550a12
								
							
						
					
					
						commit
						3de883d37b
					
				
					 5 changed files with 73 additions and 77 deletions
				
			
		|  | @ -2,6 +2,7 @@ add_library(video_core STATIC | ||||||
|     buffer_cache/buffer_block.h |     buffer_cache/buffer_block.h | ||||||
|     buffer_cache/buffer_cache.h |     buffer_cache/buffer_cache.h | ||||||
|     buffer_cache/map_interval.h |     buffer_cache/map_interval.h | ||||||
|  |     dirty_flags.cpp | ||||||
|     dirty_flags.h |     dirty_flags.h | ||||||
|     dma_pusher.cpp |     dma_pusher.cpp | ||||||
|     dma_pusher.h |     dma_pusher.h | ||||||
|  |  | ||||||
							
								
								
									
										46
									
								
								src/video_core/dirty_flags.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								src/video_core/dirty_flags.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,46 @@ | ||||||
|  | // Copyright 2019 yuzu Emulator Project
 | ||||||
|  | // Licensed under GPLv2 or any later version
 | ||||||
|  | // Refer to the license.txt file included.
 | ||||||
|  | 
 | ||||||
|  | #include <array> | ||||||
|  | #include <cstddef> | ||||||
|  | 
 | ||||||
|  | #include "common/common_types.h" | ||||||
|  | #include "video_core/dirty_flags.h" | ||||||
|  | 
 | ||||||
|  | #define OFF(field_name) MAXWELL3D_REG_INDEX(field_name) | ||||||
|  | #define NUM(field_name) (sizeof(::Tegra::Engines::Maxwell3D::Regs::field_name) / sizeof(u32)) | ||||||
|  | 
 | ||||||
|  | namespace VideoCommon::Dirty { | ||||||
|  | 
 | ||||||
|  | using Tegra::Engines::Maxwell3D; | ||||||
|  | 
 | ||||||
|  | void SetupCommonOnWriteStores(Tegra::Engines::Maxwell3D::DirtyState::Flags& store) { | ||||||
|  |     store[RenderTargets] = true; | ||||||
|  |     store[ZetaBuffer] = true; | ||||||
|  |     for (std::size_t i = 0; i < Maxwell3D::Regs::NumRenderTargets; ++i) { | ||||||
|  |         store[ColorBuffer0 + i] = true; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetupDirtyRenderTargets(Tegra::Engines::Maxwell3D::DirtyState::Tables& tables) { | ||||||
|  |     static constexpr std::size_t num_per_rt = NUM(rt[0]); | ||||||
|  |     static constexpr std::size_t begin = OFF(rt); | ||||||
|  |     static constexpr std::size_t num = num_per_rt * Maxwell3D::Regs::NumRenderTargets; | ||||||
|  |     for (std::size_t rt = 0; rt < Maxwell3D::Regs::NumRenderTargets; ++rt) { | ||||||
|  |         FillBlock(tables[0], begin + rt * num_per_rt, num_per_rt, ColorBuffer0 + rt); | ||||||
|  |     } | ||||||
|  |     FillBlock(tables[1], begin, num, RenderTargets); | ||||||
|  | 
 | ||||||
|  |     static constexpr std::array zeta_flags{ZetaBuffer, RenderTargets}; | ||||||
|  |     for (std::size_t i = 0; i < std::size(zeta_flags); ++i) { | ||||||
|  |         const u8 flag = zeta_flags[i]; | ||||||
|  |         auto& table = tables[i]; | ||||||
|  |         table[OFF(zeta_enable)] = flag; | ||||||
|  |         table[OFF(zeta_width)] = flag; | ||||||
|  |         table[OFF(zeta_height)] = flag; | ||||||
|  |         FillBlock(table, OFF(zeta), NUM(zeta), flag); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | } // namespace VideoCommon::Dirty
 | ||||||
|  | @ -4,7 +4,12 @@ | ||||||
| 
 | 
 | ||||||
| #pragma once | #pragma once | ||||||
| 
 | 
 | ||||||
|  | #include <algorithm> | ||||||
|  | #include <cstddef> | ||||||
|  | #include <iterator> | ||||||
|  | 
 | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
|  | #include "video_core/engines/maxwell_3d.h" | ||||||
| 
 | 
 | ||||||
| namespace VideoCommon::Dirty { | namespace VideoCommon::Dirty { | ||||||
| 
 | 
 | ||||||
|  | @ -25,4 +30,22 @@ enum : u8 { | ||||||
|     LastCommonEntry, |     LastCommonEntry, | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | template <typename Integer> | ||||||
|  | inline void FillBlock(Tegra::Engines::Maxwell3D::DirtyState::Table& table, std::size_t begin, | ||||||
|  |                       std::size_t num, Integer dirty_index) { | ||||||
|  |     const auto it = std::begin(table) + begin; | ||||||
|  |     std::fill(it, it + num, static_cast<u8>(dirty_index)); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | template <typename Integer1, typename Integer2> | ||||||
|  | inline void FillBlock(Tegra::Engines::Maxwell3D::DirtyState::Tables& tables, std::size_t begin, | ||||||
|  |                       std::size_t num, Integer1 index_a, Integer2 index_b) { | ||||||
|  |     FillBlock(tables[0], begin, num, index_a); | ||||||
|  |     FillBlock(tables[1], begin, num, index_b); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void SetupCommonOnWriteStores(Tegra::Engines::Maxwell3D::DirtyState::Flags& store); | ||||||
|  | 
 | ||||||
|  | void SetupDirtyRenderTargets(Tegra::Engines::Maxwell3D::DirtyState::Tables& tables); | ||||||
|  | 
 | ||||||
| } // namespace VideoCommon::Dirty
 | } // namespace VideoCommon::Dirty
 | ||||||
|  |  | ||||||
|  | @ -26,39 +26,6 @@ using Regs = Maxwell3D::Regs; | ||||||
| using Tables = Maxwell3D::DirtyState::Tables; | using Tables = Maxwell3D::DirtyState::Tables; | ||||||
| using Table = Maxwell3D::DirtyState::Table; | using Table = Maxwell3D::DirtyState::Table; | ||||||
| 
 | 
 | ||||||
| template <typename Integer> |  | ||||||
| void FillBlock(Table& table, std::size_t begin, std::size_t num, Integer dirty_index) { |  | ||||||
|     const auto it = std::begin(table) + begin; |  | ||||||
|     std::fill(it, it + num, static_cast<u8>(dirty_index)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| template <typename Integer1, typename Integer2> |  | ||||||
| void FillBlock(Tables& tables, std::size_t begin, std::size_t num, Integer1 index_a, |  | ||||||
|                Integer2 index_b) { |  | ||||||
|     FillBlock(tables[0], begin, num, index_a); |  | ||||||
|     FillBlock(tables[1], begin, num, index_b); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SetupDirtyRenderTargets(Tables& tables) { |  | ||||||
|     static constexpr std::size_t num_per_rt = NUM(rt[0]); |  | ||||||
|     static constexpr std::size_t begin = OFF(rt); |  | ||||||
|     static constexpr std::size_t num = num_per_rt * Regs::NumRenderTargets; |  | ||||||
|     for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) { |  | ||||||
|         FillBlock(tables[0], begin + rt * num_per_rt, num_per_rt, ColorBuffer0 + rt); |  | ||||||
|     } |  | ||||||
|     FillBlock(tables[1], begin, num, RenderTargets); |  | ||||||
| 
 |  | ||||||
|     static constexpr std::array zeta_flags{ZetaBuffer, RenderTargets}; |  | ||||||
|     for (std::size_t i = 0; i < std::size(zeta_flags); ++i) { |  | ||||||
|         const u8 flag = zeta_flags[i]; |  | ||||||
|         auto& table = tables[i]; |  | ||||||
|         table[OFF(zeta_enable)] = flag; |  | ||||||
|         table[OFF(zeta_width)] = flag; |  | ||||||
|         table[OFF(zeta_height)] = flag; |  | ||||||
|         FillBlock(table, OFF(zeta), NUM(zeta), flag); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SetupDirtyColorMasks(Tables& tables) { | void SetupDirtyColorMasks(Tables& tables) { | ||||||
|     tables[0][OFF(color_mask_common)] = ColorMaskCommon; |     tables[0][OFF(color_mask_common)] = ColorMaskCommon; | ||||||
|     for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) { |     for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) { | ||||||
|  | @ -261,11 +228,7 @@ void StateTracker::Initialize() { | ||||||
|     SetupDirtyMisc(tables); |     SetupDirtyMisc(tables); | ||||||
| 
 | 
 | ||||||
|     auto& store = dirty.on_write_stores; |     auto& store = dirty.on_write_stores; | ||||||
|     store[RenderTargets] = true; |     SetupCommonOnWriteStores(store); | ||||||
|     store[ZetaBuffer] = true; |  | ||||||
|     for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) { |  | ||||||
|         store[ColorBuffer0 + i] = true; |  | ||||||
|     } |  | ||||||
|     store[VertexBuffers] = true; |     store[VertexBuffers] = true; | ||||||
|     for (std::size_t i = 0; i < Regs::NumVertexArrays; ++i) { |     for (std::size_t i = 0; i < Regs::NumVertexArrays; ++i) { | ||||||
|         store[VertexBuffer0 + i] = true; |         store[VertexBuffer0 + i] = true; | ||||||
|  |  | ||||||
|  | @ -8,6 +8,7 @@ | ||||||
| 
 | 
 | ||||||
| #include "common/common_types.h" | #include "common/common_types.h" | ||||||
| #include "core/core.h" | #include "core/core.h" | ||||||
|  | #include "video_core/dirty_flags.h" | ||||||
| #include "video_core/engines/maxwell_3d.h" | #include "video_core/engines/maxwell_3d.h" | ||||||
| #include "video_core/gpu.h" | #include "video_core/gpu.h" | ||||||
| #include "video_core/renderer_vulkan/vk_state_tracker.h" | #include "video_core/renderer_vulkan/vk_state_tracker.h" | ||||||
|  | @ -38,39 +39,6 @@ Flags MakeInvalidationFlags() { | ||||||
|     return flags; |     return flags; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| template <typename Integer> |  | ||||||
| void FillBlock(Table& table, std::size_t begin, std::size_t num, Integer dirty_index) { |  | ||||||
|     const auto it = std::begin(table) + begin; |  | ||||||
|     std::fill(it, it + num, static_cast<u8>(dirty_index)); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| template <typename Integer1, typename Integer2> |  | ||||||
| void FillBlock(Tables& tables, std::size_t begin, std::size_t num, Integer1 index_a, |  | ||||||
|                Integer2 index_b) { |  | ||||||
|     FillBlock(tables[0], begin, num, index_a); |  | ||||||
|     FillBlock(tables[1], begin, num, index_b); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SetupDirtyRenderTargets(Tables& tables) { |  | ||||||
|     static constexpr std::size_t num_per_rt = NUM(rt[0]); |  | ||||||
|     static constexpr std::size_t begin = OFF(rt); |  | ||||||
|     static constexpr std::size_t num = num_per_rt * Regs::NumRenderTargets; |  | ||||||
|     for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) { |  | ||||||
|         FillBlock(tables[0], begin + rt * num_per_rt, num_per_rt, ColorBuffer0 + rt); |  | ||||||
|     } |  | ||||||
|     FillBlock(tables[1], begin, num, RenderTargets); |  | ||||||
| 
 |  | ||||||
|     static constexpr std::array zeta_flags{ZetaBuffer, RenderTargets}; |  | ||||||
|     for (std::size_t i = 0; i < std::size(zeta_flags); ++i) { |  | ||||||
|         const u8 flag = zeta_flags[i]; |  | ||||||
|         auto& table = tables[i]; |  | ||||||
|         table[OFF(zeta_enable)] = flag; |  | ||||||
|         table[OFF(zeta_width)] = flag; |  | ||||||
|         table[OFF(zeta_height)] = flag; |  | ||||||
|         FillBlock(table, OFF(zeta), NUM(zeta), flag); |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void SetupDirtyViewports(Tables& tables) { | void SetupDirtyViewports(Tables& tables) { | ||||||
|     FillBlock(tables[0], OFF(viewport_transform), NUM(viewport_transform), Viewports); |     FillBlock(tables[0], OFF(viewport_transform), NUM(viewport_transform), Viewports); | ||||||
|     FillBlock(tables[0], OFF(viewports), NUM(viewports), Viewports); |     FillBlock(tables[0], OFF(viewports), NUM(viewports), Viewports); | ||||||
|  | @ -123,12 +91,7 @@ void StateTracker::Initialize() { | ||||||
|     SetupDirtyDepthBounds(tables); |     SetupDirtyDepthBounds(tables); | ||||||
|     SetupDirtyStencilProperties(tables); |     SetupDirtyStencilProperties(tables); | ||||||
| 
 | 
 | ||||||
|     auto& store = dirty.on_write_stores; |     SetupCommonOnWriteStores(dirty.on_write_stores); | ||||||
|     store[RenderTargets] = true; |  | ||||||
|     store[ZetaBuffer] = true; |  | ||||||
|     for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) { |  | ||||||
|         store[ColorBuffer0 + i] = true; |  | ||||||
|     } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void StateTracker::InvalidateCommandBufferState() { | void StateTracker::InvalidateCommandBufferState() { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 ReinUsesLisp
						ReinUsesLisp