mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-06-07 07:58:51 +00:00
d3d11overlaycompositor: Fix HLSL compiler warning
warning X3206: 'Sample': implicit truncation of vector type And don't use GstD3D11Quad since it will result in redundant API calls Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2622>
This commit is contained in:
parent
f10e2eb88f
commit
93662da3d1
1 changed files with 49 additions and 47 deletions
|
@ -40,21 +40,19 @@ typedef struct
|
||||||
FLOAT z;
|
FLOAT z;
|
||||||
} position;
|
} position;
|
||||||
struct {
|
struct {
|
||||||
FLOAT x;
|
FLOAT u;
|
||||||
FLOAT y;
|
FLOAT v;
|
||||||
} texture;
|
} texture;
|
||||||
} VertexData;
|
} VertexData;
|
||||||
|
|
||||||
static const gchar templ_pixel_shader[] =
|
static const gchar templ_pixel_shader[] =
|
||||||
"Texture2D shaderTexture;\n"
|
"Texture2D shaderTexture;\n"
|
||||||
"SamplerState samplerState;\n"
|
"SamplerState samplerState;\n"
|
||||||
"\n"
|
|
||||||
"struct PS_INPUT\n"
|
"struct PS_INPUT\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" float4 Position: SV_POSITION;\n"
|
" float4 Position: SV_POSITION;\n"
|
||||||
" float3 Texture: TEXCOORD0;\n"
|
" float2 Texture: TEXCOORD;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
"\n"
|
|
||||||
"float4 main(PS_INPUT input): SV_TARGET\n"
|
"float4 main(PS_INPUT input): SV_TARGET\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" return shaderTexture.Sample(samplerState, input.Texture);\n"
|
" return shaderTexture.Sample(samplerState, input.Texture);\n"
|
||||||
|
@ -64,13 +62,13 @@ static const gchar templ_vertex_shader[] =
|
||||||
"struct VS_INPUT\n"
|
"struct VS_INPUT\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" float4 Position : POSITION;\n"
|
" float4 Position : POSITION;\n"
|
||||||
" float4 Texture : TEXCOORD0;\n"
|
" float2 Texture : TEXCOORD;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
"\n"
|
"\n"
|
||||||
"struct VS_OUTPUT\n"
|
"struct VS_OUTPUT\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" float4 Position: SV_POSITION;\n"
|
" float4 Position: SV_POSITION;\n"
|
||||||
" float4 Texture: TEXCOORD0;\n"
|
" float2 Texture: TEXCOORD;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
"\n"
|
"\n"
|
||||||
"VS_OUTPUT main(VS_INPUT input)\n"
|
"VS_OUTPUT main(VS_INPUT input)\n"
|
||||||
|
@ -102,7 +100,7 @@ typedef struct
|
||||||
GstVideoOverlayRectangle *overlay_rect;
|
GstVideoOverlayRectangle *overlay_rect;
|
||||||
ID3D11Texture2D *texture;
|
ID3D11Texture2D *texture;
|
||||||
ID3D11ShaderResourceView *srv;
|
ID3D11ShaderResourceView *srv;
|
||||||
GstD3D11Quad *quad;
|
ID3D11Buffer *vertex_buffer;
|
||||||
} GstD3D11CompositionOverlay;
|
} GstD3D11CompositionOverlay;
|
||||||
|
|
||||||
static GstD3D11CompositionOverlay *
|
static GstD3D11CompositionOverlay *
|
||||||
|
@ -127,14 +125,11 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self,
|
||||||
ID3D11Device *device_handle;
|
ID3D11Device *device_handle;
|
||||||
ID3D11DeviceContext *context_handle;
|
ID3D11DeviceContext *context_handle;
|
||||||
GstD3D11Device *device = self->device;
|
GstD3D11Device *device = self->device;
|
||||||
const guint index_count = 2 * 3;
|
|
||||||
FLOAT x1, y1, x2, y2;
|
FLOAT x1, y1, x2, y2;
|
||||||
gdouble val;
|
gdouble val;
|
||||||
/* *INDENT-OFF* */
|
ComPtr < ID3D11Texture2D > texture;
|
||||||
ComPtr<ID3D11Texture2D> texture;
|
ComPtr < ID3D11ShaderResourceView > srv;
|
||||||
ComPtr<ID3D11ShaderResourceView> srv;
|
ComPtr < ID3D11Buffer > vertex_buffer;
|
||||||
ComPtr<ID3D11Buffer> vertex_buffer;
|
|
||||||
/* *INDENT-ON* */
|
|
||||||
|
|
||||||
g_return_val_if_fail (overlay_rect != NULL, NULL);
|
g_return_val_if_fail (overlay_rect != NULL, NULL);
|
||||||
|
|
||||||
|
@ -250,29 +245,29 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self,
|
||||||
vertex_data[0].position.x = x1;
|
vertex_data[0].position.x = x1;
|
||||||
vertex_data[0].position.y = y1;
|
vertex_data[0].position.y = y1;
|
||||||
vertex_data[0].position.z = 0.0f;
|
vertex_data[0].position.z = 0.0f;
|
||||||
vertex_data[0].texture.x = 0.0f;
|
vertex_data[0].texture.u = 0.0f;
|
||||||
vertex_data[0].texture.y = 1.0f;
|
vertex_data[0].texture.v = 1.0f;
|
||||||
|
|
||||||
/* top left */
|
/* top left */
|
||||||
vertex_data[1].position.x = x1;
|
vertex_data[1].position.x = x1;
|
||||||
vertex_data[1].position.y = y2;
|
vertex_data[1].position.y = y2;
|
||||||
vertex_data[1].position.z = 0.0f;
|
vertex_data[1].position.z = 0.0f;
|
||||||
vertex_data[1].texture.x = 0.0f;
|
vertex_data[1].texture.u = 0.0f;
|
||||||
vertex_data[1].texture.y = 0.0f;
|
vertex_data[1].texture.v = 0.0f;
|
||||||
|
|
||||||
/* top right */
|
/* top right */
|
||||||
vertex_data[2].position.x = x2;
|
vertex_data[2].position.x = x2;
|
||||||
vertex_data[2].position.y = y2;
|
vertex_data[2].position.y = y2;
|
||||||
vertex_data[2].position.z = 0.0f;
|
vertex_data[2].position.z = 0.0f;
|
||||||
vertex_data[2].texture.x = 1.0f;
|
vertex_data[2].texture.u = 1.0f;
|
||||||
vertex_data[2].texture.y = 0.0f;
|
vertex_data[2].texture.v = 0.0f;
|
||||||
|
|
||||||
/* bottom right */
|
/* bottom right */
|
||||||
vertex_data[3].position.x = x2;
|
vertex_data[3].position.x = x2;
|
||||||
vertex_data[3].position.y = y1;
|
vertex_data[3].position.y = y1;
|
||||||
vertex_data[3].position.z = 0.0f;
|
vertex_data[3].position.z = 0.0f;
|
||||||
vertex_data[3].texture.x = 1.0f;
|
vertex_data[3].texture.u = 1.0f;
|
||||||
vertex_data[3].texture.y = 1.0f;
|
vertex_data[3].texture.v = 1.0f;
|
||||||
|
|
||||||
context_handle->Unmap (vertex_buffer.Get (), 0);
|
context_handle->Unmap (vertex_buffer.Get (), 0);
|
||||||
gst_d3d11_device_unlock (device);
|
gst_d3d11_device_unlock (device);
|
||||||
|
@ -281,10 +276,7 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self,
|
||||||
overlay->overlay_rect = gst_video_overlay_rectangle_ref (overlay_rect);
|
overlay->overlay_rect = gst_video_overlay_rectangle_ref (overlay_rect);
|
||||||
overlay->texture = texture.Detach ();
|
overlay->texture = texture.Detach ();
|
||||||
overlay->srv = srv.Detach ();
|
overlay->srv = srv.Detach ();
|
||||||
overlay->quad = gst_d3d11_quad_new (device,
|
overlay->vertex_buffer = vertex_buffer.Detach ();
|
||||||
self->ps, self->vs, self->layout, nullptr, 0,
|
|
||||||
vertex_buffer.Get (), sizeof (VertexData),
|
|
||||||
self->index_buffer, DXGI_FORMAT_R16_UINT, index_count);
|
|
||||||
|
|
||||||
return overlay;
|
return overlay;
|
||||||
}
|
}
|
||||||
|
@ -300,9 +292,7 @@ gst_d3d11_composition_overlay_free (GstD3D11CompositionOverlay * overlay)
|
||||||
|
|
||||||
GST_D3D11_CLEAR_COM (overlay->srv);
|
GST_D3D11_CLEAR_COM (overlay->srv);
|
||||||
GST_D3D11_CLEAR_COM (overlay->texture);
|
GST_D3D11_CLEAR_COM (overlay->texture);
|
||||||
|
GST_D3D11_CLEAR_COM (overlay->vertex_buffer);
|
||||||
if (overlay->quad)
|
|
||||||
gst_d3d11_quad_free (overlay->quad);
|
|
||||||
|
|
||||||
g_free (overlay);
|
g_free (overlay);
|
||||||
}
|
}
|
||||||
|
@ -320,15 +310,12 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self,
|
||||||
WORD *indices;
|
WORD *indices;
|
||||||
ID3D11Device *device_handle;
|
ID3D11Device *device_handle;
|
||||||
ID3D11DeviceContext *context_handle;
|
ID3D11DeviceContext *context_handle;
|
||||||
/* *INDENT-OFF* */
|
ComPtr < ID3D11PixelShader > ps;
|
||||||
ComPtr<ID3D11PixelShader> ps;
|
ComPtr < ID3D11VertexShader > vs;
|
||||||
ComPtr<ID3D11VertexShader> vs;
|
ComPtr < ID3D11InputLayout > layout;
|
||||||
ComPtr<ID3D11InputLayout> layout;
|
ComPtr < ID3D11SamplerState > sampler;
|
||||||
ComPtr<ID3D11SamplerState> sampler;
|
ComPtr < ID3D11BlendState > blend;
|
||||||
ComPtr<ID3D11BlendState> blend;
|
ComPtr < ID3D11Buffer > index_buffer;
|
||||||
ComPtr<ID3D11Buffer> index_buffer;
|
|
||||||
/* *INDENT-ON* */
|
|
||||||
const guint index_count = 2 * 3;
|
|
||||||
|
|
||||||
memset (&sampler_desc, 0, sizeof (sampler_desc));
|
memset (&sampler_desc, 0, sizeof (sampler_desc));
|
||||||
memset (input_desc, 0, sizeof (input_desc));
|
memset (input_desc, 0, sizeof (input_desc));
|
||||||
|
@ -401,7 +388,7 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self,
|
||||||
}
|
}
|
||||||
|
|
||||||
buffer_desc.Usage = D3D11_USAGE_DYNAMIC;
|
buffer_desc.Usage = D3D11_USAGE_DYNAMIC;
|
||||||
buffer_desc.ByteWidth = sizeof (WORD) * index_count;
|
buffer_desc.ByteWidth = sizeof (WORD) * 6;
|
||||||
buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
|
||||||
buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
|
||||||
|
|
||||||
|
@ -445,7 +432,6 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self,
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GstD3D11OverlayCompositor *
|
GstD3D11OverlayCompositor *
|
||||||
gst_d3d11_overlay_compositor_new (GstD3D11Device * device,
|
gst_d3d11_overlay_compositor_new (GstD3D11Device * device,
|
||||||
GstVideoInfo * out_info)
|
GstVideoInfo * out_info)
|
||||||
|
@ -623,23 +609,39 @@ gboolean
|
||||||
gst_d3d11_overlay_compositor_draw_unlocked (GstD3D11OverlayCompositor *
|
gst_d3d11_overlay_compositor_draw_unlocked (GstD3D11OverlayCompositor *
|
||||||
compositor, ID3D11RenderTargetView * rtv[GST_VIDEO_MAX_PLANES])
|
compositor, ID3D11RenderTargetView * rtv[GST_VIDEO_MAX_PLANES])
|
||||||
{
|
{
|
||||||
gboolean ret = TRUE;
|
|
||||||
GList *iter;
|
GList *iter;
|
||||||
|
ID3D11DeviceContext *context;
|
||||||
|
ID3D11ShaderResourceView *clear_view[GST_VIDEO_MAX_PLANES] = { nullptr, };
|
||||||
|
UINT strides = sizeof (VertexData);
|
||||||
|
UINT offsets = 0;
|
||||||
|
|
||||||
g_return_val_if_fail (compositor != NULL, FALSE);
|
g_return_val_if_fail (compositor != NULL, FALSE);
|
||||||
g_return_val_if_fail (rtv != NULL, FALSE);
|
g_return_val_if_fail (rtv != NULL, FALSE);
|
||||||
|
|
||||||
|
context = gst_d3d11_device_get_device_context_handle (compositor->device);
|
||||||
|
context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
|
context->IASetInputLayout (compositor->layout);
|
||||||
|
context->IASetIndexBuffer (compositor->index_buffer, DXGI_FORMAT_R16_UINT, 0);
|
||||||
|
context->PSSetSamplers (0, 1, &compositor->sampler);
|
||||||
|
context->VSSetShader (compositor->vs, nullptr, 0);
|
||||||
|
context->PSSetShader (compositor->ps, nullptr, 0);
|
||||||
|
context->RSSetViewports (1, &compositor->viewport);
|
||||||
|
context->OMSetRenderTargets (1, rtv, nullptr);
|
||||||
|
context->OMSetBlendState (compositor->blend, nullptr, 0xffffffff);
|
||||||
|
|
||||||
for (iter = compositor->overlays; iter; iter = g_list_next (iter)) {
|
for (iter = compositor->overlays; iter; iter = g_list_next (iter)) {
|
||||||
GstD3D11CompositionOverlay *overlay =
|
GstD3D11CompositionOverlay *overlay =
|
||||||
(GstD3D11CompositionOverlay *) iter->data;
|
(GstD3D11CompositionOverlay *) iter->data;
|
||||||
|
|
||||||
ret = gst_d3d11_draw_quad_unlocked (overlay->quad,
|
context->PSSetShaderResources (0, 1, &overlay->srv);
|
||||||
&compositor->viewport, 1, &overlay->srv, 1, rtv, 1,
|
context->IASetVertexBuffers (0,
|
||||||
compositor->blend, NULL, &compositor->sampler, 1);
|
1, &overlay->vertex_buffer, &strides, &offsets);
|
||||||
|
|
||||||
if (!ret)
|
context->DrawIndexed (6, 0, 0);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
context->PSSetShaderResources (0, 1, clear_view);
|
||||||
|
context->OMSetRenderTargets (0, nullptr, nullptr);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue