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;
							 | 
						||
| 
								 | 
							
								};
							 |