[vlc-commits] d3d11_shaders: compile a sampler state per shader
Steve Lhomme
git at videolan.org
Mon May 28 13:26:03 CEST 2018
vlc | branch: master | Steve Lhomme <robux4 at ycbcr.xyz> | Tue Jan 30 15:41:22 2018 +0100| [70f4ab30c3fa0fa9b6cc0f5032db6f0ee89db5c9] | committer: Steve Lhomme
d3d11_shaders: compile a sampler state per shader
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=70f4ab30c3fa0fa9b6cc0f5032db6f0ee89db5c9
---
modules/video_output/win32/d3d11_quad.c | 11 ++++++++++
modules/video_output/win32/d3d11_quad.h | 1 +
modules/video_output/win32/d3d11_shaders.c | 31 +++++++++++++++++++++++++++-
modules/video_output/win32/d3d11_shaders.h | 7 ++++---
modules/video_output/win32/direct3d11.c | 33 ++----------------------------
5 files changed, 48 insertions(+), 35 deletions(-)
diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c
index fc88d54979..69b29f891d 100644
--- a/modules/video_output/win32/d3d11_quad.c
+++ b/modules/video_output/win32/d3d11_quad.c
@@ -59,6 +59,9 @@ void D3D11_RenderQuad(d3d11_device_t *d3d_dev, d3d_quad_t *quad,
ID3D11DeviceContext_VSSetShader(d3d_dev->d3dcontext, quad->d3dvertexShader, NULL, 0);
+ if (quad->d3dsampState[0])
+ ID3D11DeviceContext_PSSetSamplers(d3d_dev->d3dcontext, 0, 2, quad->d3dsampState);
+
/* pixel shader */
ID3D11DeviceContext_PSSetConstantBuffers(d3d_dev->d3dcontext, 0, quad->PSConstantsCount, quad->pPixelShaderConstants);
assert(quad->resourceCount <= D3D11_MAX_SHADER_VIEW);
@@ -172,6 +175,14 @@ void D3D11_ReleaseQuad(d3d_quad_t *quad)
quad->d3dpixelShader[i] = NULL;
}
}
+ for (size_t i=0; i<2; i++)
+ {
+ if (quad->d3dsampState[i])
+ {
+ ID3D11SamplerState_Release(quad->d3dsampState[i]);
+ quad->d3dsampState[i] = NULL;
+ }
+ }
ReleasePictureSys(&quad->picSys);
}
diff --git a/modules/video_output/win32/d3d11_quad.h b/modules/video_output/win32/d3d11_quad.h
index b8d541cf92..0204b44c20 100644
--- a/modules/video_output/win32/d3d11_quad.h
+++ b/modules/video_output/win32/d3d11_quad.h
@@ -44,6 +44,7 @@ typedef struct
ID3D11Buffer *pPixelShaderConstants[2];
UINT PSConstantsCount;
ID3D11PixelShader *d3dpixelShader[D3D11_MAX_SHADER_VIEW];
+ ID3D11SamplerState *d3dsampState[2];
ID3D11InputLayout *pVertexLayout;
D3D11_VIEWPORT cropViewport[D3D11_MAX_SHADER_VIEW];
unsigned int i_width;
diff --git a/modules/video_output/win32/d3d11_shaders.c b/modules/video_output/win32/d3d11_shaders.c
index 8299d0bc43..e3bbb0d232 100644
--- a/modules/video_output/win32/d3d11_shaders.c
+++ b/modules/video_output/win32/d3d11_shaders.c
@@ -245,7 +245,8 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg
d3d11_device_t *d3d_dev,
const d3d_format_t *format, const display_info_t *display,
video_transfer_func_t transfer, bool src_full_range,
- ID3D11PixelShader *output[D3D11_MAX_SHADER_VIEW])
+ ID3D11PixelShader *output[D3D11_MAX_SHADER_VIEW],
+ ID3D11SamplerState *d3dsampState[2])
{
static const char *DEFAULT_NOOP = "return rgb";
const char *psz_sampler[2] = {NULL, NULL};
@@ -256,6 +257,34 @@ HRESULT D3D11_CompilePixelShader(vlc_object_t *o, d3d11_handle_t *hd3d, bool leg
const char *psz_move_planes[2] = {DEFAULT_NOOP, DEFAULT_NOOP};
char *psz_range = NULL;
+ if (d3dsampState)
+ {
+ D3D11_SAMPLER_DESC sampDesc;
+ memset(&sampDesc, 0, sizeof(sampDesc));
+ sampDesc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
+ sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
+ sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
+ sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
+ sampDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
+ sampDesc.MinLOD = 0;
+ sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
+
+ HRESULT hr;
+ hr = ID3D11Device_CreateSamplerState(d3d_dev->d3ddevice, &sampDesc, &d3dsampState[0]);
+ if (FAILED(hr)) {
+ msg_Err(o, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr);
+ return hr;
+ }
+
+ sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
+ hr = ID3D11Device_CreateSamplerState(d3d_dev->d3ddevice, &sampDesc, &d3dsampState[1]);
+ if (FAILED(hr)) {
+ msg_Err(o, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr);
+ ID3D11SamplerState_Release(d3dsampState[0]);
+ return hr;
+ }
+ }
+
if ( display->pixelFormat->formatTexture == DXGI_FORMAT_NV12 ||
display->pixelFormat->formatTexture == DXGI_FORMAT_P010 )
{
diff --git a/modules/video_output/win32/d3d11_shaders.h b/modules/video_output/win32/d3d11_shaders.h
index 3c0b2ba1f0..1a857dd48d 100644
--- a/modules/video_output/win32/d3d11_shaders.h
+++ b/modules/video_output/win32/d3d11_shaders.h
@@ -84,9 +84,10 @@ bool IsRGBShader(const d3d_format_t *);
HRESULT D3D11_CompilePixelShader(vlc_object_t *, d3d11_handle_t *, bool legacy_shader,
d3d11_device_t *, const d3d_format_t *, const display_info_t *,
video_transfer_func_t, bool src_full_range,
- ID3D11PixelShader *output[D3D11_MAX_SHADER_VIEW]);
-#define D3D11_CompilePixelShader(a,b,c,d,e,f,g,h,i) \
- D3D11_CompilePixelShader(VLC_OBJECT(a),b,c,d,e,f,g,h,i)
+ ID3D11PixelShader *output[D3D11_MAX_SHADER_VIEW],
+ ID3D11SamplerState *d3dsampState[2]);
+#define D3D11_CompilePixelShader(a,b,c,d,e,f,g,h,i,j) \
+ D3D11_CompilePixelShader(VLC_OBJECT(a),b,c,d,e,f,g,h,i,j)
float GetFormatLuminance(vlc_object_t *, const video_format_t *);
#define GetFormatLuminance(a,b) GetFormatLuminance(VLC_OBJECT(a),b)
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 20e23d0553..077c62d61a 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -1388,7 +1388,7 @@ static int Direct3D11CreateFormatResources(vout_display_t *vd, const video_forma
hr = D3D11_CompilePixelShader(vd, &sys->hd3d, sys->legacy_shader, &sys->d3d_dev,
sys->picQuad.formatInfo, &sys->display, fmt->transfer, fmt->b_color_range_full,
- sys->picQuad.d3dpixelShader);
+ sys->picQuad.d3dpixelShader, sys->picQuad.d3dsampState);
if (FAILED(hr))
{
msg_Err(vd, "Failed to create the pixel shader. (hr=0x%lX)", hr);
@@ -1501,7 +1501,7 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
{
hr = D3D11_CompilePixelShader(vd, &sys->hd3d, sys->legacy_shader, &sys->d3d_dev,
sys->d3dregion_format, &sys->display, TRANSFER_FUNC_SRGB, true,
- sys->pSPUPixelShader);
+ sys->pSPUPixelShader, NULL);
if (FAILED(hr))
{
for (size_t i=0; i<D3D11_MAX_SHADER_VIEW; i++)
@@ -1561,35 +1561,6 @@ static int Direct3D11CreateGenericResources(vout_display_t *vd)
UpdatePicQuadPosition(vd);
- D3D11_SAMPLER_DESC sampDesc;
- memset(&sampDesc, 0, sizeof(sampDesc));
- sampDesc.Filter = D3D11_FILTER_MIN_MAG_LINEAR_MIP_POINT;
- sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_CLAMP;
- sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_CLAMP;
- sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_CLAMP;
- sampDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
- sampDesc.MinLOD = 0;
- sampDesc.MaxLOD = D3D11_FLOAT32_MAX;
-
- ID3D11SamplerState *d3dsampState[2];
- hr = ID3D11Device_CreateSamplerState(sys->d3d_dev.d3ddevice, &sampDesc, &d3dsampState[0]);
- if (FAILED(hr)) {
- msg_Err(vd, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr);
- return VLC_EGENERIC;
- }
-
- sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
- hr = ID3D11Device_CreateSamplerState(sys->d3d_dev.d3ddevice, &sampDesc, &d3dsampState[1]);
- if (FAILED(hr)) {
- msg_Err(vd, "Could not Create the D3d11 Sampler State. (hr=0x%lX)", hr);
- ID3D11SamplerState_Release(d3dsampState[0]);
- return VLC_EGENERIC;
- }
-
- ID3D11DeviceContext_PSSetSamplers(sys->d3d_dev.d3dcontext, 0, 2, d3dsampState);
- ID3D11SamplerState_Release(d3dsampState[0]);
- ID3D11SamplerState_Release(d3dsampState[1]);
-
msg_Dbg(vd, "Direct3D11 resources created");
return VLC_SUCCESS;
}
More information about the vlc-commits
mailing list