51 const std::string &name =
descriptor.getName();
55 wgpu::RenderPipelineDescriptor pipelineDescriptor(
wgpu::Default);
56 const std::string pipelineLabel = fmt::format(
"{} Render Pipeline", name);
60 pipelineDescriptor.vertex.bufferCount = vertexBufferLayouts.size();
61 pipelineDescriptor.vertex.buffers = vertexBufferLayouts.data();
62 pipelineDescriptor.vertex.module = shaderModule;
66 std::vector<wgpu::ColorTargetState> colorTargets;
67 colorTargets.reserve(
descriptor.getOutputColorFormats().size());
68 for (
const auto &format :
descriptor.getOutputColorFormats())
71 colorTarget.format = format.getFormat();
72 colorTarget.writeMask = wgpu::ColorWriteMask::All;
73 colorTarget.blend = &format.getBlendState();
74 colorTargets.emplace_back(colorTarget);
76 fragmentState.module = shaderModule;
78 fragmentState.targetCount = colorTargets.size();
79 fragmentState.targets = colorTargets.data();
80 pipelineDescriptor.fragment = &fragmentState;
82 wgpu::PipelineLayoutDescriptor pipelineLayoutDescriptor(
wgpu::Default);
83 const std::string pipelineLayoutLabel = fmt::format(
"{} Pipeline Layout", name);
85 std::vector<WGPUBindGroupLayout> bindGroupLayouts;
86 for (
const auto &layout :
descriptor.getBindGroupLayouts())
88 std::vector<WGPUBindGroupLayoutEntry> entries;
89 for (
const auto &entry : layout.getEntries())
91 entries.push_back(entry->getEntry());
93 wgpu::BindGroupLayoutDescriptor bindGroupLayoutDescriptor(
wgpu::Default);
94 const std::string layoutLabel = fmt::format(
"{}::{}", name, layout.getName());
96 bindGroupLayoutDescriptor.entryCount = entries.size();
97 bindGroupLayoutDescriptor.entries = entries.data();
98 bindGroupLayouts.push_back(device.createBindGroupLayout(bindGroupLayoutDescriptor));
100 pipelineLayoutDescriptor.bindGroupLayoutCount = bindGroupLayouts.size();
101 pipelineLayoutDescriptor.bindGroupLayouts = bindGroupLayouts.data();
102 pipelineDescriptor.layout = device.createPipelineLayout(pipelineLayoutDescriptor);
104 if (
descriptor.getOutputDepthFormat().has_value())
105 pipelineDescriptor.depthStencil = &
descriptor.getOutputDepthFormat()->getValue();
107 pipelineDescriptor.depthStencil =
nullptr;
109 pipelineDescriptor.primitive.topology =
descriptor.getPrimitiveTopology();
110 pipelineDescriptor.primitive.cullMode =
descriptor.getCullMode();
111 pipelineDescriptor.primitive.frontFace = wgpu::FrontFace::CW;
113 shader.
pipeline = device.createRenderPipeline(pipelineDescriptor);
115 shaderModule.release();
116 wgpu::PipelineLayout(pipelineDescriptor.layout).release();
117 for (
auto layout : bindGroupLayouts)
119 wgpu::BindGroupLayout(layout).release();
151 std::vector<wgpu::VertexBufferLayout> layouts;
152 for (
const auto &layout :
descriptor.getVertexBufferLayouts())
155 vertexBufferLayout.arrayStride = layout.getArrayStride();
156 vertexBufferLayout.stepMode = layout.getStepMode();
157 vertexBufferLayout.attributeCount = layout.getVertexAttributes().size();
158 vertexBufferLayout.attributes = layout.getVertexAttributes().data();
159 layouts.push_back(vertexBufferLayout);