mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-11-04 00:49:02 -06:00 
			
		
		
		
	VideoCore/Shader: Move entry_point to SetupBatch
This commit is contained in:
		@@ -521,9 +521,8 @@ void GraphicsVertexShaderWidget::Reload(bool replace_vertex_data, void* vertex_d
 | 
			
		||||
 | 
			
		||||
    // Generate debug information
 | 
			
		||||
    Pica::Shader::InterpreterEngine shader_engine;
 | 
			
		||||
    shader_engine.SetupBatch(shader_setup);
 | 
			
		||||
    debug_data =
 | 
			
		||||
        shader_engine.ProduceDebugInfo(shader_setup, input_vertex, num_attributes, entry_point);
 | 
			
		||||
    shader_engine.SetupBatch(shader_setup, entry_point);
 | 
			
		||||
    debug_data = shader_engine.ProduceDebugInfo(shader_setup, input_vertex, num_attributes);
 | 
			
		||||
 | 
			
		||||
    // Reload widget state
 | 
			
		||||
    for (int attr = 0; attr < num_attributes; ++attr) {
 | 
			
		||||
 
 | 
			
		||||
@@ -143,7 +143,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
 | 
			
		||||
                    immediate_attribute_id = 0;
 | 
			
		||||
 | 
			
		||||
                    auto* shader_engine = Shader::GetEngine();
 | 
			
		||||
                    shader_engine->SetupBatch(g_state.vs);
 | 
			
		||||
                    shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
 | 
			
		||||
 | 
			
		||||
                    // Send to vertex shader
 | 
			
		||||
                    if (g_debug_context)
 | 
			
		||||
@@ -151,7 +151,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
 | 
			
		||||
                                                 static_cast<void*>(&immediate_input));
 | 
			
		||||
                    Shader::UnitState shader_unit;
 | 
			
		||||
                    shader_unit.LoadInputVertex(immediate_input, regs.vs.num_input_attributes + 1);
 | 
			
		||||
                    shader_engine->Run(g_state.vs, shader_unit, regs.vs.main_offset);
 | 
			
		||||
                    shader_engine->Run(g_state.vs, shader_unit);
 | 
			
		||||
                    auto output_vertex = Shader::OutputVertex::FromRegisters(
 | 
			
		||||
                        shader_unit.registers.output, regs, regs.vs.output_mask);
 | 
			
		||||
 | 
			
		||||
@@ -248,7 +248,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
 | 
			
		||||
        auto* shader_engine = Shader::GetEngine();
 | 
			
		||||
        Shader::UnitState shader_unit;
 | 
			
		||||
 | 
			
		||||
        shader_engine->SetupBatch(g_state.vs);
 | 
			
		||||
        shader_engine->SetupBatch(g_state.vs, regs.vs.main_offset);
 | 
			
		||||
 | 
			
		||||
        for (unsigned int index = 0; index < regs.num_vertices; ++index) {
 | 
			
		||||
            // Indexed rendering doesn't use the start offset
 | 
			
		||||
@@ -288,7 +288,7 @@ static void WritePicaReg(u32 id, u32 value, u32 mask) {
 | 
			
		||||
                    g_debug_context->OnEvent(DebugContext::Event::VertexShaderInvocation,
 | 
			
		||||
                                             (void*)&input);
 | 
			
		||||
                shader_unit.LoadInputVertex(input, loader.GetNumTotalAttributes());
 | 
			
		||||
                shader_engine->Run(g_state.vs, shader_unit, regs.vs.main_offset);
 | 
			
		||||
                shader_engine->Run(g_state.vs, shader_unit);
 | 
			
		||||
 | 
			
		||||
                // Retrieve vertex from register data
 | 
			
		||||
                output_vertex = Shader::OutputVertex::FromRegisters(shader_unit.registers.output,
 | 
			
		||||
 
 | 
			
		||||
@@ -170,6 +170,7 @@ struct ShaderSetup {
 | 
			
		||||
 | 
			
		||||
    /// Data private to ShaderEngines
 | 
			
		||||
    struct EngineData {
 | 
			
		||||
        unsigned int entry_point;
 | 
			
		||||
        /// Used by the JIT, points to a compiled shader object.
 | 
			
		||||
        const void* cached_shader = nullptr;
 | 
			
		||||
    } engine_data;
 | 
			
		||||
@@ -183,7 +184,7 @@ public:
 | 
			
		||||
     * Performs any shader unit setup that only needs to happen once per shader (as opposed to once
 | 
			
		||||
     * per vertex, which would happen within the `Run` function).
 | 
			
		||||
     */
 | 
			
		||||
    virtual void SetupBatch(ShaderSetup& setup) = 0;
 | 
			
		||||
    virtual void SetupBatch(ShaderSetup& setup, unsigned int entry_point) = 0;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Runs the currently setup shader.
 | 
			
		||||
@@ -191,8 +192,7 @@ public:
 | 
			
		||||
     * @param setup Shader engine state, must be setup with SetupBatch on each shader change.
 | 
			
		||||
     * @param state Shader unit state, must be setup with input data before each shader invocation.
 | 
			
		||||
     */
 | 
			
		||||
    virtual void Run(const ShaderSetup& setup, UnitState& state,
 | 
			
		||||
                     unsigned int entry_point) const = 0;
 | 
			
		||||
    virtual void Run(const ShaderSetup& setup, UnitState& state) const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// TODO(yuriks): Remove and make it non-global state somewhere
 | 
			
		||||
 
 | 
			
		||||
@@ -652,32 +652,31 @@ static void RunInterpreter(const ShaderSetup& setup, UnitState& state, DebugData
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void InterpreterEngine::SetupBatch(ShaderSetup& setup) {}
 | 
			
		||||
void InterpreterEngine::SetupBatch(ShaderSetup& setup, unsigned int entry_point) {
 | 
			
		||||
    ASSERT(entry_point < 1024);
 | 
			
		||||
    setup.engine_data.entry_point = entry_point;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
MICROPROFILE_DECLARE(GPU_Shader);
 | 
			
		||||
 | 
			
		||||
void InterpreterEngine::Run(const ShaderSetup& setup, UnitState& state,
 | 
			
		||||
                            unsigned int entry_point) const {
 | 
			
		||||
    ASSERT(entry_point < 1024);
 | 
			
		||||
void InterpreterEngine::Run(const ShaderSetup& setup, UnitState& state) const {
 | 
			
		||||
 | 
			
		||||
    MICROPROFILE_SCOPE(GPU_Shader);
 | 
			
		||||
 | 
			
		||||
    DebugData<false> dummy_debug_data;
 | 
			
		||||
    RunInterpreter(setup, state, dummy_debug_data, entry_point);
 | 
			
		||||
    RunInterpreter(setup, state, dummy_debug_data, setup.engine_data.entry_point);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DebugData<true> InterpreterEngine::ProduceDebugInfo(const ShaderSetup& setup,
 | 
			
		||||
                                                    const InputVertex& input, int num_attributes,
 | 
			
		||||
                                                    unsigned int entry_point) const {
 | 
			
		||||
    ASSERT(entry_point < 1024);
 | 
			
		||||
 | 
			
		||||
                                                    const InputVertex& input,
 | 
			
		||||
                                                    int num_attributes) const {
 | 
			
		||||
    UnitState state;
 | 
			
		||||
    DebugData<true> debug_data;
 | 
			
		||||
 | 
			
		||||
    // Setup input register table
 | 
			
		||||
    boost::fill(state.registers.input, Math::Vec4<float24>::AssignToAll(float24::Zero()));
 | 
			
		||||
    state.LoadInputVertex(input, num_attributes);
 | 
			
		||||
    RunInterpreter(setup, state, debug_data, entry_point);
 | 
			
		||||
    RunInterpreter(setup, state, debug_data, setup.engine_data.entry_point);
 | 
			
		||||
    return debug_data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -13,8 +13,8 @@ namespace Shader {
 | 
			
		||||
 | 
			
		||||
class InterpreterEngine final : public ShaderEngine {
 | 
			
		||||
public:
 | 
			
		||||
    void SetupBatch(ShaderSetup& setup) override;
 | 
			
		||||
    void Run(const ShaderSetup& setup, UnitState& state, unsigned int entry_point) const override;
 | 
			
		||||
    void SetupBatch(ShaderSetup& setup, unsigned int entry_point) override;
 | 
			
		||||
    void Run(const ShaderSetup& setup, UnitState& state) const override;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Produce debug information based on the given shader and input vertex
 | 
			
		||||
@@ -24,7 +24,7 @@ public:
 | 
			
		||||
     * @return Debug information for this shader with regards to the given vertex
 | 
			
		||||
     */
 | 
			
		||||
    DebugData<true> ProduceDebugInfo(const ShaderSetup& setup, const InputVertex& input,
 | 
			
		||||
                                     int num_attributes, unsigned int entry_point) const;
 | 
			
		||||
                                     int num_attributes) const;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
} // namespace
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,10 @@ namespace Shader {
 | 
			
		||||
JitX64Engine::JitX64Engine() = default;
 | 
			
		||||
JitX64Engine::~JitX64Engine() = default;
 | 
			
		||||
 | 
			
		||||
void JitX64Engine::SetupBatch(ShaderSetup& setup) {
 | 
			
		||||
void JitX64Engine::SetupBatch(ShaderSetup& setup, unsigned int entry_point) {
 | 
			
		||||
    ASSERT(entry_point < 1024);
 | 
			
		||||
    setup.engine_data.entry_point = entry_point;
 | 
			
		||||
 | 
			
		||||
    u64 code_hash = Common::ComputeHash64(&setup.program_code, sizeof(setup.program_code));
 | 
			
		||||
    u64 swizzle_hash = Common::ComputeHash64(&setup.swizzle_data, sizeof(setup.swizzle_data));
 | 
			
		||||
 | 
			
		||||
@@ -32,14 +35,13 @@ void JitX64Engine::SetupBatch(ShaderSetup& setup) {
 | 
			
		||||
 | 
			
		||||
MICROPROFILE_DECLARE(GPU_Shader);
 | 
			
		||||
 | 
			
		||||
void JitX64Engine::Run(const ShaderSetup& setup, UnitState& state, unsigned int entry_point) const {
 | 
			
		||||
void JitX64Engine::Run(const ShaderSetup& setup, UnitState& state) const {
 | 
			
		||||
    ASSERT(setup.engine_data.cached_shader != nullptr);
 | 
			
		||||
    ASSERT(entry_point < 1024);
 | 
			
		||||
 | 
			
		||||
    MICROPROFILE_SCOPE(GPU_Shader);
 | 
			
		||||
 | 
			
		||||
    const JitShader* shader = static_cast<const JitShader*>(setup.engine_data.cached_shader);
 | 
			
		||||
    shader->Run(setup, state, entry_point);
 | 
			
		||||
    shader->Run(setup, state, setup.engine_data.entry_point);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namespace Shader
 | 
			
		||||
 
 | 
			
		||||
@@ -19,8 +19,8 @@ public:
 | 
			
		||||
    JitX64Engine();
 | 
			
		||||
    ~JitX64Engine() override;
 | 
			
		||||
 | 
			
		||||
    void SetupBatch(ShaderSetup& setup) override;
 | 
			
		||||
    void Run(const ShaderSetup& setup, UnitState& state, unsigned int entry_point) const override;
 | 
			
		||||
    void SetupBatch(ShaderSetup& setup, unsigned int entry_point) override;
 | 
			
		||||
    void Run(const ShaderSetup& setup, UnitState& state) const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
    std::unordered_map<u64, std::unique_ptr<JitShader>> cache;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user