vlc | branch: master | Steve Lhomme <[email protected]> | Mon Aug 31 14:21:15 2020 +0200| [1aff8a63571f82db418dd3d6947e8cf35a09bb4c] | committer: Steve Lhomme
direct3d11: handle the projection update via ShaderUpdateConstants() > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=1aff8a63571f82db418dd3d6947e8cf35a09bb4c --- modules/video_output/win32/d3d11_quad.c | 53 ++++++++++++++++++++---------- modules/video_output/win32/d3d11_quad.h | 2 +- modules/video_output/win32/d3d11_shaders.h | 1 + 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/modules/video_output/win32/d3d11_quad.c b/modules/video_output/win32/d3d11_quad.c index 36abdfec86..6fff189ed7 100644 --- a/modules/video_output/win32/d3d11_quad.c +++ b/modules/video_output/win32/d3d11_quad.c @@ -598,21 +598,43 @@ bool D3D11_UpdateQuadPosition( vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_qua return result; } -static bool ShaderUpdateConstants(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_t *quad, size_t index, void *new_buf) +static bool ShaderUpdateConstants(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_t *quad, int type, void *new_buf) { + ID3D11Resource *res; + switch (type) + { + case PS_CONST_LUMI_BOUNDS: + res = (ID3D11Resource *)quad->pPixelShaderConstants[PS_CONST_LUMI_BOUNDS]; + break; + case PS_CONST_COLORSPACE: + res = (ID3D11Resource *)quad->pPixelShaderConstants[PS_CONST_COLORSPACE]; + break; + case VS_CONST_VIEWPOINT: + res = (ID3D11Resource *)quad->pVertexShaderConstants; + break; + } + D3D11_MAPPED_SUBRESOURCE mappedResource; - HRESULT hr = ID3D11DeviceContext_Map(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pPixelShaderConstants[index], 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); - if (FAILED(hr)) + HRESULT hr = ID3D11DeviceContext_Map(d3d_dev->d3dcontext, res, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource); + if (unlikely(FAILED(hr))) { msg_Err(o, "Failed to lock the picture shader constants (hr=0x%lX)", hr); return false; } - if (index == PS_CONST_LUMI_BOUNDS) - memcpy(mappedResource.pData, new_buf,sizeof(PS_CONSTANT_BUFFER)); - else - memcpy(mappedResource.pData, new_buf,sizeof(PS_COLOR_TRANSFORM)); - ID3D11DeviceContext_Unmap(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pPixelShaderConstants[index], 0); + switch (type) + { + case PS_CONST_LUMI_BOUNDS: + memcpy(mappedResource.pData, new_buf, sizeof(PS_CONSTANT_BUFFER)); + break; + case PS_CONST_COLORSPACE: + memcpy(mappedResource.pData, new_buf, sizeof(PS_COLOR_TRANSFORM)); + break; + case VS_CONST_VIEWPOINT: + memcpy(mappedResource.pData, new_buf, sizeof(VS_PROJECTION_CONST)); + break; + } + ID3D11DeviceContext_Unmap(d3d_dev->d3dcontext, res, 0); return true; } @@ -719,16 +741,11 @@ void (D3D11_UpdateViewpoint)(vlc_object_t *o, d3d11_device_t *d3d_dev, d3d_quad_ vlc_viewpoint_t vp; vlc_viewpoint_reverse(&vp, viewpoint); - HRESULT hr; - D3D11_MAPPED_SUBRESOURCE mapped; - hr = ID3D11DeviceContext_Map(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pVertexShaderConstants, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); - if (SUCCEEDED(hr)) { - VS_PROJECTION_CONST *dst_data = mapped.pData; - getZoomMatrix(SPHERE_RADIUS * f_z, dst_data->Zoom); - getProjectionMatrix(f_sar, f_fovy, dst_data->Projection); - vlc_viewpoint_to_4x4(&vp, dst_data->View); - } - ID3D11DeviceContext_Unmap(d3d_dev->d3dcontext, (ID3D11Resource *)quad->pVertexShaderConstants, 0); + getZoomMatrix(SPHERE_RADIUS * f_z, quad->vertexConstants.Zoom); + getProjectionMatrix(f_sar, f_fovy, quad->vertexConstants.Projection); + vlc_viewpoint_to_4x4(&vp, quad->vertexConstants.View); + + ShaderUpdateConstants(o, d3d_dev, quad, VS_CONST_VIEWPOINT, &quad->vertexConstants); } #undef D3D11_AllocateQuad diff --git a/modules/video_output/win32/d3d11_quad.h b/modules/video_output/win32/d3d11_quad.h index 57ab0ac7fe..f1a573aea3 100644 --- a/modules/video_output/win32/d3d11_quad.h +++ b/modules/video_output/win32/d3d11_quad.h @@ -30,7 +30,7 @@ #define PS_CONST_LUMI_BOUNDS 0 #define PS_CONST_COLORSPACE 1 -#define PS_CONST_COUNT 2 +#define VS_CONST_VIEWPOINT 2 /* matches the D3D11_INPUT_ELEMENT_DESC we setup */ typedef struct d3d_vertex_t { diff --git a/modules/video_output/win32/d3d11_shaders.h b/modules/video_output/win32/d3d11_shaders.h index 7712c3eff3..969b337a0b 100644 --- a/modules/video_output/win32/d3d11_shaders.h +++ b/modules/video_output/win32/d3d11_shaders.h @@ -99,6 +99,7 @@ typedef struct video_projection_mode_t projection; PS_CONSTANT_BUFFER shaderConstants; + VS_PROJECTION_CONST vertexConstants; } d3d_quad_t; #define D3D11_MAX_RENDER_TARGET 2 _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
