sKit  0.0.9
PipelineBuilder.cpp
Go to the documentation of this file.
1 #include "PipelineBuilder.hpp"
2 
3 #include <iostream>
4 #include <stdexcept>
5 
6 namespace sKit {
7 namespace SDL {
8 
10  SDL_GPUShader* vertexShader,
11  SDL_GPUShader* fragmentShader
12 ) -> PipelineBuilder& {
13  vs_ = vertexShader;
14  fs_ = fragmentShader;
15  return *this;
16 }
17 
19  Uint32 slot,
20  Uint32 stride,
21  SDL_GPUVertexInputRate inputRate
22 ) -> PipelineBuilder& {
23  bufferDescs_.emplace_back(SDL_GPUVertexBufferDescription {
24  .slot = slot, .pitch = stride, .input_rate = inputRate
25  });
26  return *this;
27 }
28 
30  Uint32 location,
31  Uint32 bufferSlot,
32  Uint32 offset,
33  SDL_GPUVertexElementFormat format
34 ) -> PipelineBuilder& {
35  vertexAttribs_.emplace_back(SDL_GPUVertexAttribute {
36  .location = location,
37  .buffer_slot = bufferSlot,
38  .format = format,
39  .offset = offset,
40  });
41  return *this;
42 }
43 
44 auto PipelineBuilder::addColorTarget(SDL_GPUTextureFormat format)
45  -> PipelineBuilder& {
46  SDL_GPUColorTargetDescription colorDesc {.format = format};
47  colorTargetDescs_.push_back(colorDesc);
48  return *this;
49 }
50 
51 auto PipelineBuilder::cullMode(SDL_GPUCullMode cullMode) -> PipelineBuilder& {
52  cullMode_ = cullMode;
53  return *this;
54 };
55 
56 auto PipelineBuilder::build(SDL_GPUDevice* device) -> SDL_GPUGraphicsPipeline* {
57  if (colorTargetDescs_.empty()) {
58  std::cerr << "Warning: no color target specified during pipeline creation"
59  << std::endl;
60  }
61 
62  SDL_GPUVertexInputState vertexState {
63  .vertex_buffer_descriptions = bufferDescs_.data(),
64  .num_vertex_buffers = static_cast<Uint32>(bufferDescs_.size()),
65  .vertex_attributes = vertexAttribs_.data(),
66  .num_vertex_attributes = static_cast<Uint32>(vertexAttribs_.size())
67  };
68  SDL_GPURasterizerState rasterizerState {
69  .cull_mode = cullMode_, .front_face = frontFace_
70  };
71  SDL_GPUGraphicsPipelineCreateInfo info {
72  .vertex_shader = vs_,
73  .fragment_shader = fs_,
74  .vertex_input_state = vertexState,
75  .primitive_type = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
76  .rasterizer_state = rasterizerState,
77  .target_info =
78  {.color_target_descriptions = colorTargetDescs_.data(),
79  .num_color_targets = static_cast<Uint32>(colorTargetDescs_.size())}
80  };
81  if (auto pl = SDL_CreateGPUGraphicsPipeline(device, &info)) {
82  return pl;
83  } else {
84  throw std::runtime_error(SDL_GetError());
85  }
86 }
87 
88 } // namespace SDL
89 } // namespace sKit
sKit::SDL::PipelineBuilder::addBuffer
auto addBuffer(Uint32 slot, Uint32 stride, SDL_GPUVertexInputRate inputRate=SDL_GPU_VERTEXINPUTRATE_VERTEX) -> PipelineBuilder &
Definition: PipelineBuilder.cpp:18
PipelineBuilder.hpp
sKit::SDL::PipelineBuilder::build
auto build(SDL_GPUDevice *device) -> SDL_GPUGraphicsPipeline *
Definition: PipelineBuilder.cpp:56
sKit::SDL::PipelineBuilder::shaders
auto shaders(SDL_GPUShader *vertexShader, SDL_GPUShader *fragmentShader) -> PipelineBuilder &
Tells the builder which shaders it should use to create the pipeline.
Definition: PipelineBuilder.cpp:9
sKit::SDL::PipelineBuilder
SDL_GPUGraphicsPipeline builder class
Definition: PipelineBuilder.hpp:20
sKit
Definition: camera.hpp:8
sKit::SDL::PipelineBuilder::addColorTarget
auto addColorTarget(SDL_GPUTextureFormat format) -> PipelineBuilder &
Definition: PipelineBuilder.cpp:44
sKit::SDL::PipelineBuilder::addAttribute
auto addAttribute(Uint32 location, Uint32 bufferSlot, Uint32 offset=0, SDL_GPUVertexElementFormat format=SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3) -> PipelineBuilder &
Definition: PipelineBuilder.cpp:29
sKit::SDL::PipelineBuilder::cullMode
auto cullMode(SDL_GPUCullMode cullMode) -> PipelineBuilder &
Definition: PipelineBuilder.cpp:51