d3d11testsrc: Set rasterizer state

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5572>
This commit is contained in:
Seungha Yang 2023-10-27 23:24:15 +09:00
parent 5f44390b3e
commit 1a82c9b9ab

View file

@ -42,6 +42,8 @@
#include <string.h> #include <string.h>
#include <d2d1.h> #include <d2d1.h>
#include <math.h> #include <math.h>
#include <memory>
#include <vector>
/* *INDENT-OFF* */ /* *INDENT-OFF* */
using namespace Microsoft::WRL; using namespace Microsoft::WRL;
@ -187,49 +189,52 @@ enum
COLOR_DARK_GREY, COLOR_DARK_GREY,
}; };
typedef struct struct SnowConstBuffer
{ {
FLOAT time; FLOAT time = 0.0f;
FLOAT alpha; FLOAT alpha = 1.0f;
FLOAT padding[2]; FLOAT padding[2];
} SnowConstBuffer; };
typedef struct struct CheckerConstBuffer
{ {
FLOAT width; FLOAT width;
FLOAT height; FLOAT height;
FLOAT checker_size; FLOAT checker_size;
FLOAT alpha; FLOAT alpha = 1.0f;
} CheckerConstBuffer; };
typedef struct struct GstD3D11TestSrcQuad
{ {
ID3D11PixelShader *ps; ComPtr < ID3D11PixelShader > ps;
ID3D11VertexShader *vs; ComPtr < ID3D11VertexShader > vs;
ID3D11InputLayout *layout; ComPtr < ID3D11InputLayout > layout;
ID3D11Buffer *vertex_buffer; ComPtr < ID3D11Buffer > vertex_buffer;
ID3D11Buffer *index_buffer; ComPtr < ID3D11Buffer > index_buffer;
ID3D11Buffer *const_buffer; ComPtr < ID3D11Buffer > const_buffer;
guint vertex_stride; guint vertex_stride = 0;
guint index_count; guint index_count = 0;
gboolean is_checker; gboolean is_checker = FALSE;
gboolean is_snow; gboolean is_snow = FALSE;
CheckerConstBuffer checker_const_buffer; CheckerConstBuffer checker_const_buffer;
SnowConstBuffer snow_const_buffer; SnowConstBuffer snow_const_buffer;
} GstD3D11TestSrcQuad; };
typedef struct struct StaticColor
{ {
ColorValue value; ColorValue value;
gboolean is_valid; gboolean is_valid = FALSE;
} StaticColor; };
typedef struct /* *INDENT-OFF* */
struct GstD3D11TestSrcRender
{ {
StaticColor static_color[2]; StaticColor static_color[2];
GstD3D11TestSrcQuad *quad[2]; std::vector < std::shared_ptr < GstD3D11TestSrcQuad >> quad;
ComPtr <ID3D11RasterizerState> rs;
GstD3D11TestSrcPattern pattern; GstD3D11TestSrcPattern pattern;
} GstD3D11TestSrcRender; };
/* *INDENT-ON* */
struct _GstD3D11TestSrc struct _GstD3D11TestSrc
{ {
@ -259,7 +264,7 @@ struct _GstD3D11TestSrc
GstClockTime running_time; GstClockTime running_time;
}; };
typedef struct struct UvVertexData
{ {
struct struct
{ {
@ -272,9 +277,9 @@ typedef struct
FLOAT u; FLOAT u;
FLOAT v; FLOAT v;
} texture; } texture;
} UvVertexData; };
typedef struct struct ColorVertexData
{ {
struct struct
{ {
@ -289,7 +294,7 @@ typedef struct
FLOAT b; FLOAT b;
FLOAT a; FLOAT a;
} color; } color;
} ColorVertexData; };
static gboolean static gboolean
setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render,
@ -310,7 +315,6 @@ setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render,
ComPtr < ID3D11Buffer > vertex_buffer; ComPtr < ID3D11Buffer > vertex_buffer;
ComPtr < ID3D11Buffer > index_buffer; ComPtr < ID3D11Buffer > index_buffer;
ComPtr < ID3D11Buffer > const_buffer; ComPtr < ID3D11Buffer > const_buffer;
GstD3D11TestSrcQuad *quad;
memset (&buffer_desc, 0, sizeof (buffer_desc)); memset (&buffer_desc, 0, sizeof (buffer_desc));
@ -458,24 +462,22 @@ setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render,
context_handle->Unmap (vertex_buffer.Get (), 0); context_handle->Unmap (vertex_buffer.Get (), 0);
context_handle->Unmap (index_buffer.Get (), 0); context_handle->Unmap (index_buffer.Get (), 0);
quad = g_new0 (GstD3D11TestSrcQuad, 1); auto quad = std::make_shared < GstD3D11TestSrcQuad > ();
if (on_smpte)
render->quad[1] = quad;
else
render->quad[0] = quad;
quad->ps = ps.Detach (); quad->ps = ps;
quad->vs = vs.Detach (); quad->vs = vs;
quad->layout = layout.Detach (); quad->layout = layout;
quad->vertex_buffer = vertex_buffer.Detach (); quad->vertex_buffer = vertex_buffer;
quad->index_buffer = index_buffer.Detach (); quad->index_buffer = index_buffer;
quad->const_buffer = const_buffer.Detach (); quad->const_buffer = const_buffer;
quad->vertex_stride = sizeof (UvVertexData); quad->vertex_stride = sizeof (UvVertexData);
quad->index_count = 6; quad->index_count = 6;
quad->is_snow = TRUE; quad->is_snow = TRUE;
quad->snow_const_buffer.time = 0; quad->snow_const_buffer.time = 0;
quad->snow_const_buffer.alpha = self->alpha; quad->snow_const_buffer.alpha = self->alpha;
render->quad.push_back (quad);
return TRUE; return TRUE;
} }
@ -496,7 +498,6 @@ setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render)
ComPtr < ID3D11InputLayout > layout; ComPtr < ID3D11InputLayout > layout;
ComPtr < ID3D11Buffer > vertex_buffer; ComPtr < ID3D11Buffer > vertex_buffer;
ComPtr < ID3D11Buffer > index_buffer; ComPtr < ID3D11Buffer > index_buffer;
GstD3D11TestSrcQuad *quad;
guint num_vertex = 0; guint num_vertex = 0;
guint num_index = 0; guint num_index = 0;
@ -794,16 +795,18 @@ setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render)
context_handle->Unmap (vertex_buffer.Get (), 0); context_handle->Unmap (vertex_buffer.Get (), 0);
context_handle->Unmap (index_buffer.Get (), 0); context_handle->Unmap (index_buffer.Get (), 0);
render->quad[0] = quad = g_new0 (GstD3D11TestSrcQuad, 1); auto quad = std::make_shared < GstD3D11TestSrcQuad > ();
quad->ps = ps.Detach (); quad->ps = ps;
quad->vs = vs.Detach (); quad->vs = vs;
quad->layout = layout.Detach (); quad->layout = layout;
quad->vertex_buffer = vertex_buffer.Detach (); quad->vertex_buffer = vertex_buffer;
quad->index_buffer = index_buffer.Detach (); quad->index_buffer = index_buffer;
quad->vertex_stride = sizeof (ColorVertexData); quad->vertex_stride = sizeof (ColorVertexData);
quad->index_count = 6 * 20; quad->index_count = 6 * 20;
render->quad.push_back (quad);
return setup_snow_render (self, render, TRUE); return setup_snow_render (self, render, TRUE);
} }
@ -826,7 +829,6 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render,
ComPtr < ID3D11Buffer > vertex_buffer; ComPtr < ID3D11Buffer > vertex_buffer;
ComPtr < ID3D11Buffer > index_buffer; ComPtr < ID3D11Buffer > index_buffer;
ComPtr < ID3D11Buffer > const_buffer; ComPtr < ID3D11Buffer > const_buffer;
GstD3D11TestSrcQuad *quad;
memset (&buffer_desc, 0, sizeof (buffer_desc)); memset (&buffer_desc, 0, sizeof (buffer_desc));
@ -931,14 +933,14 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render,
context_handle->Unmap (vertex_buffer.Get (), 0); context_handle->Unmap (vertex_buffer.Get (), 0);
context_handle->Unmap (index_buffer.Get (), 0); context_handle->Unmap (index_buffer.Get (), 0);
render->quad[0] = quad = g_new0 (GstD3D11TestSrcQuad, 1); auto quad = std::make_shared < GstD3D11TestSrcQuad > ();
quad->ps = ps.Detach (); quad->ps = ps;
quad->vs = vs.Detach (); quad->vs = vs;
quad->layout = layout.Detach (); quad->layout = layout;
quad->vertex_buffer = vertex_buffer.Detach (); quad->vertex_buffer = vertex_buffer;
quad->index_buffer = index_buffer.Detach (); quad->index_buffer = index_buffer;
quad->const_buffer = const_buffer.Detach (); quad->const_buffer = const_buffer;
quad->vertex_stride = sizeof (UvVertexData); quad->vertex_stride = sizeof (UvVertexData);
quad->index_count = 6; quad->index_count = 6;
quad->is_checker = TRUE; quad->is_checker = TRUE;
@ -947,6 +949,8 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render,
quad->checker_const_buffer.checker_size = checker_size; quad->checker_const_buffer.checker_size = checker_size;
quad->checker_const_buffer.alpha = self->alpha; quad->checker_const_buffer.alpha = self->alpha;
render->quad.push_back (quad);
return TRUE; return TRUE;
} }
@ -1243,34 +1247,6 @@ gst_d3d11_test_src_fixate (GstBaseSrc * bsrc, GstCaps * caps)
return GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps); return GST_BASE_SRC_CLASS (parent_class)->fixate (bsrc, caps);
} }
static void
gst_d3d11_test_src_quad_free (GstD3D11TestSrcQuad * quad)
{
if (!quad)
return;
GST_D3D11_CLEAR_COM (quad->ps);
GST_D3D11_CLEAR_COM (quad->vs);
GST_D3D11_CLEAR_COM (quad->layout);
GST_D3D11_CLEAR_COM (quad->vertex_buffer);
GST_D3D11_CLEAR_COM (quad->index_buffer);
GST_D3D11_CLEAR_COM (quad->const_buffer);
g_free (quad);
}
static void
gst_d3d11_test_src_render_free (GstD3D11TestSrcRender * render)
{
if (!render)
return;
for (guint i = 0; i < G_N_ELEMENTS (render->quad); i++)
g_clear_pointer (&render->quad[i], gst_d3d11_test_src_quad_free);
g_free (render);
}
static void static void
gst_d3d11_test_src_clear_resource (GstD3D11TestSrc * self) gst_d3d11_test_src_clear_resource (GstD3D11TestSrc * self)
{ {
@ -1284,7 +1260,11 @@ gst_d3d11_test_src_clear_resource (GstD3D11TestSrc * self)
gst_clear_object (&self->convert_pool); gst_clear_object (&self->convert_pool);
} }
g_clear_pointer (&self->render, gst_d3d11_test_src_render_free); if (self->render) {
delete self->render;
self->render = nullptr;
}
gst_clear_object (&self->converter); gst_clear_object (&self->converter);
} }
@ -1296,6 +1276,7 @@ gst_d3d11_test_src_setup_resource (GstD3D11TestSrc * self, GstCaps * caps)
GstD3D11AllocationParams *params; GstD3D11AllocationParams *params;
GstD3D11TestSrcRender *render; GstD3D11TestSrcRender *render;
GstStructure *config; GstStructure *config;
HRESULT hr;
config = gst_structure_new ("converter-config", config = gst_structure_new ("converter-config",
GST_D3D11_CONVERTER_OPT_BACKEND, GST_TYPE_D3D11_CONVERTER_BACKEND, GST_D3D11_CONVERTER_OPT_BACKEND, GST_TYPE_D3D11_CONVERTER_BACKEND,
@ -1357,9 +1338,15 @@ gst_d3d11_test_src_setup_resource (GstD3D11TestSrc * self, GstCaps * caps)
self->viewport.MinDepth = 0.0f; self->viewport.MinDepth = 0.0f;
self->viewport.MaxDepth = 1.0f; self->viewport.MaxDepth = 1.0f;
self->render = render = g_new0 (GstD3D11TestSrcRender, 1); self->render = render = new GstD3D11TestSrcRender ();
render->pattern = self->pattern; render->pattern = self->pattern;
hr = gst_d3d11_device_get_rasterizer (self->device, &render->rs);
if (!gst_d3d11_result (hr, self->device)) {
GST_ERROR_OBJECT (self, "Couldn't get rasterizer state");
goto error;
}
switch (self->pattern) { switch (self->pattern) {
case GST_D3D11_TEST_SRC_SMPTE: case GST_D3D11_TEST_SRC_SMPTE:
if (!setup_smpte_render (self, render)) if (!setup_smpte_render (self, render))
@ -1895,18 +1882,15 @@ gst_d3d11_test_src_draw_pattern (GstD3D11TestSrc * self,
context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); context->IASetPrimitiveTopology (D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
context->RSSetViewports (1, &self->viewport); context->RSSetViewports (1, &self->viewport);
context->RSSetState (render->rs.Get ());
context->OMSetRenderTargets (1, &rtv, nullptr); context->OMSetRenderTargets (1, &rtv, nullptr);
context->OMSetBlendState (nullptr, nullptr, 0xffffffff); context->OMSetBlendState (nullptr, nullptr, 0xffffffff);
for (guint i = 0; i < G_N_ELEMENTS (render->quad); i++) { /* *INDENT-OFF* */
GstD3D11TestSrcQuad *quad = render->quad[i]; for (auto quad : render->quad) {
if (!quad)
break;
if (quad->const_buffer) { if (quad->const_buffer) {
hr = context->Map (quad->const_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, hr = context->Map (quad->const_buffer.Get (),
&map); 0, D3D11_MAP_WRITE_DISCARD, 0, &map);
if (!gst_d3d11_result (hr, self->device)) { if (!gst_d3d11_result (hr, self->device)) {
GST_ERROR_OBJECT (self, "Failed to map constant buffer"); GST_ERROR_OBJECT (self, "Failed to map constant buffer");
return FALSE; return FALSE;
@ -1923,23 +1907,27 @@ gst_d3d11_test_src_draw_pattern (GstD3D11TestSrc * self,
sizeof (CheckerConstBuffer)); sizeof (CheckerConstBuffer));
} }
context->Unmap (quad->const_buffer, 0); context->Unmap (quad->const_buffer.Get (), 0);
context->PSSetConstantBuffers (0, 1, &quad->const_buffer); ID3D11Buffer *const_bufs[] = { quad->const_buffer.Get () };
context->PSSetConstantBuffers (0, 1, const_bufs);
} else { } else {
context->PSSetConstantBuffers (0, 0, nullptr); context->PSSetConstantBuffers (0, 0, nullptr);
} }
context->IASetInputLayout (quad->layout); context->IASetInputLayout (quad->layout.Get ());
context->IASetVertexBuffers (0, 1, &quad->vertex_buffer, ID3D11Buffer *vertex_buf[] = { quad->vertex_buffer.Get () };
context->IASetVertexBuffers (0, 1, vertex_buf,
&quad->vertex_stride, &offsets); &quad->vertex_stride, &offsets);
context->IASetIndexBuffer (quad->index_buffer, DXGI_FORMAT_R16_UINT, 0); context->IASetIndexBuffer (quad->index_buffer.Get (), DXGI_FORMAT_R16_UINT,
0);
context->VSSetShader (quad->vs, nullptr, 0); context->VSSetShader (quad->vs.Get (), nullptr, 0);
context->PSSetShader (quad->ps, nullptr, 0); context->PSSetShader (quad->ps.Get (), nullptr, 0);
context->DrawIndexed (quad->index_count, 0, 0); context->DrawIndexed (quad->index_count, 0, 0);
} }
/* *INDENT-ON* */
context->OMSetRenderTargets (0, nullptr, nullptr); context->OMSetRenderTargets (0, nullptr, nullptr);