diff options
author | Seungha Yang <seungha@centricular.com> | 2021-05-21 21:30:42 +0900 |
---|---|---|
committer | Seungha Yang <seungha@centricular.com> | 2021-05-28 21:44:07 +0900 |
commit | f3331652f22ef02aa23e5750d3dd83a29833b713 (patch) | |
tree | 1e15aa0ded60c19871c91185b7d05c7e09a0a645 /sys | |
parent | 49992be6437a29b65dec5a5200e1c8dedd4f9c42 (diff) | |
download | gstreamer-plugins-bad-f3331652f22ef02aa23e5750d3dd83a29833b713.tar.gz |
d3d11shader: Don't hold state object in GstD3D11Quad
We might want to update state object
Part-of: <https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/merge_requests/2276>
Diffstat (limited to 'sys')
-rw-r--r-- | sys/d3d11/gstd3d11compositor.cpp | 4 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11converter.cpp | 18 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11overlaycompositor.cpp | 5 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11shader.cpp | 40 | ||||
-rw-r--r-- | sys/d3d11/gstd3d11shader.h | 13 |
5 files changed, 32 insertions, 48 deletions
diff --git a/sys/d3d11/gstd3d11compositor.cpp b/sys/d3d11/gstd3d11compositor.cpp index ae74db784..ac46c6f3e 100644 --- a/sys/d3d11/gstd3d11compositor.cpp +++ b/sys/d3d11/gstd3d11compositor.cpp @@ -2049,7 +2049,7 @@ gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self) context_handle->Unmap (index_buffer.Get (), 0); quad = gst_d3d11_quad_new (self->device, - ps.Get (), vs.Get (), layout.Get (), NULL, NULL, NULL, NULL, + ps.Get (), vs.Get (), layout.Get (), NULL, vertex_buffer.Get (), sizeof (VertexData), index_buffer.Get (), DXGI_FORMAT_R16_UINT, 6); if (!quad) { @@ -2081,7 +2081,7 @@ gst_d3d11_compositor_draw_background_checker (GstD3D11Compositor * self, } return gst_d3d11_draw_quad_unlocked (self->checker_background, - &self->viewport, 1, NULL, 0, &rtv, 1, NULL, NULL, NULL); + &self->viewport, 1, NULL, 0, &rtv, 1, NULL, NULL, NULL, 0); } /* Must be called with d3d11 device lock */ diff --git a/sys/d3d11/gstd3d11converter.cpp b/sys/d3d11/gstd3d11converter.cpp index 60bad822c..fd5545c3f 100644 --- a/sys/d3d11/gstd3d11converter.cpp +++ b/sys/d3d11/gstd3d11converter.cpp @@ -350,6 +350,8 @@ struct _GstD3D11Converter ID3D11Buffer *vertex_buffer; gboolean update_vertex; + ID3D11SamplerState *linear_sampler; + ConvertInfo convert_info; }; @@ -1068,7 +1070,7 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, ComPtr<ID3D11PixelShader> ps[CONVERTER_MAX_QUADS]; ComPtr<ID3D11VertexShader> vs; ComPtr<ID3D11InputLayout> layout; - ComPtr<ID3D11SamplerState> sampler; + ComPtr<ID3D11SamplerState> linear_sampler; ComPtr<ID3D11Buffer> const_buffer; ComPtr<ID3D11Buffer> vertex_buffer; ComPtr<ID3D11Buffer> index_buffer; @@ -1093,7 +1095,7 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, sampler_desc.MinLOD = 0; sampler_desc.MaxLOD = D3D11_FLOAT32_MAX; - hr = device_handle->CreateSamplerState (&sampler_desc, &sampler); + hr = device_handle->CreateSamplerState (&sampler_desc, &linear_sampler); if (!gst_d3d11_result (hr, device)) { GST_ERROR ("Couldn't create sampler state, hr: 0x%x", (guint) hr); return FALSE; @@ -1262,13 +1264,13 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, gst_d3d11_device_unlock (device); self->quad[0] = gst_d3d11_quad_new (device, - ps[0].Get (), vs.Get (), layout.Get (), sampler.Get (), NULL, NULL, + ps[0].Get (), vs.Get (), layout.Get (), const_buffer.Get (), vertex_buffer.Get (), sizeof (VertexData), index_buffer.Get (), DXGI_FORMAT_R16_UINT, index_count); if (ps[1]) { self->quad[1] = gst_d3d11_quad_new (device, - ps[1].Get (), vs.Get (), layout.Get (), sampler.Get (), NULL, NULL, + ps[1].Get (), vs.Get (), layout.Get (), const_buffer.Get (), vertex_buffer.Get (), sizeof (VertexData), index_buffer.Get (), DXGI_FORMAT_R16_UINT, index_count); } @@ -1292,6 +1294,8 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, self->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info); self->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info); + self->linear_sampler = linear_sampler.Detach (); + return TRUE; } @@ -1448,6 +1452,7 @@ gst_d3d11_converter_free (GstD3D11Converter * converter) } GST_D3D11_CLEAR_COM (converter->vertex_buffer); + GST_D3D11_CLEAR_COM (converter->linear_sampler); gst_clear_object (&converter->device); g_free (converter); @@ -1604,7 +1609,8 @@ gst_d3d11_converter_convert_unlocked (GstD3D11Converter * converter, } ret = gst_d3d11_draw_quad_unlocked (converter->quad[0], converter->viewport, - 1, srv, converter->num_input_view, rtv, 1, NULL, blend, blend_factor); + 1, srv, converter->num_input_view, rtv, 1, blend, blend_factor, + &converter->linear_sampler, 1); if (!ret) return FALSE; @@ -1613,7 +1619,7 @@ gst_d3d11_converter_convert_unlocked (GstD3D11Converter * converter, ret = gst_d3d11_draw_quad_unlocked (converter->quad[1], &converter->viewport[1], converter->num_output_view - 1, srv, converter->num_input_view, &rtv[1], converter->num_output_view - 1, - NULL, blend, blend_factor); + blend, blend_factor, &converter->linear_sampler, 1); if (!ret) return FALSE; diff --git a/sys/d3d11/gstd3d11overlaycompositor.cpp b/sys/d3d11/gstd3d11overlaycompositor.cpp index 4d4196b5a..798ee047a 100644 --- a/sys/d3d11/gstd3d11overlaycompositor.cpp +++ b/sys/d3d11/gstd3d11overlaycompositor.cpp @@ -285,7 +285,7 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, overlay->texture = texture.Detach (); overlay->srv = srv.Detach (); overlay->quad = gst_d3d11_quad_new (device, - self->ps, self->vs, self->layout, self->sampler, self->blend, NULL, NULL, + self->ps, self->vs, self->layout, NULL, vertex_buffer.Get (), sizeof (VertexData), self->index_buffer, DXGI_FORMAT_R16_UINT, index_count); @@ -637,7 +637,8 @@ gst_d3d11_overlay_compositor_draw_unlocked (GstD3D11OverlayCompositor * (GstD3D11CompositionOverlay *) iter->data; ret = gst_d3d11_draw_quad_unlocked (overlay->quad, - &compositor->viewport, 1, &overlay->srv, 1, rtv, 1, NULL, NULL, NULL); + &compositor->viewport, 1, &overlay->srv, 1, rtv, 1, + compositor->blend, NULL, &compositor->sampler, 1); if (!ret) break; diff --git a/sys/d3d11/gstd3d11shader.cpp b/sys/d3d11/gstd3d11shader.cpp index 8596b6a9b..ef502bbaa 100644 --- a/sys/d3d11/gstd3d11shader.cpp +++ b/sys/d3d11/gstd3d11shader.cpp @@ -237,9 +237,6 @@ struct _GstD3D11Quad ID3D11PixelShader *ps; ID3D11VertexShader *vs; ID3D11InputLayout *layout; - ID3D11SamplerState *sampler; - ID3D11BlendState *blend; - ID3D11DepthStencilState *depth_stencil; ID3D11Buffer *const_buffer; ID3D11Buffer *vertex_buffer; guint vertex_stride; @@ -256,8 +253,6 @@ struct _GstD3D11Quad GstD3D11Quad * gst_d3d11_quad_new (GstD3D11Device * device, ID3D11PixelShader * pixel_shader, ID3D11VertexShader * vertex_shader, ID3D11InputLayout * layout, - ID3D11SamplerState * sampler, ID3D11BlendState * blend, - ID3D11DepthStencilState * depth_stencil, ID3D11Buffer * const_buffer, ID3D11Buffer * vertex_buffer, guint vertex_stride, ID3D11Buffer * index_buffer, DXGI_FORMAT index_format, guint index_count) @@ -279,9 +274,6 @@ gst_d3d11_quad_new (GstD3D11Device * device, ID3D11PixelShader * pixel_shader, quad->ps = pixel_shader; quad->vs = vertex_shader; quad->layout = layout; - quad->sampler = sampler; - quad->blend = blend; - quad->depth_stencil = depth_stencil; quad->vertex_buffer = vertex_buffer; quad->vertex_stride = vertex_stride; quad->index_buffer = index_buffer; @@ -294,15 +286,6 @@ gst_d3d11_quad_new (GstD3D11Device * device, ID3D11PixelShader * pixel_shader, vertex_buffer->AddRef (); index_buffer->AddRef (); - if (sampler) - sampler->AddRef (); - - if (blend) - blend->AddRef (); - - if (depth_stencil) - depth_stencil->AddRef (); - if (const_buffer) { quad->const_buffer = const_buffer; const_buffer->AddRef (); @@ -319,9 +302,6 @@ gst_d3d11_quad_free (GstD3D11Quad * quad) GST_D3D11_CLEAR_COM (quad->ps); GST_D3D11_CLEAR_COM (quad->vs); GST_D3D11_CLEAR_COM (quad->layout); - GST_D3D11_CLEAR_COM (quad->sampler); - GST_D3D11_CLEAR_COM (quad->blend); - GST_D3D11_CLEAR_COM (quad->depth_stencil); GST_D3D11_CLEAR_COM (quad->const_buffer); GST_D3D11_CLEAR_COM (quad->vertex_buffer); GST_D3D11_CLEAR_COM (quad->index_buffer); @@ -335,8 +315,8 @@ gst_d3d11_draw_quad (GstD3D11Quad * quad, D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES], guint num_viewport, ID3D11ShaderResourceView * srv[GST_VIDEO_MAX_PLANES], guint num_srv, ID3D11RenderTargetView * rtv[GST_VIDEO_MAX_PLANES], guint num_rtv, - ID3D11DepthStencilView * dsv, ID3D11BlendState * blend, - gfloat blend_factor[4]) + ID3D11BlendState * blend, gfloat blend_factor[4], + ID3D11SamplerState ** sampler, guint num_sampler) { gboolean ret; @@ -344,7 +324,8 @@ gst_d3d11_draw_quad (GstD3D11Quad * quad, gst_d3d11_device_lock (quad->device); ret = gst_d3d11_draw_quad_unlocked (quad, viewport, num_viewport, - srv, num_srv, rtv, num_viewport, dsv, blend, blend_factor); + srv, num_srv, rtv, num_viewport, blend, blend_factor, sampler, + num_sampler); gst_d3d11_device_unlock (quad->device); return ret; @@ -355,8 +336,8 @@ gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES], guint num_viewport, ID3D11ShaderResourceView * srv[GST_VIDEO_MAX_PLANES], guint num_srv, ID3D11RenderTargetView * rtv[GST_VIDEO_MAX_PLANES], guint num_rtv, - ID3D11DepthStencilView * dsv, ID3D11BlendState * blend, - gfloat blend_factor[4]) + ID3D11BlendState * blend, gfloat blend_factor[4], + ID3D11SamplerState ** sampler, guint num_sampler) { ID3D11DeviceContext *context; UINT offsets = 0; @@ -377,8 +358,8 @@ gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, &offsets); context->IASetIndexBuffer (quad->index_buffer, quad->index_format, 0); - if (quad->sampler) - context->PSSetSamplers (0, 1, &quad->sampler); + if (sampler) + context->PSSetSamplers (0, num_sampler, sampler); context->VSSetShader (quad->vs, NULL, 0); context->PSSetShader (quad->ps, NULL, 0); context->RSSetViewports (num_viewport, viewport); @@ -388,11 +369,8 @@ gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, if (srv) context->PSSetShaderResources (0, num_srv, srv); - context->OMSetRenderTargets (num_rtv, rtv, dsv); - if (!blend_state) - blend_state = quad->blend; + context->OMSetRenderTargets (num_rtv, rtv, NULL); context->OMSetBlendState (blend_state, blend_factor, 0xffffffff); - context->OMSetDepthStencilState (quad->depth_stencil, 1); context->DrawIndexed (quad->index_count, 0, 0); diff --git a/sys/d3d11/gstd3d11shader.h b/sys/d3d11/gstd3d11shader.h index 4be974a7f..fe9bcc862 100644 --- a/sys/d3d11/gstd3d11shader.h +++ b/sys/d3d11/gstd3d11shader.h @@ -47,9 +47,6 @@ GstD3D11Quad * gst_d3d11_quad_new (GstD3D11Device * device, ID3D11PixelShader * pixel_shader, ID3D11VertexShader * vertex_shader, ID3D11InputLayout * layout, - ID3D11SamplerState * sampler, - ID3D11BlendState * blend, - ID3D11DepthStencilState *depth_stencil, ID3D11Buffer * const_buffer, ID3D11Buffer * vertex_buffer, guint vertex_stride, @@ -66,9 +63,10 @@ gboolean gst_d3d11_draw_quad (GstD3D11Quad * quad, guint num_srv, ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES], guint num_rtv, - ID3D11DepthStencilView *dsv, ID3D11BlendState *blend, - gfloat blend_factor[4]); + gfloat blend_factor[4], + ID3D11SamplerState ** sampler, + guint num_sampler); gboolean gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES], @@ -77,9 +75,10 @@ gboolean gst_d3d11_draw_quad_unlocked (GstD3D11Quad * quad, guint num_srv, ID3D11RenderTargetView *rtv[GST_VIDEO_MAX_PLANES], guint num_rtv, - ID3D11DepthStencilView *dsv, ID3D11BlendState *blend, - gfloat blend_factor[4]); + gfloat blend_factor[4], + ID3D11SamplerState ** sampler, + guint num_sampler); G_END_DECLS |