[vlc-devel] [PATCH v2 8/8] d3d11: use View matrix instead of individual rotation
Alexandre Janniaux
ajanni at videolabs.io
Wed Mar 6 16:31:38 CET 2019
---
modules/video_output/win32/d3d11_shaders.c | 7 +--
modules/video_output/win32/d3d11_shaders.h | 3 -
modules/video_output/win32/direct3d11.c | 65 +---------------------
3 files changed, 3 insertions(+), 72 deletions(-)
diff --git a/modules/video_output/win32/d3d11_shaders.c b/modules/video_output/win32/d3d11_shaders.c
index a591e43854..bec0756229 100644
--- a/modules/video_output/win32/d3d11_shaders.c
+++ b/modules/video_output/win32/d3d11_shaders.c
@@ -166,9 +166,6 @@ VS_OUTPUT main( VS_INPUT In )\n\
const char* globVertexShaderProjection = "\n\
cbuffer VS_PROJECTION_CONST : register(b0)\n\
{\n\
- float4x4 RotX;\n\
- float4x4 RotY;\n\
- float4x4 RotZ;\n\
float4x4 View;\n\
float4x4 Zoom;\n\
float4x4 Projection;\n\
@@ -189,9 +186,7 @@ VS_OUTPUT main( VS_INPUT In )\n\
{\n\
VS_OUTPUT Output;\n\
float4 pos = In.Position;\n\
- pos = mul(RotY, pos);\n\
- pos = mul(RotX, pos);\n\
- pos = mul(RotZ, pos);\n\
+ pos = mul(View, pos);\n\
pos = mul(Zoom, pos);\n\
pos = mul(Projection, pos);\n\
Output.Position = pos;\n\
diff --git a/modules/video_output/win32/d3d11_shaders.h b/modules/video_output/win32/d3d11_shaders.h
index c7582972ce..fea6dbdd22 100644
--- a/modules/video_output/win32/d3d11_shaders.h
+++ b/modules/video_output/win32/d3d11_shaders.h
@@ -66,9 +66,6 @@ typedef struct {
} PS_COLOR_TRANSFORM;
typedef struct {
- FLOAT RotX[4*4];
- FLOAT RotY[4*4];
- FLOAT RotZ[4*4];
FLOAT View[4*4];
FLOAT Zoom[4*4];
FLOAT Projection[4*4];
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 20236d2f0d..647661754e 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -659,60 +659,6 @@ static void DestroyDisplayPoolPicture(picture_t *picture)
free(p_sys);
}
-/* rotation around the Z axis */
-static void getZRotMatrix(float theta, FLOAT matrix[static 16])
-{
- float st, ct;
-
- sincosf(theta, &st, &ct);
-
- const FLOAT m[] = {
- /* x y z w */
- ct, -st, 0.f, 0.f,
- st, ct, 0.f, 0.f,
- 0.f, 0.f, 1.f, 0.f,
- 0.f, 0.f, 0.f, 1.f
- };
-
- memcpy(matrix, m, sizeof(m));
-}
-
-/* rotation around the Y axis */
-static void getYRotMatrix(float theta, FLOAT matrix[static 16])
-{
- float st, ct;
-
- sincosf(theta, &st, &ct);
-
- const FLOAT m[] = {
- /* x y z w */
- ct, 0.f, -st, 0.f,
- 0.f, 1.f, 0.f, 0.f,
- st, 0.f, ct, 0.f,
- 0.f, 0.f, 0.f, 1.f
- };
-
- memcpy(matrix, m, sizeof(m));
-}
-
-/* rotation around the X axis */
-static void getXRotMatrix(float phi, FLOAT matrix[static 16])
-{
- float sp, cp;
-
- sincosf(phi, &sp, &cp);
-
- const FLOAT m[] = {
- /* x y z w */
- 1.f, 0.f, 0.f, 0.f,
- 0.f, cp, sp, 0.f,
- 0.f, -sp, cp, 0.f,
- 0.f, 0.f, 0.f, 1.f
- };
-
- memcpy(matrix, m, sizeof(m));
-}
-
static void getZoomMatrix(float zoom, FLOAT matrix[static 16]) {
const FLOAT m[] = {
@@ -780,16 +726,13 @@ static void SetQuadVSProjection(vout_display_t *vd, d3d_quad_t *quad, const vlc_
if (!quad->pVertexShaderConstants)
return;
-#define RAD(d) ((float) ((d) * M_PI / 180.f))
- float f_fovx = RAD(p_vp->fov);
+ // Convert degree into radian
+ float f_fovx = p_vp->fov * (float)M_PI / 180.f;
if ( f_fovx > FIELD_OF_VIEW_DEGREES_MAX * M_PI / 180 + 0.001f ||
f_fovx < -0.001f )
return;
float f_sar = (float) sys->sys.vdcfg.display.width / sys->sys.vdcfg.display.height;
- float f_teta = RAD(p_vp->yaw) - (float) M_PI_2;
- float f_phi = RAD(p_vp->pitch);
- float f_roll = RAD(p_vp->roll);
float f_fovy = UpdateFOVy(f_fovx, f_sar);
float f_z = UpdateZ(f_fovx, f_fovy);
@@ -798,9 +741,6 @@ static void SetQuadVSProjection(vout_display_t *vd, d3d_quad_t *quad, const vlc_
hr = ID3D11DeviceContext_Map(sys->d3d_dev.d3dcontext, (ID3D11Resource *)quad->pVertexShaderConstants, 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped);
if (SUCCEEDED(hr)) {
VS_PROJECTION_CONST *dst_data = mapped.pData;
- getXRotMatrix(f_phi, dst_data->RotX);
- getYRotMatrix(f_teta, dst_data->RotY);
- getZRotMatrix(f_roll, dst_data->RotZ);
getZoomMatrix(SPHERE_RADIUS * f_z, dst_data->Zoom);
getProjectionMatrix(f_sar, f_fovy, dst_data->Projection);
@@ -809,7 +749,6 @@ static void SetQuadVSProjection(vout_display_t *vd, d3d_quad_t *quad, const vlc_
vlc_viewpoint_to_4x4(&vp, dst_data->View);
}
ID3D11DeviceContext_Unmap(sys->d3d_dev.d3dcontext, (ID3D11Resource *)quad->pVertexShaderConstants, 0);
-#undef RAD
}
static int Control(vout_display_t *vd, int query, va_list args)
--
2.21.0
More information about the vlc-devel
mailing list