| 4339 | } |
| 4340 | |
| 4341 | static void paint_render(ID3D11UnorderedAccessView *target_uav, const Shader_Constants_Paint &constants) |
| 4342 | { |
| 4343 | ID3D11DeviceContext1 *ctx = G->graphics.device_ctx; |
| 4344 | |
| 4345 | D3D11_MAPPED_SUBRESOURCE mapped; |
| 4346 | ctx->Map(G->graphics.paint_constants_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); |
| 4347 | memcpy(mapped.pData, &constants, sizeof(Shader_Constants_Paint)); |
| 4348 | ctx->Unmap(G->graphics.paint_constants_buffer, 0); |
| 4349 | |
| 4350 | ID3D11UnorderedAccessView* uavs[] = { target_uav }; |
| 4351 | ctx->CSSetUnorderedAccessViews(0, 1, uavs, nullptr); |
| 4352 | ctx->CSSetConstantBuffers(0, 1, &G->graphics.paint_constants_buffer); |
| 4353 | ctx->CSSetShader(G->graphics.paint_cs_shader, nullptr, 0); |
| 4354 | |
| 4355 | // Dispatch over full canvas (simple, not optimal). |
| 4356 | UINT groups_x = (constants.canvas_size.x + 8 - 1) / 8; |
| 4357 | UINT groups_y = (constants.canvas_size.y + 8 - 1) / 8; |
| 4358 | ctx->Dispatch(groups_x, groups_y, 1); |
| 4359 | |
| 4360 | ID3D11UnorderedAccessView *null_uav[1] = { NULL }; |
| 4361 | ID3D11Buffer *null_cb[1] = { NULL }; |
| 4362 | ctx->CSSetUnorderedAccessViews(0, 1, null_uav, NULL); |
| 4363 | ctx->CSSetConstantBuffers(0, 1, null_cb); |
| 4364 | ctx->CSSetShader(NULL, NULL, 0); |
| 4365 | } |
| 4366 | |
| 4367 | static void paint_update() |
| 4368 | { |