diff --git a/src/gp_dx12.c b/src/gp_dx12.c index 9b472e61..d2ff45b9 100644 --- a/src/gp_dx12.c +++ b/src/gp_dx12.c @@ -977,12 +977,18 @@ INTERNAL WORK_TASK_FUNC_DEF(pipeline_load_task, load_arg_raw) .NumElements = 0 }; - /* Opaque blend state */ + /* Blend state */ D3D12_BLEND_DESC blend_desc = { .AlphaToCoverageEnable = FALSE, .IndependentBlendEnable = FALSE }; - blend_desc.RenderTarget[0].BlendEnable = FALSE; + blend_desc.RenderTarget[0].BlendEnable = TRUE; + blend_desc.RenderTarget[0].SrcBlend = D3D12_BLEND_SRC_ALPHA; + blend_desc.RenderTarget[0].DestBlend = D3D12_BLEND_INV_SRC_ALPHA; + blend_desc.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD; + blend_desc.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_ONE; + blend_desc.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_INV_SRC_ALPHA; + blend_desc.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD; blend_desc.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; /* Disable depth stencil */ @@ -1273,7 +1279,9 @@ INTERNAL struct dx12_resource *dx12_resource_alloc(D3D12_HEAP_PROPERTIES heap_pr } MEMZERO_STRUCT(r); - HRESULT hr = ID3D12Device_CreateCommittedResource(G.device, &heap_props, heap_flags, &desc, initial_state, NULL, &IID_ID3D12Resource, (void **)&r->resource); + D3D12_CLEAR_VALUE clear_value = { .Format = desc.Format, .Color = { 0 } }; + D3D12_CLEAR_VALUE *clear_value_ptr = desc.Flags & D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET ? &clear_value : NULL; + HRESULT hr = ID3D12Device_CreateCommittedResource(G.device, &heap_props, heap_flags, &desc, initial_state, clear_value_ptr, &IID_ID3D12Resource, (void **)&r->resource); if (FAILED(hr)) { /* TODO: Don't panic */ sys_panic(LIT("Failed to create resource")); @@ -2031,7 +2039,7 @@ void gp_dispatch(struct gp_dispatch_params params) enum D3D12_RESOURCE_STATES old_state = dx12_resource_barrier(cl->cl, target, D3D12_RESOURCE_STATE_RENDER_TARGET); ID3D12GraphicsCommandList_OMSetRenderTargets(cl->cl, 1, &target->rtv_descriptor->handle, false, NULL); //f32 clear_color[] = { 0.0f, 0.0f, 0.0f, 0.0f }; - //ID3D12GraphicsCommandList_ClearRenderTargetView(cl->cl, rtvHandle, clearColor, 0, nullptr); + //ID3D12GraphicsCommandList_ClearRenderTargetView(cl->cl, target->rtv_descriptor->handle, clear_color, 0, NULL); /* Draw */ ID3D12GraphicsCommandList_IASetPrimitiveTopology(cl->cl, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); @@ -2217,24 +2225,6 @@ void gp_present(struct sys_window *window, struct v2i32 backbuffer_resolution, s { //sys_sleep(0.1); -#if 0 - /* FIXME: Remove this */ - static b32 bla = false; - static ID3D12Fence *fence = ZI; - static u64 fence_value = 0; - if (!bla) { - bla = true; - ID3D12Device_CreateFence(G.device, 0, 0, &IID_ID3D12Fence, (void **)&fence); - } - ++fence_value; - ID3D12CommandQueue_Signal(G.cq_direct->cq, fence, fence_value); - - HANDLE event = CreateEvent(NULL, FALSE, FALSE, NULL); - ID3D12Fence_SetEventOnCompletion(fence, fence_value, event); - WaitForSingleObject(event, INFINITE); - CloseHandle(event); -#endif - struct dx12_resource *backbuffer_resource = update_swapchain(window, backbuffer_resolution); struct dx12_resource *texture_resource = handle_get_data(texture, DX12_HANDLE_KIND_RESOURCE);