#include "BlendingPipelineManagementContext.h" #include "../PrimitivesBuilder/PipelineBuilder.h" #include "../PrimitivesBuilder/VertexInputStateBuilder.h" #include "../Assets.h" std::unordered_map BlendingPipelineManagementContext::Pipelines; GraphicsPipeline* BlendingPipelineManagementContext::createPipeline(Blendmode blendmode) { auto* vertShader = new Shader(Assets::Path("shaders/CanvasRenderingTarget.vert.spirv"), "main", 0, 0, 0, 0); auto* fragShader = new Shader(Assets::Path("shaders/CanvasRenderingTarget.frag.spirv"), "main", 1, 0, 0, 1); SDL_GPUColorTargetBlendState blendState = {}; blendState.enable_blend = true; switch (blendmode) { default: case NORMAL: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case ADDITIVE: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; break; case SUBTRACT: blendState.alpha_blend_op = SDL_GPU_BLENDOP_SUBTRACT; blendState.color_blend_op = SDL_GPU_BLENDOP_SUBTRACT; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; break; case MULTIPLY: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_DST_COLOR; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ZERO; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case SCREEN: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case DARKEN: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ZERO; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case LIGHTEN: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; case LINEAR_DODGE: blendState.alpha_blend_op = SDL_GPU_BLENDOP_ADD; blendState.color_blend_op = SDL_GPU_BLENDOP_ADD; blendState.src_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.src_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE; blendState.dst_alpha_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; blendState.dst_color_blendfactor = SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA; break; } auto vertexInputState = VertexInputStateBuilder() .AddAttribute(0, SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2) .AddAttribute(1, SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2) .BuildDeferred(); GraphicsPipeline* pipeline = PipelineBuilder() .Shaders(vertShader, fragShader) .Blend(blendState) .Format(SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM) .Vertex(vertexInputState.Use()) .Primitive(SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP) .Build(); Pipelines[blendmode] = pipeline; return pipeline; } GraphicsPipeline* BlendingPipelineManagementContext::GetPipeline(Blendmode blendmode) { if (Pipelines.find(blendmode) != Pipelines.end()) return Pipelines[blendmode]; return createPipeline(blendmode); }