| 372 | }); |
| 373 | } |
| 374 | void SkrRenderWindow::_render() |
| 375 | { |
| 376 | auto rg = _owner->render_graph(); |
| 377 | auto target = _back_buffer; |
| 378 | auto depth = _depth_buffer; |
| 379 | |
| 380 | // TODO. multi pass |
| 381 | rg->add_render_pass( |
| 382 | [&](render_graph::RenderGraph& g, render_graph::RenderPassBuilder& builder) { |
| 383 | SkrZoneScopedN("ConstructRenderPass"); |
| 384 | const auto back_desc = g.resolve_descriptor(target); |
| 385 | builder.set_name(u8"gui_render_pass") |
| 386 | .use_buffer(_vertex_buffer, CGPU_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER) |
| 387 | .use_buffer(_transform_buffer, CGPU_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER) |
| 388 | .use_buffer(_projection_buffer, CGPU_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER) |
| 389 | .use_buffer(_render_data_buffer, CGPU_RESOURCE_STATE_VERTEX_AND_CONSTANT_BUFFER) |
| 390 | .use_buffer(_index_buffer, CGPU_RESOURCE_STATE_INDEX_BUFFER) |
| 391 | .set_depth_stencil(depth.clear_depth(1.f)) |
| 392 | .write(0, target, CGPU_LOAD_ACTION_CLEAR); |
| 393 | if (back_desc->sample_count > 1) |
| 394 | { |
| 395 | skr::render_graph::TextureHandle real_target = rg->get_texture(u8"presentbuffer"); |
| 396 | builder.resolve_msaa(0, real_target); |
| 397 | } }, |
| 398 | [this, target](render_graph::RenderGraph& g, render_graph::RenderPassContext& ctx) { |
| 399 | SkrZoneScopedN("GUI-RenderPass"); |
| 400 | const auto target_desc = g.resolve_descriptor(target); |
| 401 | auto resolved_ib = ctx.resolve(_index_buffer); |
| 402 | auto resolved_vb = ctx.resolve(_vertex_buffer); |
| 403 | auto resolved_tb = ctx.resolve(_transform_buffer); |
| 404 | auto resolved_pb = ctx.resolve(_projection_buffer); |
| 405 | auto resolved_rdata = ctx.resolve(_render_data_buffer); |
| 406 | CGPUBufferId vertex_streams[4] = { resolved_vb, resolved_tb, resolved_pb, resolved_rdata }; |
| 407 | const uint32_t vertex_stream_strides[4] = { sizeof(PaintVertex), sizeof(rtm::matrix4x4f), sizeof(rtm::matrix4x4f), sizeof(skr_float4x4_t) }; |
| 408 | |
| 409 | cgpu_render_encoder_set_viewport(ctx.encoder, |
| 410 | 0.0f, 0.0f, |
| 411 | (float)target_desc->width, |
| 412 | (float)target_desc->height, |
| 413 | 0.f, 1.f); |
| 414 | cgpu_render_encoder_set_scissor(ctx.encoder, |
| 415 | 0, 0, |
| 416 | (uint32_t)target_desc->width, |
| 417 | (uint32_t)target_desc->height); |
| 418 | |
| 419 | SkrPipelineKey pipeline_key_cache = { ESkrPipelineFlag::__Count, CGPU_SAMPLE_COUNT_1 }; |
| 420 | |
| 421 | for (const auto& cmd : _commands) |
| 422 | { |
| 423 | const bool use_texture = cmd.texture && cmd.texture->state() == skr::gui::EResourceState::Okey; |
| 424 | SkrPipelineKey key = { cmd.pipeline_flags, target_desc->sample_count }; |
| 425 | if (pipeline_key_cache != key) |
| 426 | { |
| 427 | CGPURenderPipelineId this_pipeline = _owner->get_pipeline(key.flags, key.sample_count); |
| 428 | cgpu_render_encoder_bind_pipeline(ctx.encoder, this_pipeline); |
| 429 | pipeline_key_cache = key; |
| 430 | } |
| 431 |
nothing calls this directly
no test coverage detected