From cb3c1390f296d34704593e3712b6b100a1ccb8d3 Mon Sep 17 00:00:00 2001 From: Seungha Yang Date: Wed, 15 Nov 2023 00:38:14 +0900 Subject: [PATCH] d3d11: Avoid ID3D11DeviceContext::Map if possible Allocate resource with initial date instead of calling Map/Unmap after allocation Part-of: --- .../gst-libs/gst/d3d11/gstd3d11converter.cpp | 11 +- .../sys/d3d11/gstd3d11compositor.cpp | 73 ++--- .../sys/d3d11/gstd3d11overlaycompositor.cpp | 88 ++---- .../sys/d3d11/gstd3d11testsrc.cpp | 284 +++++++----------- 4 files changed, 161 insertions(+), 295 deletions(-) diff --git a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp index 7d35719e67..d1d636e4a1 100644 --- a/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp +++ b/subprojects/gst-plugins-bad/gst-libs/gst/d3d11/gstd3d11converter.cpp @@ -768,7 +768,7 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, HRESULT hr; D3D11_BUFFER_DESC buffer_desc; VertexData vertex_data[4]; - WORD indices[6]; + const WORD indices[6] = { 0, 1, 2, 3, 0, 2 }; ID3D11Device *device_handle; ComPtr < ID3D11VertexShader > vs; ComPtr < ID3D11InputLayout > layout; @@ -920,15 +920,6 @@ gst_d3d11_color_convert_setup_shader (GstD3D11Converter * self, return FALSE; } - /* clockwise indexing */ - indices[0] = 0; /* bottom left */ - indices[1] = 1; /* top left */ - indices[2] = 2; /* top right */ - - indices[3] = 3; /* bottom right */ - indices[4] = 0; /* bottom left */ - indices[5] = 2; /* top right */ - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; buffer_desc.ByteWidth = sizeof (WORD) * 6; buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11compositor.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11compositor.cpp index d068324b1f..d0adb6f94a 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11compositor.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11compositor.cpp @@ -1827,12 +1827,11 @@ gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self, const GstVideoInfo * info) { GstD3D11CompositorQuad *quad = nullptr; - VertexData *vertex_data; - WORD *indices; + VertexData vertex_data[4]; + const WORD indices[6] = { 0, 1, 2, 3, 0, 2 }; ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; - D3D11_MAPPED_SUBRESOURCE map; D3D11_BUFFER_DESC buffer_desc; + D3D11_SUBRESOURCE_DATA subresource; ComPtr < ID3D11Buffer > vertex_buffer; ComPtr < ID3D11Buffer > index_buffer; ComPtr < ID3D11PixelShader > ps; @@ -1842,7 +1841,6 @@ gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self, HRESULT hr; device_handle = gst_d3d11_device_get_device_handle (self->device); - context_handle = gst_d3d11_device_get_device_context_handle (self->device); if (GST_VIDEO_INFO_IS_RGB (info)) { hr = gst_d3d11_get_pixel_shader_checker_rgb (self->device, &ps); @@ -1869,28 +1867,6 @@ gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self, return nullptr; } - memset (&buffer_desc, 0, sizeof (D3D11_BUFFER_DESC)); - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (VertexData) * 4; - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, - "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); - return nullptr; - } - - hr = context_handle->Map (vertex_buffer.Get (), - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Couldn't map vertex buffer, hr: 0x%x", (guint) hr); - return nullptr; - } - - vertex_data = (VertexData *) map.pData; /* bottom left */ vertex_data[0].position.x = -1.0f; vertex_data[0].position.y = -1.0f; @@ -1919,40 +1895,39 @@ gst_d3d11_compositor_create_checker_quad (GstD3D11Compositor * self, vertex_data[3].texture.u = 1.0f; vertex_data[3].texture.v = 1.0f; - context_handle->Unmap (vertex_buffer.Get (), 0); + memset (&subresource, 0, sizeof (D3D11_SUBRESOURCE_DATA)); + memset (&buffer_desc, 0, sizeof (D3D11_BUFFER_DESC)); + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (VertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + subresource.pSysMem = vertex_data; + subresource.SysMemPitch = sizeof (VertexData) * 4; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, + "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); + return nullptr; + } buffer_desc.Usage = D3D11_USAGE_DYNAMIC; buffer_desc.ByteWidth = sizeof (WORD) * 6; buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); + subresource.pSysMem = indices; + subresource.SysMemPitch = sizeof (WORD) * 6; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &index_buffer); if (!gst_d3d11_result (hr, self->device)) { GST_ERROR_OBJECT (self, "Couldn't create index buffer, hr: 0x%x", (guint) hr); return nullptr; } - hr = context_handle->Map (index_buffer.Get (), - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Couldn't map index buffer, hr: 0x%x", (guint) hr); - return nullptr; - } - - indices = (WORD *) map.pData; - - /* clockwise indexing */ - indices[0] = 0; /* bottom left */ - indices[1] = 1; /* top left */ - indices[2] = 2; /* top right */ - - indices[3] = 3; /* bottom right */ - indices[4] = 0; /* bottom left */ - indices[5] = 2; /* top right */ - - context_handle->Unmap (index_buffer.Get (), 0); quad = g_new0 (GstD3D11CompositorQuad, 1); quad->ps = ps.Detach (); quad->vs = vs.Detach (); diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11overlaycompositor.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11overlaycompositor.cpp index d6e63f04ed..2f611a8aaf 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11overlaycompositor.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11overlaycompositor.cpp @@ -126,12 +126,11 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, GstD3D11OverlayCompositorPrivate *priv = self->priv; gint x, y; guint width, height; - D3D11_SUBRESOURCE_DATA subresource_data; + D3D11_SUBRESOURCE_DATA subresource; D3D11_TEXTURE2D_DESC texture_desc; D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc; D3D11_BUFFER_DESC buffer_desc; - D3D11_MAPPED_SUBRESOURCE map; - VertexData *vertex_data; + VertexData vertex_data[4]; GstBuffer *buf; GstVideoMeta *vmeta; GstMapInfo info; @@ -139,7 +138,6 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, gint stride; HRESULT hr; ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; GstD3D11Device *device = self->device; FLOAT x1, y1, x2, y2; gdouble val; @@ -151,13 +149,12 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, GstMemory *mem; gboolean is_d3d11 = FALSE; - memset (&subresource_data, 0, sizeof (subresource_data)); + memset (&subresource, 0, sizeof (subresource)); memset (&texture_desc, 0, sizeof (texture_desc)); memset (&srv_desc, 0, sizeof (srv_desc)); memset (&buffer_desc, 0, sizeof (buffer_desc)); device_handle = gst_d3d11_device_get_device_handle (device); - context_handle = gst_d3d11_device_get_device_context_handle (device); if (!gst_video_overlay_rectangle_get_render_rectangle (overlay_rect, &x, &y, &width, &height)) { @@ -207,9 +204,8 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, } /* Do create texture and upload data at once, for create immutable texture */ - subresource_data.pSysMem = data; - subresource_data.SysMemPitch = stride; - subresource_data.SysMemSlicePitch = 0; + subresource.pSysMem = data; + subresource.SysMemPitch = stride; texture_desc.Width = vmeta->width; texture_desc.Height = vmeta->height; @@ -222,8 +218,7 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, texture_desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; texture_desc.CPUAccessFlags = 0; - hr = device_handle->CreateTexture2D (&texture_desc, - &subresource_data, &texture); + hr = device_handle->CreateTexture2D (&texture_desc, &subresource, &texture); gst_video_meta_unmap (vmeta, 0, &info); if (!gst_d3d11_result (hr, device)) { @@ -242,28 +237,6 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, } } - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (VertexData) * 4; - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, - "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); - return nullptr; - } - - GstD3D11DeviceLockGuard lk (device); - hr = context_handle->Map (vertex_buffer.Get (), - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Couldn't map vertex buffer, hr: 0x%x", (guint) hr); - return nullptr; - } - - vertex_data = (VertexData *) map.pData; /* bottom left */ gst_util_fraction_to_double (x, GST_VIDEO_INFO_WIDTH (&priv->info), &val); x1 = (val * 2.0f) - 1.0f; @@ -308,7 +281,20 @@ gst_d3d11_composition_overlay_new (GstD3D11OverlayCompositor * self, vertex_data[3].texture.u = 1.0f; vertex_data[3].texture.v = 1.0f; - context_handle->Unmap (vertex_buffer.Get (), 0); + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (VertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + subresource.pSysMem = vertex_data; + subresource.SysMemPitch = sizeof (VertexData) * 4; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &vertex_buffer); + if (!gst_d3d11_result (hr, device)) { + GST_ERROR_OBJECT (self, + "Couldn't create vertex buffer, hr: 0x%x", (guint) hr); + return nullptr; + } auto overlay = std::make_shared < GstD3D11CompositionOverlay > (); overlay->overlay_rect = gst_video_overlay_rectangle_ref (overlay_rect); @@ -331,10 +317,9 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self) HRESULT hr; D3D11_BUFFER_DESC buffer_desc; D3D11_BLEND_DESC blend_desc; - D3D11_MAPPED_SUBRESOURCE map; - WORD *indices; + D3D11_SUBRESOURCE_DATA subresource; + const WORD indices[6] = { 0, 1, 2, 3, 0, 2 }; ID3D11Device *device_handle; - ID3D11DeviceContext *context_handle; ComPtr < ID3D11PixelShader > ps; ComPtr < ID3D11PixelShader > premul_ps; ComPtr < ID3D11VertexShader > vs; @@ -346,9 +331,9 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self) memset (&buffer_desc, 0, sizeof (buffer_desc)); memset (&blend_desc, 0, sizeof (blend_desc)); + memset (&subresource, 0, sizeof (subresource)); device_handle = gst_d3d11_device_get_device_handle (device); - context_handle = gst_d3d11_device_get_device_context_handle (device); hr = gst_d3d11_device_get_sampler (device, D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT, &sampler); @@ -406,35 +391,16 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self) buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); + subresource.pSysMem = indices; + subresource.SysMemPitch = sizeof (WORD) * 6; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &index_buffer); if (!gst_d3d11_result (hr, device)) { GST_ERROR_OBJECT (self, "Couldn't create index buffer, hr: 0x%x", (guint) hr); return FALSE; } - GstD3D11DeviceLockGuard lk (device); - hr = context_handle->Map (index_buffer.Get (), - 0, D3D11_MAP_WRITE_DISCARD, 0, &map); - - if (!gst_d3d11_result (hr, device)) { - GST_ERROR_OBJECT (self, "Couldn't map index buffer, hr: 0x%x", (guint) hr); - return FALSE; - } - - indices = (WORD *) map.pData; - - /* clockwise indexing */ - indices[0] = 0; /* bottom left */ - indices[1] = 1; /* top left */ - indices[2] = 2; /* top right */ - - indices[3] = 3; /* bottom right */ - indices[4] = 0; /* bottom left */ - indices[5] = 2; /* top right */ - - context_handle->Unmap (index_buffer.Get (), 0); - priv->ps = ps; priv->premul_ps = premul_ps; priv->vs = vs; diff --git a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11testsrc.cpp b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11testsrc.cpp index 402c483bf7..b0593a7010 100644 --- a/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11testsrc.cpp +++ b/subprojects/gst-plugins-bad/sys/d3d11/gstd3d11testsrc.cpp @@ -302,13 +302,11 @@ setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, { HRESULT hr; D3D11_BUFFER_DESC buffer_desc; - D3D11_MAPPED_SUBRESOURCE map; - UvVertexData *vertex_data; - WORD *indices; + D3D11_SUBRESOURCE_DATA subresource; + UvVertexData vertex_data[4]; + const WORD indices[6] = { 0, 1, 2, 3, 0, 2 }; ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (self->device); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (self->device); ComPtr < ID3D11PixelShader > ps; ComPtr < ID3D11VertexShader > vs; ComPtr < ID3D11InputLayout > layout; @@ -317,6 +315,7 @@ setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, ComPtr < ID3D11Buffer > const_buffer; memset (&buffer_desc, 0, sizeof (buffer_desc)); + memset (&subresource, 0, sizeof (subresource)); hr = gst_d3d11_get_vertex_shader_coord (self->device, &vs, &layout); if (!gst_d3d11_result (hr, self->device)) { @@ -330,56 +329,6 @@ setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, return FALSE; } - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (UvVertexData) * 4; - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); - return FALSE; - } - - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (WORD) * 6; - buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create index buffer"); - return FALSE; - } - - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (SnowConstBuffer); - buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &const_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create constant buffer"); - return FALSE; - } - - GstD3D11DeviceLockGuard lk (self->device); - hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map vertex buffer"); - return FALSE; - } - vertex_data = (UvVertexData *) map.pData; - - hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map index buffer"); - context_handle->Unmap (vertex_buffer.Get (), 0); - return FALSE; - } - indices = (WORD *) map.pData; - if (on_smpte) { FLOAT left, right, top, bottom; FLOAT left_u, right_u, top_v, bottom_v; @@ -450,17 +399,43 @@ setup_snow_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, vertex_data[3].texture.v = 1.0f; } - /* clockwise indexing */ - indices[0] = 0; /* bottom left */ - indices[1] = 1; /* top left */ - indices[2] = 2; /* top right */ + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (UvVertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - indices[3] = 3; /* bottom right */ - indices[4] = 0; /* bottom left */ - indices[5] = 2; /* top right */ + subresource.pSysMem = vertex_data; + subresource.SysMemPitch = sizeof (UvVertexData) * 4; - context_handle->Unmap (vertex_buffer.Get (), 0); - context_handle->Unmap (index_buffer.Get (), 0); + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + subresource.pSysMem = indices; + subresource.SysMemPitch = sizeof (WORD) * 6; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &index_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create index buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (SnowConstBuffer); + buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &const_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create constant buffer"); + return FALSE; + } auto quad = std::make_shared < GstD3D11TestSrcQuad > (); @@ -486,13 +461,11 @@ setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render) { HRESULT hr; D3D11_BUFFER_DESC buffer_desc; - D3D11_MAPPED_SUBRESOURCE map; - ColorVertexData *vertex_data; - WORD *indices; + D3D11_SUBRESOURCE_DATA subresource; + ColorVertexData vertex_data[4 * 20]; + WORD indices[6 * 20]; ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (self->device); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (self->device); ComPtr < ID3D11PixelShader > ps; ComPtr < ID3D11VertexShader > vs; ComPtr < ID3D11InputLayout > layout; @@ -502,6 +475,7 @@ setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render) guint num_index = 0; memset (&buffer_desc, 0, sizeof (buffer_desc)); + memset (&subresource, 0, sizeof (subresource)); hr = gst_d3d11_get_vertex_shader_color (self->device, &vs, &layout); if (!gst_d3d11_result (hr, self->device)) { @@ -515,46 +489,6 @@ setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render) return FALSE; } - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (ColorVertexData) * 4 * 20; - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); - return FALSE; - } - - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (WORD) * 6 * 20; - buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create index buffer"); - return FALSE; - } - - GstD3D11DeviceLockGuard lk (self->device); - hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map vertex buffer"); - return FALSE; - } - vertex_data = (ColorVertexData *) map.pData; - - hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map index buffer"); - context_handle->Unmap (vertex_buffer.Get (), 0); - return FALSE; - } - indices = (WORD *) map.pData; - /* top row */ for (guint i = 0; i < 7; i++) { FLOAT left, right, top, bottom; @@ -792,8 +726,33 @@ setup_smpte_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render) indices[idx_base + 5] = base + 2; /* top right */ } - context_handle->Unmap (vertex_buffer.Get (), 0); - context_handle->Unmap (index_buffer.Get (), 0); + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (ColorVertexData) * 4 * 20; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + subresource.pSysMem = vertex_data; + subresource.SysMemPitch = sizeof (ColorVertexData) * 4 * 20; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6 * 20; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + subresource.pSysMem = indices; + subresource.SysMemPitch = sizeof (WORD) * 6 * 20; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &index_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create index buffer"); + return FALSE; + } auto quad = std::make_shared < GstD3D11TestSrcQuad > (); @@ -816,13 +775,11 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, { HRESULT hr; D3D11_BUFFER_DESC buffer_desc; - D3D11_MAPPED_SUBRESOURCE map; - UvVertexData *vertex_data; - WORD *indices; + D3D11_SUBRESOURCE_DATA subresource; + UvVertexData vertex_data[4]; + const WORD indices[6] = { 0, 1, 2, 3, 0, 2 }; ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (self->device); - ID3D11DeviceContext *context_handle = - gst_d3d11_device_get_device_context_handle (self->device); ComPtr < ID3D11PixelShader > ps; ComPtr < ID3D11VertexShader > vs; ComPtr < ID3D11InputLayout > layout; @@ -831,6 +788,7 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, ComPtr < ID3D11Buffer > const_buffer; memset (&buffer_desc, 0, sizeof (buffer_desc)); + memset (&subresource, 0, sizeof (subresource)); hr = gst_d3d11_get_vertex_shader_coord (self->device, &vs, &layout); if (!gst_d3d11_result (hr, self->device)) { @@ -844,56 +802,6 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, return FALSE; } - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (UvVertexData) * 4; - buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &vertex_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); - return FALSE; - } - - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (WORD) * 6; - buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &index_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create index buffer"); - return FALSE; - } - - buffer_desc.Usage = D3D11_USAGE_DYNAMIC; - buffer_desc.ByteWidth = sizeof (CheckerConstBuffer); - buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &const_buffer); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to create constant buffer"); - return FALSE; - } - - GstD3D11DeviceLockGuard lk (self->device); - hr = context_handle->Map (vertex_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map vertex buffer"); - return FALSE; - } - vertex_data = (UvVertexData *) map.pData; - - hr = context_handle->Map (index_buffer.Get (), 0, D3D11_MAP_WRITE_DISCARD, 0, - &map); - if (!gst_d3d11_result (hr, self->device)) { - GST_ERROR_OBJECT (self, "Failed to map index buffer"); - context_handle->Unmap (vertex_buffer.Get (), 0); - return FALSE; - } - indices = (WORD *) map.pData; - /* bottom left */ vertex_data[0].position.x = -1.0f; vertex_data[0].position.y = -1.0f; @@ -921,17 +829,43 @@ setup_checker_render (GstD3D11TestSrc * self, GstD3D11TestSrcRender * render, vertex_data[3].texture.u = 1.0f; vertex_data[3].texture.v = 1.0f; - /* clockwise indexing */ - indices[0] = 0; /* bottom left */ - indices[1] = 1; /* top left */ - indices[2] = 2; /* top right */ + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (UvVertexData) * 4; + buffer_desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - indices[3] = 3; /* bottom right */ - indices[4] = 0; /* bottom left */ - indices[5] = 2; /* top right */ + subresource.pSysMem = vertex_data; + subresource.SysMemPitch = sizeof (UvVertexData) * 4; - context_handle->Unmap (vertex_buffer.Get (), 0); - context_handle->Unmap (index_buffer.Get (), 0); + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &vertex_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create vertex buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (WORD) * 6; + buffer_desc.BindFlags = D3D11_BIND_INDEX_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + + subresource.pSysMem = indices; + subresource.SysMemPitch = sizeof (WORD) * 6; + + hr = device_handle->CreateBuffer (&buffer_desc, &subresource, &index_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create index buffer"); + return FALSE; + } + + buffer_desc.Usage = D3D11_USAGE_DYNAMIC; + buffer_desc.ByteWidth = sizeof (CheckerConstBuffer); + buffer_desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + buffer_desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + hr = device_handle->CreateBuffer (&buffer_desc, nullptr, &const_buffer); + if (!gst_d3d11_result (hr, self->device)) { + GST_ERROR_OBJECT (self, "Failed to create constant buffer"); + return FALSE; + } auto quad = std::make_shared < GstD3D11TestSrcQuad > ();