dolphin/Source/Core/VideoCommon/AbstractPipeline.h

89 lines
3.2 KiB
C++

// Copyright 2017 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <cstddef>
#include <string>
#include <utility>
#include <vector>
#include "Common/CommonTypes.h"
#include "VideoCommon/RenderState.h"
#include "VideoCommon/TextureConfig.h"
class AbstractShader;
class NativeVertexFormat;
// We use three pipeline usages:
// - GX
// - Per-stage UBO (VS/GS/PS, VS constants accessible from PS)
// - 8 combined image samplers (accessible from PS)
// - 1 SSBO, accessible from PS if bounding box is enabled
// - GX Uber
// - Same as GX, plus one VS SSBO for vertices if dynamic vertex loading is enabled
// - Utility
// - Single UBO, accessible from all stages [set=0, binding=1]
// - 8 combined image samplers (accessible from PS) [set=1, binding=0-7]
// - 1 texel buffer, accessible from PS [set=2, binding=0]
// - Compute
// - 1 uniform buffer [set=0, binding=1]
// - 8 combined image samplers [set=1, binding=0-7]
// - 1 texel buffer [set=2, binding=0]
// - 1 storage image [set=3, binding=0]
enum class AbstractPipelineUsage
{
GX,
GXUber,
Utility
};
struct AbstractPipelineConfig
{
const NativeVertexFormat* vertex_format = nullptr;
const AbstractShader* vertex_shader = nullptr;
const AbstractShader* geometry_shader = nullptr;
const AbstractShader* pixel_shader = nullptr;
RasterizationState rasterization_state;
DepthState depth_state;
BlendingState blending_state;
FramebufferState framebuffer_state;
AbstractPipelineUsage usage = AbstractPipelineUsage::GX;
bool operator==(const AbstractPipelineConfig& rhs) const
{
return std::tie(vertex_format, vertex_shader, geometry_shader, pixel_shader,
rasterization_state.hex, depth_state.hex, blending_state.hex,
framebuffer_state.hex, usage) ==
std::tie(rhs.vertex_format, rhs.vertex_shader, rhs.geometry_shader, rhs.pixel_shader,
rhs.rasterization_state.hex, rhs.depth_state.hex, rhs.blending_state.hex,
rhs.framebuffer_state.hex, rhs.usage);
}
bool operator<(const AbstractPipelineConfig& rhs) const
{
return std::tie(vertex_format, vertex_shader, geometry_shader, pixel_shader,
rasterization_state.hex, depth_state.hex, blending_state.hex,
framebuffer_state.hex, usage) <
std::tie(rhs.vertex_format, rhs.vertex_shader, rhs.geometry_shader, rhs.pixel_shader,
rhs.rasterization_state.hex, rhs.depth_state.hex, rhs.blending_state.hex,
rhs.framebuffer_state.hex, rhs.usage);
}
};
class AbstractPipeline
{
public:
AbstractPipeline() = default;
explicit AbstractPipeline(const AbstractPipelineConfig& config) : m_config(config) {}
virtual ~AbstractPipeline() = default;
AbstractPipelineConfig m_config;
// "Cache data" can be used to assist a driver with creating pipelines by using previously
// compiled shader ISA. The abstract shaders and creation struct are still required to create
// pipeline objects, the cache is optionally used by the driver to speed up compilation.
using CacheData = std::vector<u8>;
virtual CacheData GetCacheData() const { return {}; }
};