185 const std::vector<std::shared_ptr<MetalBindGroupFormat>>& bindGroupFormats,
186 MTL::SamplerState* defaultSampler, MTL::DepthStencilState* defaultDepthStencilState)
193 if (!_shader || !_composePass->vertexBuffer() || !_composePass->vertexFormat() || !_blendState || !_depthState) {
194 spdlog::warn(
"[executeDofBlurPass] missing DOF blur resources");
204 auto pipelineState = pipeline->
get(primitive, _composePass->vertexFormat(),
nullptr, -1, _shader, renderTarget,
206 if (!pipelineState) {
207 spdlog::warn(
"[executeDofBlurPass] failed to get pipeline state");
212 if (!vb || !vb->raw()) {
213 spdlog::warn(
"[executeDofBlurPass] missing vertex buffer");
217 encoder->setRenderPipelineState(pipelineState);
218 encoder->setCullMode(MTL::CullModeNone);
219 encoder->setDepthStencilState(_depthStencilState ? _depthStencilState : defaultDepthStencilState);
220 encoder->setVertexBuffer(vb->raw(), 0, 0);
224 encoder->setFragmentTexture(farHw ? farHw->raw() :
nullptr, 0);
227 encoder->setFragmentTexture(cocHw ? cocHw->raw() :
nullptr, 1);
231 encoder->setFragmentTexture(nearHw ? nearHw->raw() :
nullptr, 2);
234 if (defaultSampler) {
235 encoder->setFragmentSamplerState(defaultSampler, 0);
239 struct alignas(16) DofBlurUniforms
241 float blurRadiusNear;
243 float invResolution[2];
245 int32_t blurRingPoints;
254 encoder->setFragmentBytes(&uniforms,
sizeof(DofBlurUniforms), 5);
256 encoder->drawPrimitives(MTL::PrimitiveTypeTriangle,
static_cast<NS::UInteger
>(0),
257 static_cast<NS::UInteger
>(3));
258 _device->recordDrawCall();
gpu::HardwareTexture * impl() const