diff --git a/gfx/common/d3d12_common.c b/gfx/common/d3d12_common.c index a03b4e2e76..2022cd2032 100644 --- a/gfx/common/d3d12_common.c +++ b/gfx/common/d3d12_common.c @@ -380,14 +380,18 @@ void d3d12_upload_texture(D3D12GraphicsCommandList cmd, dst.Type = D3D12_TEXTURE_COPY_TYPE_SUBRESOURCE_INDEX; dst.SubresourceIndex = 0; - d3d12_resource_transition( - cmd, texture->handle, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, + D3D12_RESOURCE_TRANSITION( + cmd, + texture->handle, + D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_COPY_DEST); D3D12CopyTextureRegion(cmd, &dst, 0, 0, 0, &src, NULL); - d3d12_resource_transition( - cmd, texture->handle, D3D12_RESOURCE_STATE_COPY_DEST, + D3D12_RESOURCE_TRANSITION( + cmd, + texture->handle, + D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); if (texture->desc.MipLevels > 1) diff --git a/gfx/common/d3d12_common.h b/gfx/common/d3d12_common.h index 7f6827ea30..84e34f82a0 100644 --- a/gfx/common/d3d12_common.h +++ b/gfx/common/d3d12_common.h @@ -30,6 +30,18 @@ #define D3D12_MAX_GPU_COUNT 16 +#define D3D12_RESOURCE_TRANSITION(cmd, resource, state_before, state_after) \ +{ \ + D3D12_RESOURCE_BARRIER _barrier; \ + _barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; \ + _barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; \ + _barrier.Transition.pResource = resource; \ + _barrier.Transition.StateBefore = state_before; \ + _barrier.Transition.StateAfter = state_after; \ + _barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; \ + D3D12ResourceBarrier(cmd, 1, &_barrier); \ +} + typedef const ID3D12PipelineState* D3D12PipelineStateRef; /* auto-generated */ @@ -774,41 +786,4 @@ void d3d12_update_texture( void d3d12_upload_texture(D3D12GraphicsCommandList cmd, d3d12_texture_t* texture, void *userdata); -#if !defined(__cplusplus) || defined(CINTERFACE) -static INLINE void d3d12_resource_transition( - D3D12GraphicsCommandList cmd, - D3D12Resource resource, - D3D12_RESOURCE_STATES state_before, - D3D12_RESOURCE_STATES state_after) -{ - D3D12_RESOURCE_BARRIER barrier; - barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; - barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE; - barrier.Transition.pResource = resource; - barrier.Transition.StateBefore = state_before; - barrier.Transition.StateAfter = state_after; - barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; - D3D12ResourceBarrier(cmd, 1, &barrier); -} - -static INLINE void d3d12_set_texture(D3D12GraphicsCommandList cmd, const d3d12_texture_t* texture) -{ - D3D12SetGraphicsRootDescriptorTable(cmd, ROOT_ID_TEXTURE_T, texture->gpu_descriptor[0]); -} - -static INLINE void -d3d12_set_sampler(D3D12GraphicsCommandList cmd, D3D12_GPU_DESCRIPTOR_HANDLE sampler) -{ - D3D12SetGraphicsRootDescriptorTable(cmd, ROOT_ID_SAMPLER_T, sampler); -} - -static INLINE void -d3d12_set_texture_and_sampler(D3D12GraphicsCommandList cmd, const d3d12_texture_t* texture) -{ - D3D12SetGraphicsRootDescriptorTable(cmd, ROOT_ID_TEXTURE_T, texture->gpu_descriptor[0]); - D3D12SetGraphicsRootDescriptorTable(cmd, ROOT_ID_SAMPLER_T, texture->sampler); -} - -#endif - RETRO_END_DECLS diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index f8191abf87..f2f945333a 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -2512,8 +2512,9 @@ static bool d3d12_gfx_frame( if (d3d12->pass[i].rt.handle) { - d3d12_resource_transition( - d3d12->queue.cmd, d3d12->pass[i].rt.handle, + D3D12_RESOURCE_TRANSITION( + d3d12->queue.cmd, + d3d12->pass[i].rt.handle, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); @@ -2534,8 +2535,9 @@ static bool d3d12_gfx_frame( else D3D12DrawInstanced(d3d12->queue.cmd, 4, 1, 4, 0); - d3d12_resource_transition( - d3d12->queue.cmd, d3d12->pass[i].rt.handle, + D3D12_RESOURCE_TRANSITION( + d3d12->queue.cmd, + d3d12->pass[i].rt.handle, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); texture = &d3d12->pass[i].rt; @@ -2554,9 +2556,13 @@ static bool d3d12_gfx_frame( d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]); D3D12SetGraphicsRootSignature(d3d12->queue.cmd, d3d12->desc.rootSignature); - d3d12_set_texture(d3d12->queue.cmd, &d3d12->frame.texture[0]); - d3d12_set_sampler(d3d12->queue.cmd, - d3d12->samplers[RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_TEXTURE_T, + d3d12->frame.texture[0].gpu_descriptor[0]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_SAMPLER_T, + d3d12->samplers[ + RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]); D3D12SetGraphicsRootConstantBufferView( d3d12->queue.cmd, ROOT_ID_UBO, d3d12->frame.ubo_view.BufferLocation); @@ -2568,8 +2574,9 @@ static bool d3d12_gfx_frame( #ifdef HAVE_DXGI_HDR if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer) { - d3d12_resource_transition( - d3d12->queue.cmd, d3d12->chain.back_buffer.handle, + D3D12_RESOURCE_TRANSITION( + d3d12->queue.cmd, + d3d12->chain.back_buffer.handle, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET); @@ -2589,7 +2596,7 @@ static bool d3d12_gfx_frame( else #endif { - d3d12_resource_transition( + D3D12_RESOURCE_TRANSITION( d3d12->queue.cmd, d3d12->chain.renderTargets[d3d12->chain.frame_index], D3D12_RESOURCE_STATE_PRESENT, @@ -2630,7 +2637,12 @@ static bool d3d12_gfx_frame( D3D12RSSetScissorRects(d3d12->queue.cmd, 1, &d3d12->chain.scissorRect); } - d3d12_set_texture_and_sampler(d3d12->queue.cmd, &d3d12->menu.texture); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_TEXTURE_T, + d3d12->menu.texture.gpu_descriptor[0]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_SAMPLER_T, + d3d12->menu.texture.sampler); D3D12IASetVertexBuffers(d3d12->queue.cmd, 0, 1, &d3d12->menu.vbo_view); D3D12DrawInstanced(d3d12->queue.cmd, 4, 1, 0, 0); } @@ -2711,14 +2723,15 @@ static bool d3d12_gfx_frame( /* Copy over back buffer to swap chain render targets */ if ((d3d12->flags & D3D12_ST_FLAG_HDR_ENABLE) && use_back_buffer) { - d3d12_resource_transition( + D3D12_RESOURCE_TRANSITION( d3d12->queue.cmd, d3d12->chain.renderTargets[d3d12->chain.frame_index], D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET); - d3d12_resource_transition( - d3d12->queue.cmd, d3d12->chain.back_buffer.handle, + D3D12_RESOURCE_TRANSITION( + d3d12->queue.cmd, + d3d12->chain.back_buffer.handle, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE); D3D12SetPipelineState(d3d12->queue.cmd, @@ -2735,9 +2748,13 @@ static bool d3d12_gfx_frame( D3D12SetGraphicsRootSignature(d3d12->queue.cmd, d3d12->desc.rootSignature); - d3d12_set_texture(d3d12->queue.cmd, &d3d12->chain.back_buffer); - d3d12_set_sampler(d3d12->queue.cmd, - d3d12->samplers[RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_TEXTURE_T, + d3d12->chain.back_buffer.gpu_descriptor[0]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_SAMPLER_T, + d3d12->samplers[ + RARCH_FILTER_UNSPEC][RARCH_WRAP_DEFAULT]); D3D12SetGraphicsRootConstantBufferView( d3d12->queue.cmd, ROOT_ID_UBO, d3d12->hdr.ubo_view.BufferLocation); @@ -2756,7 +2773,7 @@ static bool d3d12_gfx_frame( } #endif - d3d12_resource_transition( + D3D12_RESOURCE_TRANSITION( d3d12->queue.cmd, d3d12->chain.renderTargets[d3d12->chain.frame_index], D3D12_RESOURCE_STATE_RENDER_TARGET, diff --git a/gfx/drivers_display/gfx_display_d3d12.c b/gfx/drivers_display/gfx_display_d3d12.c index 9f23ae2b80..9247aa1e0b 100644 --- a/gfx/drivers_display/gfx_display_d3d12.c +++ b/gfx/drivers_display/gfx_display_d3d12.c @@ -165,7 +165,8 @@ static void gfx_display_d3d12_draw(gfx_display_ctx_draw_t *draw, D3D12SetPipelineState(d3d12->queue.cmd, d3d12->sprites.pipe); } - d3d12_set_texture_and_sampler(d3d12->queue.cmd, texture); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, ROOT_ID_TEXTURE_T, texture->gpu_descriptor[0]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, ROOT_ID_SAMPLER_T, texture->sampler); } D3D12DrawInstanced(d3d12->queue.cmd, vertex_count, 1, d3d12->sprites.offset, 0); diff --git a/gfx/drivers_font/d3d12_font.c b/gfx/drivers_font/d3d12_font.c index 4df205d0a2..9cd5a2254e 100644 --- a/gfx/drivers_font/d3d12_font.c +++ b/gfx/drivers_font/d3d12_font.c @@ -221,7 +221,10 @@ static void d3d12_font_render_line( d3d12); D3D12SetPipelineState(d3d12->queue.cmd, d3d12->sprites.pipe_font); - d3d12_set_texture_and_sampler(d3d12->queue.cmd, &font->texture); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_TEXTURE_T, font->texture.gpu_descriptor[0]); + D3D12SetGraphicsRootDescriptorTable(d3d12->queue.cmd, + ROOT_ID_SAMPLER_T, font->texture.sampler); D3D12DrawInstanced(d3d12->queue.cmd, count, 1, d3d12->sprites.offset, 0); D3D12SetPipelineState(d3d12->queue.cmd, d3d12->sprites.pipe);