forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			96 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			96 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | // Copyright 2017 Dolphin Emulator Project
 | ||
|  | // Licensed under GPLv2+
 | ||
|  | // Refer to the license.txt file included.
 | ||
|  | 
 | ||
|  | #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; | ||
|  | 
 | ||
|  |   union FramebufferState | ||
|  |   { | ||
|  |     BitField<0, 8, AbstractTextureFormat> color_texture_format; | ||
|  |     BitField<8, 8, AbstractTextureFormat> depth_texture_format; | ||
|  |     BitField<16, 8, u32> samples; | ||
|  |     BitField<24, 1, u32> per_sample_shading; | ||
|  | 
 | ||
|  |     bool operator==(const FramebufferState& rhs) const { return hex == rhs.hex; } | ||
|  |     bool operator!=(const FramebufferState& rhs) const { return hex != rhs.hex; } | ||
|  |     FramebufferState& operator=(const FramebufferState& rhs) | ||
|  |     { | ||
|  |       hex = rhs.hex; | ||
|  |       return *this; | ||
|  |     } | ||
|  | 
 | ||
|  |     u32 hex; | ||
|  |   } 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; | ||
|  | }; |