mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-22 01:31:03 +00:00
d3d11: Reuse sampler object
The linear sampler object can be reused Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5457>
This commit is contained in:
parent
92cc5722c8
commit
83a576e854
5 changed files with 50 additions and 35 deletions
|
@ -53,5 +53,10 @@ HRESULT gst_d3d11_device_get_vertex_shader (GstD3D11Device * device,
|
|||
ID3D11VertexShader ** vs,
|
||||
ID3D11InputLayout ** layout);
|
||||
|
||||
GST_D3D11_API
|
||||
HRESULT gst_d3d11_device_get_sampler (GstD3D11Device * device,
|
||||
D3D11_FILTER filter,
|
||||
ID3D11SamplerState ** sampler);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
#include <utility>
|
||||
#include <atomic>
|
||||
#include <mutex>
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* SECTION:gstd3d11device
|
||||
|
@ -130,6 +131,7 @@ struct _GstD3D11DevicePrivate
|
|||
std::map <gint64, ComPtr<ID3D11PixelShader>> ps_cache;
|
||||
std::map <gint64,
|
||||
std::pair<ComPtr<ID3D11VertexShader>, ComPtr<ID3D11InputLayout>>> vs_cache;
|
||||
std::map <D3D11_FILTER, ComPtr<ID3D11SamplerState>> sampler_cache;
|
||||
|
||||
#if HAVE_D3D11SDKLAYERS_H
|
||||
ID3D11Debug *d3d11_debug = nullptr;
|
||||
|
@ -745,6 +747,7 @@ gst_d3d11_device_dispose (GObject * object)
|
|||
|
||||
priv->ps_cache.clear ();
|
||||
priv->vs_cache.clear ();
|
||||
priv->sampler_cache.clear ();
|
||||
|
||||
GST_D3D11_CLEAR_COM (priv->device5);
|
||||
GST_D3D11_CLEAR_COM (priv->device_context4);
|
||||
|
@ -1843,3 +1846,39 @@ gst_d3d11_device_get_vertex_shader (GstD3D11Device * device, gint64 token,
|
|||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT
|
||||
gst_d3d11_device_get_sampler (GstD3D11Device * device, D3D11_FILTER filter,
|
||||
ID3D11SamplerState ** sampler)
|
||||
{
|
||||
GstD3D11DevicePrivate *priv = device->priv;
|
||||
ComPtr < ID3D11SamplerState > state;
|
||||
D3D11_SAMPLER_DESC desc;
|
||||
HRESULT hr;
|
||||
|
||||
std::lock_guard < std::mutex > lk (priv->resource_lock);
|
||||
auto cached = priv->sampler_cache.find (filter);
|
||||
if (cached != priv->sampler_cache.end ()) {
|
||||
*sampler = cached->second.Get ();
|
||||
(*sampler)->AddRef ();
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
memset (&desc, 0, sizeof (D3D11_SAMPLER_DESC));
|
||||
|
||||
desc.Filter = filter;
|
||||
desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
|
||||
desc.MaxLOD = D3D11_FLOAT32_MAX;
|
||||
|
||||
hr = priv->device->CreateSamplerState (&desc, &state);
|
||||
if (!gst_d3d11_result (hr, device))
|
||||
return hr;
|
||||
|
||||
priv->sampler_cache[filter] = state;
|
||||
*sampler = state.Detach ();
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
|
|
@ -641,19 +641,9 @@ private:
|
|||
return false;
|
||||
}
|
||||
|
||||
D3D11_SAMPLER_DESC sampler_desc;
|
||||
memset (&sampler_desc, 0, sizeof (D3D11_SAMPLER_DESC));
|
||||
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.ComparisonFunc = D3D11_COMPARISON_NEVER;
|
||||
sampler_desc.MinLOD = 0;
|
||||
sampler_desc.MaxLOD = D3D11_FLOAT32_MAX;
|
||||
|
||||
ID3D11Device *device_handle = gst_d3d11_device_get_device_handle (device);
|
||||
ComPtr<ID3D11SamplerState> sampler;
|
||||
hr = device_handle->CreateSamplerState (&sampler_desc, &sampler);
|
||||
hr = gst_d3d11_device_get_sampler (device, D3D11_FILTER_MIN_MAG_MIP_LINEAR,
|
||||
&sampler);
|
||||
if (!gst_d3d11_result (hr, device)) {
|
||||
GST_ERROR ("Failed to create sampler state, hr 0x%x", (guint) hr);
|
||||
return false;
|
||||
|
|
|
@ -327,7 +327,6 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self)
|
|||
GstVideoInfo *info = &priv->info;
|
||||
GstD3D11Device *device = self->device;
|
||||
HRESULT hr;
|
||||
D3D11_SAMPLER_DESC sampler_desc;
|
||||
D3D11_BUFFER_DESC buffer_desc;
|
||||
D3D11_BLEND_DESC blend_desc;
|
||||
D3D11_MAPPED_SUBRESOURCE map;
|
||||
|
@ -342,23 +341,14 @@ gst_d3d11_overlay_compositor_setup_shader (GstD3D11OverlayCompositor * self)
|
|||
ComPtr < ID3D11BlendState > blend;
|
||||
ComPtr < ID3D11Buffer > index_buffer;
|
||||
|
||||
memset (&sampler_desc, 0, sizeof (sampler_desc));
|
||||
memset (&buffer_desc, 0, sizeof (buffer_desc));
|
||||
memset (&blend_desc, 0, sizeof (blend_desc));
|
||||
|
||||
device_handle = gst_d3d11_device_get_device_handle (device);
|
||||
context_handle = gst_d3d11_device_get_device_context_handle (device);
|
||||
|
||||
/* bilinear filtering */
|
||||
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
|
||||
sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
|
||||
sampler_desc.MinLOD = 0;
|
||||
sampler_desc.MaxLOD = D3D11_FLOAT32_MAX;
|
||||
|
||||
hr = device_handle->CreateSamplerState (&sampler_desc, &sampler);
|
||||
hr = gst_d3d11_device_get_sampler (device,
|
||||
D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT, &sampler);
|
||||
if (!gst_d3d11_result (hr, device)) {
|
||||
GST_ERROR_OBJECT (self, "Couldn't create sampler state, hr: 0x%x",
|
||||
(guint) hr);
|
||||
|
|
|
@ -875,7 +875,6 @@ gst_d3d11_screen_capture_prepare_shader (GstD3D11ScreenCaptureSrc * self)
|
|||
ComPtr < ID3D11PixelShader > ps;
|
||||
ComPtr < ID3D11SamplerState > sampler;
|
||||
ComPtr < ID3D11BlendState > blend;
|
||||
D3D11_SAMPLER_DESC sampler_desc;
|
||||
D3D11_BLEND_DESC blend_desc;
|
||||
ID3D11Device *device_handle;
|
||||
HRESULT hr;
|
||||
|
@ -894,16 +893,8 @@ gst_d3d11_screen_capture_prepare_shader (GstD3D11ScreenCaptureSrc * self)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
memset (&sampler_desc, 0, sizeof (D3D11_SAMPLER_DESC));
|
||||
sampler_desc.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR;
|
||||
sampler_desc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
|
||||
sampler_desc.ComparisonFunc = D3D11_COMPARISON_NEVER;
|
||||
sampler_desc.MinLOD = 0;
|
||||
sampler_desc.MaxLOD = D3D11_FLOAT32_MAX;
|
||||
|
||||
hr = device_handle->CreateSamplerState (&sampler_desc, &sampler);
|
||||
hr = gst_d3d11_device_get_sampler (self->device,
|
||||
D3D11_FILTER_MIN_MAG_MIP_LINEAR, &sampler);
|
||||
if (!gst_d3d11_result (hr, self->device)) {
|
||||
GST_ERROR_OBJECT (self,
|
||||
"Failed to create sampler state, hr 0x%x", (guint) hr);
|
||||
|
|
Loading…
Reference in a new issue