mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
d3d11converter: Add support for MSAA render target
Create multi-sample render target view if sample count > 1 and MSAA enabled rasterizer for multi-sample render target Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5532>
This commit is contained in:
parent
eac65d248a
commit
b7c49f8e9f
2 changed files with 30 additions and 6 deletions
|
@ -309,6 +309,7 @@ struct _GstD3D11ConverterPrivate
|
||||||
ComPtr < ID3D11SamplerState > sampler;
|
ComPtr < ID3D11SamplerState > sampler;
|
||||||
ComPtr < ID3D11SamplerState > linear_sampler;
|
ComPtr < ID3D11SamplerState > linear_sampler;
|
||||||
ComPtr < ID3D11RasterizerState > rasterizer;
|
ComPtr < ID3D11RasterizerState > rasterizer;
|
||||||
|
ComPtr < ID3D11RasterizerState > msaa_rasterizer;
|
||||||
PixelShaderList ps;
|
PixelShaderList ps;
|
||||||
D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES];
|
D3D11_VIEWPORT viewport[GST_VIDEO_MAX_PLANES];
|
||||||
|
|
||||||
|
@ -787,6 +788,7 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self,
|
||||||
ComPtr < ID3D11Buffer > vertex_buffer;
|
ComPtr < ID3D11Buffer > vertex_buffer;
|
||||||
ComPtr < ID3D11Buffer > index_buffer;
|
ComPtr < ID3D11Buffer > index_buffer;
|
||||||
ComPtr < ID3D11RasterizerState > rasterizer;
|
ComPtr < ID3D11RasterizerState > rasterizer;
|
||||||
|
ComPtr < ID3D11RasterizerState > msaa_rasterizer;
|
||||||
D3D11_SUBRESOURCE_DATA subresource;
|
D3D11_SUBRESOURCE_DATA subresource;
|
||||||
|
|
||||||
memset (&rasterizer_desc, 0, sizeof (rasterizer_desc));
|
memset (&rasterizer_desc, 0, sizeof (rasterizer_desc));
|
||||||
|
@ -837,6 +839,15 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rasterizer_desc.MultisampleEnable = TRUE;
|
||||||
|
rasterizer_desc.AntialiasedLineEnable = TRUE;
|
||||||
|
hr = device_handle->CreateRasterizerState (&rasterizer_desc,
|
||||||
|
&msaa_rasterizer);
|
||||||
|
if (!gst_d3d11_result (hr, device)) {
|
||||||
|
GST_ERROR_OBJECT (self, "Couldn't create MSAA rasterizer state");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/* const buffer */
|
/* const buffer */
|
||||||
if (priv->convert_type != CONVERT_TYPE::IDENTITY ||
|
if (priv->convert_type != CONVERT_TYPE::IDENTITY ||
|
||||||
GST_VIDEO_INFO_HAS_ALPHA (out_info)) {
|
GST_VIDEO_INFO_HAS_ALPHA (out_info)) {
|
||||||
|
@ -952,6 +963,7 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self,
|
||||||
priv->linear_sampler = linear_sampler;
|
priv->linear_sampler = linear_sampler;
|
||||||
priv->ps = ps_list;
|
priv->ps = ps_list;
|
||||||
priv->rasterizer = rasterizer;
|
priv->rasterizer = rasterizer;
|
||||||
|
priv->msaa_rasterizer = msaa_rasterizer;
|
||||||
|
|
||||||
priv->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info);
|
priv->input_texture_width = GST_VIDEO_INFO_WIDTH (in_info);
|
||||||
priv->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info);
|
priv->input_texture_height = GST_VIDEO_INFO_HEIGHT (in_info);
|
||||||
|
@ -2153,7 +2165,7 @@ out:
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
|
gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
|
||||||
ID3D11ShaderResourceView * srv[GST_VIDEO_MAX_PLANES],
|
ID3D11ShaderResourceView * srv[GST_VIDEO_MAX_PLANES],
|
||||||
ID3D11RenderTargetView * rtv[GST_VIDEO_MAX_PLANES])
|
ID3D11RenderTargetView * rtv[GST_VIDEO_MAX_PLANES], gboolean multisampled)
|
||||||
{
|
{
|
||||||
GstD3D11ConverterPrivate *priv;
|
GstD3D11ConverterPrivate *priv;
|
||||||
ComPtr < ID3D11Resource > resource;
|
ComPtr < ID3D11Resource > resource;
|
||||||
|
@ -2244,7 +2256,11 @@ gst_d3d11_converter_convert_internal (GstD3D11Converter * self,
|
||||||
auto ps = priv->ps[0];
|
auto ps = priv->ps[0];
|
||||||
context->PSSetShader (ps->shader.Get (), nullptr, 0);
|
context->PSSetShader (ps->shader.Get (), nullptr, 0);
|
||||||
context->RSSetViewports (ps->num_rtv, priv->viewport);
|
context->RSSetViewports (ps->num_rtv, priv->viewport);
|
||||||
context->RSSetState (priv->rasterizer.Get ());
|
if (multisampled)
|
||||||
|
context->RSSetState (priv->msaa_rasterizer.Get ());
|
||||||
|
else
|
||||||
|
context->RSSetState (priv->rasterizer.Get ());
|
||||||
|
|
||||||
context->OMSetRenderTargets (ps->num_rtv, rtv, nullptr);
|
context->OMSetRenderTargets (ps->num_rtv, rtv, nullptr);
|
||||||
if (priv->blend) {
|
if (priv->blend) {
|
||||||
context->OMSetBlendState (priv->blend.Get (),
|
context->OMSetBlendState (priv->blend.Get (),
|
||||||
|
@ -2941,6 +2957,7 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
|
||||||
guint num_srv, num_rtv;
|
guint num_srv, num_rtv;
|
||||||
gboolean ret = FALSE;
|
gboolean ret = FALSE;
|
||||||
gboolean in_d3d11;
|
gboolean in_d3d11;
|
||||||
|
gboolean multisampled = FALSE;
|
||||||
|
|
||||||
std::lock_guard < std::mutex > lk (priv->prop_lock);
|
std::lock_guard < std::mutex > lk (priv->prop_lock);
|
||||||
|
|
||||||
|
@ -2966,6 +2983,9 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (desc.SampleDesc.Count > 1)
|
||||||
|
multisampled = TRUE;
|
||||||
|
|
||||||
gst_d3d11_converter_update_hdr10_meta (self);
|
gst_d3d11_converter_update_hdr10_meta (self);
|
||||||
/* Update in/out rect */
|
/* Update in/out rect */
|
||||||
if (!gst_d3d11_converter_update_dest_rect (self)) {
|
if (!gst_d3d11_converter_update_dest_rect (self)) {
|
||||||
|
@ -2979,7 +2999,7 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
|
||||||
}
|
}
|
||||||
|
|
||||||
in_d3d11 = gst_d3d11_converter_is_d3d11_buffer (self, in_buf);
|
in_d3d11 = gst_d3d11_converter_is_d3d11_buffer (self, in_buf);
|
||||||
if (gst_d3d11_converter_processor_available (self)) {
|
if (!multisampled && gst_d3d11_converter_processor_available (self)) {
|
||||||
gboolean use_processor = FALSE;
|
gboolean use_processor = FALSE;
|
||||||
gboolean piv_available = FALSE;
|
gboolean piv_available = FALSE;
|
||||||
|
|
||||||
|
@ -3092,7 +3112,7 @@ gst_d3d11_converter_convert_buffer_internal (GstD3D11Converter * self,
|
||||||
|
|
||||||
GST_TRACE_OBJECT (self, "Converting using shader");
|
GST_TRACE_OBJECT (self, "Converting using shader");
|
||||||
|
|
||||||
ret = gst_d3d11_converter_convert_internal (self, srv, rtv);
|
ret = gst_d3d11_converter_convert_internal (self, srv, rtv, multisampled);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (in_buf)
|
if (in_buf)
|
||||||
|
|
|
@ -988,8 +988,12 @@ create_render_target_views (GstD3D11Memory * mem)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
render_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
if (priv->desc.SampleDesc.Count > 1) {
|
||||||
render_desc.Texture2D.MipSlice = 0;
|
render_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2DMS;
|
||||||
|
} else {
|
||||||
|
render_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||||
|
render_desc.Texture2D.MipSlice = 0;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_views; i++) {
|
for (i = 0; i < num_views; i++) {
|
||||||
render_desc.Format = formats[i];
|
render_desc.Format = formats[i];
|
||||||
|
|
Loading…
Reference in a new issue