157 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			157 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#pragma once
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <kinc/global.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <kinc/backend/graphics5/pipeline.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <kinc/graphics5/vertexstructure.h>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "constantlocation.h"
							 | 
						||
| 
								 | 
							
								#include "graphics.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*! \file pipeline.h
							 | 
						||
| 
								 | 
							
								    \brief Provides functions for creating and using pipelines which configure the GPU for rendering.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								extern "C" {
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								struct kinc_g5_shader;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// identical to kinc_g4_blending_factor_t
							 | 
						||
| 
								 | 
							
								typedef enum {
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_ONE,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_ZERO,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_SOURCE_ALPHA,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_DEST_ALPHA,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_INV_SOURCE_ALPHA,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_INV_DEST_ALPHA,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_SOURCE_COLOR,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_DEST_COLOR,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_INV_SOURCE_COLOR,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_INV_DEST_COLOR,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_CONSTANT,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLEND_INV_CONSTANT
							 | 
						||
| 
								 | 
							
								} kinc_g5_blending_factor_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// identical to kinc_g4_blending_operation_t
							 | 
						||
| 
								 | 
							
								typedef enum {
							 | 
						||
| 
								 | 
							
									KINC_G5_BLENDOP_ADD,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLENDOP_SUBTRACT,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLENDOP_REVERSE_SUBTRACT,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLENDOP_MIN,
							 | 
						||
| 
								 | 
							
									KINC_G5_BLENDOP_MAX
							 | 
						||
| 
								 | 
							
								} kinc_g5_blending_operation_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef enum kinc_g5_cull_mode { KINC_G5_CULL_MODE_CLOCKWISE, KINC_G5_CULL_MODE_COUNTERCLOCKWISE, KINC_G5_CULL_MODE_NEVER } kinc_g5_cull_mode_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef enum kinc_g5_compare_mode {
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_ALWAYS,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_NEVER,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_EQUAL,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_NOT_EQUAL,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_LESS,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_LESS_EQUAL,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_GREATER,
							 | 
						||
| 
								 | 
							
									KINC_G5_COMPARE_MODE_GREATER_EQUAL
							 | 
						||
| 
								 | 
							
								} kinc_g5_compare_mode_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef enum kinc_g5_stencil_action {
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_KEEP,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_ZERO,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_REPLACE,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_INCREMENT,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_INCREMENT_WRAP,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_DECREMENT,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_DECREMENT_WRAP,
							 | 
						||
| 
								 | 
							
									KINC_G5_STENCIL_ACTION_INVERT
							 | 
						||
| 
								 | 
							
								} kinc_g5_stencil_action_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								typedef struct kinc_g5_pipeline {
							 | 
						||
| 
								 | 
							
									kinc_g5_vertex_structure_t *inputLayout[16];
							 | 
						||
| 
								 | 
							
									struct kinc_g5_shader *vertexShader;
							 | 
						||
| 
								 | 
							
									struct kinc_g5_shader *fragmentShader;
							 | 
						||
| 
								 | 
							
									struct kinc_g5_shader *geometryShader;
							 | 
						||
| 
								 | 
							
									struct kinc_g5_shader *tessellationControlShader;
							 | 
						||
| 
								 | 
							
									struct kinc_g5_shader *tessellationEvaluationShader;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									kinc_g5_cull_mode_t cullMode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool depthWrite;
							 | 
						||
| 
								 | 
							
									kinc_g5_compare_mode_t depthMode;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									kinc_g5_compare_mode_t stencilMode;
							 | 
						||
| 
								 | 
							
									kinc_g5_stencil_action_t stencilBothPass;
							 | 
						||
| 
								 | 
							
									kinc_g5_stencil_action_t stencilDepthFail;
							 | 
						||
| 
								 | 
							
									kinc_g5_stencil_action_t stencilFail;
							 | 
						||
| 
								 | 
							
									int stencilReferenceValue;
							 | 
						||
| 
								 | 
							
									int stencilReadMask;
							 | 
						||
| 
								 | 
							
									int stencilWriteMask;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									// One, Zero deactivates blending
							 | 
						||
| 
								 | 
							
									kinc_g5_blending_factor_t blend_source;
							 | 
						||
| 
								 | 
							
									kinc_g5_blending_factor_t blend_destination;
							 | 
						||
| 
								 | 
							
									kinc_g5_blending_operation_t blend_operation;
							 | 
						||
| 
								 | 
							
									kinc_g5_blending_factor_t alpha_blend_source;
							 | 
						||
| 
								 | 
							
									kinc_g5_blending_factor_t alpha_blend_destination;
							 | 
						||
| 
								 | 
							
									kinc_g5_blending_operation_t alpha_blend_operation;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool colorWriteMaskRed[8]; // Per render target
							 | 
						||
| 
								 | 
							
									bool colorWriteMaskGreen[8];
							 | 
						||
| 
								 | 
							
									bool colorWriteMaskBlue[8];
							 | 
						||
| 
								 | 
							
									bool colorWriteMaskAlpha[8];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int colorAttachmentCount;
							 | 
						||
| 
								 | 
							
									kinc_g5_render_target_format_t colorAttachment[8];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									int depthAttachmentBits;
							 | 
						||
| 
								 | 
							
									int stencilAttachmentBits;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									bool conservativeRasterization;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									PipelineState5Impl impl;
							 | 
						||
| 
								 | 
							
								} kinc_g5_pipeline_t;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Initializes a pipeline.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <param name="state">The pipeline to initialize</param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_g5_pipeline_init(kinc_g5_pipeline_t *pipeline);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								void kinc_g5_internal_pipeline_init(kinc_g5_pipeline_t *pipeline);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Destroys a pipeline.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <param name="pipeline">The pipeline to destroy</param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_g5_pipeline_destroy(kinc_g5_pipeline_t *pipeline);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Compiles a pipeline. After a pipeline has been compiled it is finalized. It cannot be compiled again and further changes to the pipeline are ignored.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <param name="pipeline">The pipeline to compile</param>
							 | 
						||
| 
								 | 
							
								KINC_FUNC void kinc_g5_pipeline_compile(kinc_g5_pipeline_t *pipeline);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifndef KINC_KONG
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Searches for a constant/uniform and returns a constant-location which can be used to change the constant/uniform.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <param name="pipeline">The pipeline to search in</param>
							 | 
						||
| 
								 | 
							
								/// <param name="name">The name of the constant/uniform to find</param>
							 | 
						||
| 
								 | 
							
								/// <returns>The constant-location of the constant/uniform</returns>
							 | 
						||
| 
								 | 
							
								KINC_FUNC kinc_g5_constant_location_t kinc_g5_pipeline_get_constant_location(kinc_g5_pipeline_t *pipeline, const char *name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/// <summary>
							 | 
						||
| 
								 | 
							
								/// Searches for a texture-declaration and returns a texture-unit which can be used to assign a texture.
							 | 
						||
| 
								 | 
							
								/// </summary>
							 | 
						||
| 
								 | 
							
								/// <param name="pipeline">The pipeline to search in</param>
							 | 
						||
| 
								 | 
							
								/// <param name="name">The name of the texture-declaration to search for</param>
							 | 
						||
| 
								 | 
							
								/// <returns>The texture-unit of the texture-declaration</returns>
							 | 
						||
| 
								 | 
							
								KINC_FUNC kinc_g5_texture_unit_t kinc_g5_pipeline_get_texture_unit(kinc_g5_pipeline_t *pipeline, const char *name);
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#ifdef __cplusplus
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								#endif
							 |