mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-03 16:39:01 -06:00 
			
		
		
		
	dirty_flags: Deduplicate code between OpenGL and Vulkan
This commit is contained in:
		@@ -2,6 +2,7 @@ add_library(video_core STATIC
 | 
			
		||||
    buffer_cache/buffer_block.h
 | 
			
		||||
    buffer_cache/buffer_cache.h
 | 
			
		||||
    buffer_cache/map_interval.h
 | 
			
		||||
    dirty_flags.cpp
 | 
			
		||||
    dirty_flags.h
 | 
			
		||||
    dma_pusher.cpp
 | 
			
		||||
    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
 | 
			
		||||
 | 
			
		||||
#include <algorithm>
 | 
			
		||||
#include <cstddef>
 | 
			
		||||
#include <iterator>
 | 
			
		||||
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "video_core/engines/maxwell_3d.h"
 | 
			
		||||
 | 
			
		||||
namespace VideoCommon::Dirty {
 | 
			
		||||
 | 
			
		||||
@@ -25,4 +30,22 @@ enum : u8 {
 | 
			
		||||
    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
 | 
			
		||||
 
 | 
			
		||||
@@ -26,39 +26,6 @@ using Regs = Maxwell3D::Regs;
 | 
			
		||||
using Tables = Maxwell3D::DirtyState::Tables;
 | 
			
		||||
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) {
 | 
			
		||||
    tables[0][OFF(color_mask_common)] = ColorMaskCommon;
 | 
			
		||||
    for (std::size_t rt = 0; rt < Regs::NumRenderTargets; ++rt) {
 | 
			
		||||
@@ -261,11 +228,7 @@ void StateTracker::Initialize() {
 | 
			
		||||
    SetupDirtyMisc(tables);
 | 
			
		||||
 | 
			
		||||
    auto& store = dirty.on_write_stores;
 | 
			
		||||
    store[RenderTargets] = true;
 | 
			
		||||
    store[ZetaBuffer] = true;
 | 
			
		||||
    for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
 | 
			
		||||
        store[ColorBuffer0 + i] = true;
 | 
			
		||||
    }
 | 
			
		||||
    SetupCommonOnWriteStores(store);
 | 
			
		||||
    store[VertexBuffers] = true;
 | 
			
		||||
    for (std::size_t i = 0; i < Regs::NumVertexArrays; ++i) {
 | 
			
		||||
        store[VertexBuffer0 + i] = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,7 @@
 | 
			
		||||
 | 
			
		||||
#include "common/common_types.h"
 | 
			
		||||
#include "core/core.h"
 | 
			
		||||
#include "video_core/dirty_flags.h"
 | 
			
		||||
#include "video_core/engines/maxwell_3d.h"
 | 
			
		||||
#include "video_core/gpu.h"
 | 
			
		||||
#include "video_core/renderer_vulkan/vk_state_tracker.h"
 | 
			
		||||
@@ -38,39 +39,6 @@ Flags MakeInvalidationFlags() {
 | 
			
		||||
    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) {
 | 
			
		||||
    FillBlock(tables[0], OFF(viewport_transform), NUM(viewport_transform), Viewports);
 | 
			
		||||
    FillBlock(tables[0], OFF(viewports), NUM(viewports), Viewports);
 | 
			
		||||
@@ -123,12 +91,7 @@ void StateTracker::Initialize() {
 | 
			
		||||
    SetupDirtyDepthBounds(tables);
 | 
			
		||||
    SetupDirtyStencilProperties(tables);
 | 
			
		||||
 | 
			
		||||
    auto& store = dirty.on_write_stores;
 | 
			
		||||
    store[RenderTargets] = true;
 | 
			
		||||
    store[ZetaBuffer] = true;
 | 
			
		||||
    for (std::size_t i = 0; i < Regs::NumRenderTargets; ++i) {
 | 
			
		||||
        store[ColorBuffer0 + i] = true;
 | 
			
		||||
    }
 | 
			
		||||
    SetupCommonOnWriteStores(dirty.on_write_stores);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void StateTracker::InvalidateCommandBufferState() {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user