| 141 | } |
| 142 | |
| 143 | void RenderPassForward::execute(const skr_primitive_pass_context_t* context, skr::span<const skr_primitive_draw_packet_t> drawcalls) |
| 144 | { |
| 145 | auto renderGraph = context->render_graph; |
| 146 | // TODO: multi-viewport |
| 147 | auto viewport_manager = context->renderer->get_viewport_manager(); |
| 148 | auto viewport = viewport_manager->find_viewport(0u); // the main viewport |
| 149 | |
| 150 | auto depth = renderGraph->create_texture( |
| 151 | [=](skr::render_graph::RenderGraph& g, skr::render_graph::TextureBuilder& builder) { |
| 152 | builder.set_name(SKR_UTF8("depth")) |
| 153 | .extent(viewport->viewport_width, viewport->viewport_height) |
| 154 | .format(depth_format) |
| 155 | .allow_depth_stencil(); |
| 156 | if (viewport->viewport_width > 2048) builder.allocate_dedicated(); |
| 157 | }); |
| 158 | (void)depth; |
| 159 | if (!drawcalls.size()) return; |
| 160 | |
| 161 | // 1.IMGUI control shading rate |
| 162 | const char8_t* shadingRateNames[] = { |
| 163 | u8"1x1", u8"2x2", u8"4x4", |
| 164 | u8"1x2", u8"2x1", u8"2x4", u8"4x2" |
| 165 | }; |
| 166 | const auto ButtonText = skr::format(u8"SwitchShadingRate-{}", shadingRateNames[shading_rate]); |
| 167 | ImGui::Begin("ShadingRate"); |
| 168 | if (ImGui::Button(ButtonText.c_str())) |
| 169 | { |
| 170 | if (shading_rate != CGPU_SHADING_RATE_COUNT - 1) |
| 171 | shading_rate = (ECGPUShadingRate)(shading_rate + 1); |
| 172 | else |
| 173 | shading_rate = CGPU_SHADING_RATE_FULL; |
| 174 | } |
| 175 | ImGui::End(); |
| 176 | |
| 177 | // 2.add a render graph buffer for forward cbuffer |
| 178 | auto cbuffer = renderGraph->create_buffer( |
| 179 | [=](skr::render_graph::RenderGraph& g, skr::render_graph::BufferBuilder& builder) { |
| 180 | builder.set_name(SKR_UTF8("forward_cbuffer")) |
| 181 | .size(sizeof(skr_float4x4_t)) |
| 182 | .memory_usage(CGPU_MEM_USAGE_CPU_TO_GPU) |
| 183 | .with_flags(CGPU_BCF_PERSISTENT_MAP_BIT) |
| 184 | .with_tags(kRenderGraphDynamicResourceTag) |
| 185 | .prefer_on_device() |
| 186 | .as_uniform_buffer(); |
| 187 | }); |
| 188 | |
| 189 | // 3.barrier skin vbs |
| 190 | renderGraph->add_copy_pass( |
| 191 | [=](skr::render_graph::RenderGraph& g, skr::render_graph::CopyPassBuilder& builder) { |
| 192 | builder.set_name(SKR_UTF8("BarrierSkinVertexBuffers")) |
| 193 | .can_be_lone(); |
| 194 | }, |
| 195 | [=, this](skr::render_graph::RenderGraph& g, skr::render_graph::CopyPassContext& context) { |
| 196 | SkrZoneScopedN("BarrierSkinMeshes"); |
| 197 | CGPUResourceBarrierDescriptor barrier_desc = {}; |
| 198 | skr::stl_vector<CGPUBufferBarrier> barriers; |
| 199 | auto barrierVertices = [&](sugoi_chunk_view_t* r_cv) { |
| 200 | const skr::anim::AnimComponent* anims = nullptr; |
no test coverage detected