mirror of
				https://github.com/dolphin-emu/dolphin.git
				synced 2025-10-25 17:39:09 +00:00 
			
		
		
		
	SPDX standardizes how source code conveys its copyright and licensing information. See https://spdx.github.io/spdx-spec/1-rationale/ . SPDX tags are adopted in many large projects, including things like the Linux kernel.
		
			
				
	
	
		
			83 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
	
		
			3 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
 | |
| //   - 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,
 | |
|   Utility
 | |
| };
 | |
| 
 | |
| struct AbstractPipelineConfig
 | |
| {
 | |
|   const NativeVertexFormat* vertex_format;
 | |
|   const AbstractShader* vertex_shader;
 | |
|   const AbstractShader* geometry_shader;
 | |
|   const AbstractShader* pixel_shader;
 | |
|   RasterizationState rasterization_state;
 | |
|   DepthState depth_state;
 | |
|   BlendingState blending_state;
 | |
|   FramebufferState framebuffer_state;
 | |
| 
 | |
|   AbstractPipelineUsage 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);
 | |
|   }
 | |
|   bool operator!=(const AbstractPipelineConfig& rhs) const { return !operator==(rhs); }
 | |
|   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;
 | |
|   virtual ~AbstractPipeline() = default;
 | |
| 
 | |
|   // "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 {}; }
 | |
| };
 |