init & shutdown
| 56 | { |
| 57 | // init & shutdown |
| 58 | void SkrRenderDevice::init() |
| 59 | { |
| 60 | // create instance |
| 61 | auto instance_desc = make_zeroed<CGPUInstanceDescriptor>(); |
| 62 | instance_desc.backend = kSKR_GUI_DEFAULT_RENDER_BACKEND; |
| 63 | instance_desc.enable_debug_layer = true; |
| 64 | instance_desc.enable_gpu_based_validation = true; |
| 65 | instance_desc.enable_set_name = true; |
| 66 | _cgpu_instance = cgpu_create_instance(&instance_desc); |
| 67 | |
| 68 | // filter adapters |
| 69 | uint32_t adapters_count = 0; |
| 70 | cgpu_enum_adapters(_cgpu_instance, CGPU_NULLPTR, &adapters_count); |
| 71 | CGPUAdapterId adapters[64]; |
| 72 | cgpu_enum_adapters(_cgpu_instance, adapters, &adapters_count); |
| 73 | _cgpu_adapter = adapters[0]; |
| 74 | |
| 75 | // create device & queue |
| 76 | auto queue_group_desc = make_zeroed<CGPUQueueGroupDescriptor>(); |
| 77 | queue_group_desc.queue_type = CGPU_QUEUE_TYPE_GRAPHICS; |
| 78 | queue_group_desc.queue_count = 1; |
| 79 | auto device_desc = make_zeroed<CGPUDeviceDescriptor>(); |
| 80 | device_desc.queue_groups = &queue_group_desc; |
| 81 | device_desc.queue_group_count = 1; |
| 82 | _cgpu_device = cgpu_create_device(_cgpu_adapter, &device_desc); |
| 83 | _cgpu_queue = cgpu_get_queue(_cgpu_device, CGPU_QUEUE_TYPE_GRAPHICS, 0); |
| 84 | |
| 85 | // create rg |
| 86 | _render_graph = RenderGraph::create( |
| 87 | [=, this](render_graph::RenderGraphBuilder& b) { |
| 88 | b.with_device(_cgpu_device) |
| 89 | .with_gfx_queue(_cgpu_queue); |
| 90 | }); |
| 91 | |
| 92 | // init vertex layout |
| 93 | const uint32_t pos_offset = static_cast<uint32_t>(offsetof(PaintVertex, position)); |
| 94 | const uint32_t texcoord_offset = static_cast<uint32_t>(offsetof(PaintVertex, texcoord)); |
| 95 | const uint32_t aa_offset = static_cast<uint32_t>(offsetof(PaintVertex, aa)); |
| 96 | const uint32_t uv_offset = static_cast<uint32_t>(offsetof(PaintVertex, clipUV)); |
| 97 | const uint32_t uv2_offset = static_cast<uint32_t>(offsetof(PaintVertex, clipUV2)); |
| 98 | const uint32_t color_offset = static_cast<uint32_t>(offsetof(PaintVertex, color)); |
| 99 | _vertex_layout.attributes[0] = { u8"POSITION", 1, CGPU_FORMAT_R32G32B32A32_SFLOAT, 0, pos_offset, sizeof(skr_float4_t), CGPU_INPUT_RATE_VERTEX }; |
| 100 | _vertex_layout.attributes[1] = { u8"TEXCOORD", 1, CGPU_FORMAT_R32G32_SFLOAT, 0, texcoord_offset, sizeof(skr_float2_t), CGPU_INPUT_RATE_VERTEX }; |
| 101 | _vertex_layout.attributes[2] = { u8"AA", 1, CGPU_FORMAT_R32G32_SFLOAT, 0, aa_offset, sizeof(skr_float2_t), CGPU_INPUT_RATE_VERTEX }; |
| 102 | _vertex_layout.attributes[3] = { u8"UV", 1, CGPU_FORMAT_R32G32_SFLOAT, 0, uv_offset, sizeof(skr_float2_t), CGPU_INPUT_RATE_VERTEX }; |
| 103 | _vertex_layout.attributes[4] = { u8"UV_Two", 1, CGPU_FORMAT_R32G32_SFLOAT, 0, uv2_offset, sizeof(skr_float2_t), CGPU_INPUT_RATE_VERTEX }; |
| 104 | _vertex_layout.attributes[5] = { u8"COLOR", 1, CGPU_FORMAT_R8G8B8A8_UNORM, 0, color_offset, sizeof(skr_float4_t), CGPU_INPUT_RATE_VERTEX }; |
| 105 | _vertex_layout.attributes[6] = { u8"TRANSFORM", 4, CGPU_FORMAT_R32G32B32A32_SFLOAT, 1, 0, sizeof(skr_float4x4_t), CGPU_INPUT_RATE_INSTANCE }; |
| 106 | _vertex_layout.attributes[7] = { u8"PROJECTION", 4, CGPU_FORMAT_R32G32B32A32_SFLOAT, 2, 0, sizeof(skr_float4x4_t), CGPU_INPUT_RATE_INSTANCE }; |
| 107 | _vertex_layout.attributes[8] = { u8"DRAW_DATA", 4, CGPU_FORMAT_R32G32B32A32_SFLOAT, 3, 0, sizeof(skr_float4x4_t), CGPU_INPUT_RATE_INSTANCE }; |
| 108 | _vertex_layout.attribute_count = 9; |
| 109 | |
| 110 | // create sampler |
| 111 | CGPUSamplerDescriptor sampler_desc = {}; |
| 112 | sampler_desc.address_u = CGPU_ADDRESS_MODE_REPEAT; |
| 113 | sampler_desc.address_v = CGPU_ADDRESS_MODE_REPEAT; |
| 114 | sampler_desc.address_w = CGPU_ADDRESS_MODE_REPEAT; |
| 115 | sampler_desc.mipmap_mode = CGPU_MIPMAP_MODE_NEAREST; |
nothing calls this directly
no test coverage detected