From 2649d2ae62dc37fa17fedc83b20cbf673792a81f Mon Sep 17 00:00:00 2001
From: Seungha Yang <seungha@centricular.com>
Date: Sun, 24 Mar 2024 21:11:08 +0900
Subject: [PATCH] d3d12: Port to d3dshader library

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6434>
---
 .../sys/d3d12/gstd3d12compositor.cpp          |  43 +-
 .../sys/d3d12/gstd3d12converter-builder.cpp   | 333 +------
 .../sys/d3d12/gstd3d12dxgicapture.cpp         |  25 +-
 .../sys/d3d12/gstd3d12overlaycompositor.cpp   |  37 +-
 .../sys/d3d12/gstd3d12testsrc.cpp             |  72 +-
 .../sys/d3d12/hlsl/PSMain_checker.hlsl        |  44 -
 .../sys/d3d12/hlsl/PSMain_checker_luma.hlsl   |  49 -
 .../sys/d3d12/hlsl/PSMain_checker_rgb.hlsl    |  49 -
 .../sys/d3d12/hlsl/PSMain_checker_vuya.hlsl   |  49 -
 .../sys/d3d12/hlsl/PSMain_color.hlsl          |  29 -
 .../sys/d3d12/hlsl/PSMain_converter.hlsl      | 939 ------------------
 .../sys/d3d12/hlsl/PSMain_sample.hlsl         |  32 -
 .../sys/d3d12/hlsl/PSMain_sample_premul.hlsl  |  38 -
 .../sys/d3d12/hlsl/PSMain_snow.hlsl           |  45 -
 .../sys/d3d12/hlsl/VSMain_color.hlsl          |  35 -
 .../sys/d3d12/hlsl/VSMain_converter.hlsl      |  45 -
 .../sys/d3d12/hlsl/VSMain_coord.hlsl          |  35 -
 .../sys/d3d12/hlsl/VSMain_pos.hlsl            |  33 -
 .../sys/d3d12/hlsl/collect_hlsl_header.py     |  64 --
 .../sys/d3d12/hlsl/meson.build                | 169 ----
 .../gst-plugins-bad/sys/d3d12/meson.build     |  12 +-
 21 files changed, 166 insertions(+), 2011 deletions(-)
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_luma.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_rgb.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_vuya.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_color.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_converter.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample_premul.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_snow.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_color.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_converter.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_coord.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_pos.hlsl
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/collect_hlsl_header.py
 delete mode 100644 subprojects/gst-plugins-bad/sys/d3d12/hlsl/meson.build

diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12compositor.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12compositor.cpp
index 2104aa95f4..f688c0f0ba 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12compositor.cpp
+++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12compositor.cpp
@@ -44,10 +44,7 @@
 #include <queue>
 #include <string.h>
 #include <wrl.h>
-#include "PSMain_checker_luma.h"
-#include "PSMain_checker_rgb.h"
-#include "PSMain_checker_vuya.h"
-#include "VSMain_pos.h"
+#include <gst/d3dshader/gstd3dshader.h>
 
 GST_DEBUG_CATEGORY_STATIC (gst_d3d12_compositor_debug);
 #define GST_CAT_DEFAULT gst_d3d12_compositor_debug
@@ -368,20 +365,34 @@ struct BackgroundRender
     input_desc.InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA;
     input_desc.InstanceDataStepRate = 0;
 
+    GstD3DShaderByteCode vs_code;
+    if (!gst_d3d_plugin_shader_get_vs_blob (GST_D3D_PLUGIN_VS_POS,
+        GST_D3D_SM_5_0, &vs_code)) {
+      GST_ERROR_OBJECT (device, "Couldn't get vs bytecode");
+      return;
+    }
+
+    GstD3DShaderByteCode ps_code;
+    GstD3DPluginPS ps_type;
+    if (GST_VIDEO_INFO_IS_RGB (&info))
+      ps_type = GST_D3D_PLUGIN_PS_CHECKER_RGB;
+    else if (GST_VIDEO_INFO_FORMAT (&info) == GST_VIDEO_FORMAT_VUYA)
+      ps_type = GST_D3D_PLUGIN_PS_CHECKER_VUYA;
+    else
+      ps_type = GST_D3D_PLUGIN_PS_CHECKER_LUMA;
+
+    if (!gst_d3d_plugin_shader_get_ps_blob (ps_type,
+        GST_D3D_SM_5_0, &ps_code)) {
+      GST_ERROR_OBJECT (device, "Couldn't get ps bytecode");
+      return;
+    }
+
     D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = { };
     pso_desc.pRootSignature = rs.Get ();
-    pso_desc.VS.BytecodeLength = sizeof (g_VSMain_pos);
-    pso_desc.VS.pShaderBytecode = g_VSMain_pos;
-    if (GST_VIDEO_INFO_IS_RGB (&info)) {
-      pso_desc.PS.BytecodeLength = sizeof (g_PSMain_checker_rgb);
-      pso_desc.PS.pShaderBytecode = g_PSMain_checker_rgb;
-    } else if (GST_VIDEO_INFO_FORMAT (&info) == GST_VIDEO_FORMAT_VUYA) {
-      pso_desc.PS.BytecodeLength = sizeof (g_PSMain_checker_vuya);
-      pso_desc.PS.pShaderBytecode = g_PSMain_checker_vuya;
-    } else {
-      pso_desc.PS.BytecodeLength = sizeof (g_PSMain_checker_luma);
-      pso_desc.PS.pShaderBytecode = g_PSMain_checker_luma;
-    }
+    pso_desc.VS.BytecodeLength = vs_code.byte_code_len;
+    pso_desc.VS.pShaderBytecode = vs_code.byte_code;
+    pso_desc.PS.BytecodeLength = ps_code.byte_code_len;
+    pso_desc.PS.pShaderBytecode = ps_code.byte_code;
     pso_desc.BlendState = CD3DX12_BLEND_DESC (D3D12_DEFAULT);
     pso_desc.SampleMask = UINT_MAX;
     pso_desc.RasterizerState = CD3DX12_RASTERIZER_DESC (D3D12_DEFAULT);
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12converter-builder.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12converter-builder.cpp
index 25797ae10b..d9972ab014 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12converter-builder.cpp
+++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12converter-builder.cpp
@@ -23,345 +23,80 @@
 
 #include "gstd3d12.h"
 #include "gstd3d12converter-builder.h"
+#include <gst/d3dshader/gstd3dshader.h>
 #include <directx/d3dx12.h>
-#include <map>
 #include <mutex>
 #include <string>
 #include <utility>
 #include <memory>
-#include "PSMainConverter.h"
-#include "VSMain_converter.h"
 
 GST_DEBUG_CATEGORY_EXTERN (gst_d3d12_converter_debug);
 #define GST_CAT_DEFAULT gst_d3d12_converter_debug
 
 /* *INDENT-OFF* */
 using namespace Microsoft::WRL;
-
-enum class PS_OUTPUT
-{
-  PACKED,
-  LUMA,
-  CHROMA,
-  CHROMA_PLANAR,
-  PLANAR,
-  PLANAR_FULL,
-};
-
-static const std::string
-ps_output_to_string (PS_OUTPUT output)
-{
-  switch (output) {
-    case PS_OUTPUT::PACKED:
-      return "PS_OUTPUT_PACKED";
-    case PS_OUTPUT::LUMA:
-      return "PS_OUTPUT_LUMA";
-    case PS_OUTPUT::CHROMA:
-      return "PS_OUTPUT_CHROMA";
-    case PS_OUTPUT::CHROMA_PLANAR:
-      return "PS_OUTPUT_CHROMA_PLANAR";
-    case PS_OUTPUT::PLANAR:
-      return "PS_OUTPUT_PLANAR";
-    case PS_OUTPUT::PLANAR_FULL:
-      return "PS_OUTPUT_PLANAR_FULL";
-    default:
-      g_assert_not_reached ();
-      break;
-  }
-
-  return "";
-}
-
-static guint
-ps_output_get_num_rtv (PS_OUTPUT output)
-{
-  switch (output) {
-    case PS_OUTPUT::PACKED:
-    case PS_OUTPUT::LUMA:
-    case PS_OUTPUT::CHROMA:
-      return 1;
-    case PS_OUTPUT::CHROMA_PLANAR:
-      return 2;
-    case PS_OUTPUT::PLANAR:
-      return 3;
-    case PS_OUTPUT::PLANAR_FULL:
-      return 4;
-    default:
-      g_assert_not_reached ();
-      break;
-  }
-
-  return 0;
-}
-
-static std::string
-make_input (GstVideoFormat format, gboolean premul)
-{
-  switch (format) {
-    case GST_VIDEO_FORMAT_RGBA:
-    case GST_VIDEO_FORMAT_RGBA64_LE:
-    case GST_VIDEO_FORMAT_RGB10A2_LE:
-    case GST_VIDEO_FORMAT_BGRA:
-      if (premul)
-        return "RGBAPremul";
-      return "RGBA";
-    case GST_VIDEO_FORMAT_RGBx:
-    case GST_VIDEO_FORMAT_BGRx:
-      return "RGBx";
-    case GST_VIDEO_FORMAT_ARGB:
-      return "ARGB";
-    case GST_VIDEO_FORMAT_xRGB:
-      return "xRGB";
-    case GST_VIDEO_FORMAT_ABGR:
-      return "ABGR";
-    case GST_VIDEO_FORMAT_xBGR:
-      return "xBGR";
-    case GST_VIDEO_FORMAT_VUYA:
-      return "VUYA";
-    case GST_VIDEO_FORMAT_AYUV:
-    case GST_VIDEO_FORMAT_AYUV64:
-      return "AYUV";
-    case GST_VIDEO_FORMAT_NV12:
-    case GST_VIDEO_FORMAT_P010_10LE:
-    case GST_VIDEO_FORMAT_P012_LE:
-    case GST_VIDEO_FORMAT_P016_LE:
-      return "NV12";
-    case GST_VIDEO_FORMAT_NV21:
-      return "NV21";
-    case GST_VIDEO_FORMAT_I420:
-    case GST_VIDEO_FORMAT_Y42B:
-    case GST_VIDEO_FORMAT_Y444:
-    case GST_VIDEO_FORMAT_Y444_16LE:
-      return "I420";
-    case GST_VIDEO_FORMAT_YV12:
-      return "YV12";
-    case GST_VIDEO_FORMAT_I420_10LE:
-    case GST_VIDEO_FORMAT_I422_10LE:
-    case GST_VIDEO_FORMAT_Y444_10LE:
-      return "I420_10";
-    case GST_VIDEO_FORMAT_I420_12LE:
-    case GST_VIDEO_FORMAT_I422_12LE:
-    case GST_VIDEO_FORMAT_Y444_12LE:
-      return "I420_12";
-    case GST_VIDEO_FORMAT_Y410:
-      return "Y410";
-    case GST_VIDEO_FORMAT_GRAY8:
-    case GST_VIDEO_FORMAT_GRAY16_LE:
-      return "GRAY";
-    case GST_VIDEO_FORMAT_RGBP:
-      return "RGBP";
-    case GST_VIDEO_FORMAT_BGRP:
-      return "BGRP";
-    case GST_VIDEO_FORMAT_GBR:
-    case GST_VIDEO_FORMAT_GBR_16LE:
-      return "GBR";
-    case GST_VIDEO_FORMAT_GBR_10LE:
-      return "GBR_10";
-    case GST_VIDEO_FORMAT_GBR_12LE:
-      return "GBR_12";
-    case GST_VIDEO_FORMAT_GBRA:
-      return "GBRA";
-    case GST_VIDEO_FORMAT_GBRA_10LE:
-      return "GBRA_10";
-    case GST_VIDEO_FORMAT_GBRA_12LE:
-      return "GBRA_12";
-    case GST_VIDEO_FORMAT_Y412_LE:
-      return "Y412";
-    case GST_VIDEO_FORMAT_BGR10A2_LE:
-      return "BGR10A2";
-    case GST_VIDEO_FORMAT_BGRA64_LE:
-      return "BGRA64";
-    case GST_VIDEO_FORMAT_RBGA:
-      return "RBGA";
-    default:
-      g_assert_not_reached ();
-      break;
-  }
-
-  return "";
-}
-
-static std::vector<std::pair<PS_OUTPUT, std::string>>
-make_output (GstVideoFormat format, gboolean premul)
-{
-  std::vector<std::pair<PS_OUTPUT, std::string>> ret;
-
-  switch (format) {
-    case GST_VIDEO_FORMAT_RGBA:
-    case GST_VIDEO_FORMAT_RGBA64_LE:
-    case GST_VIDEO_FORMAT_RGB10A2_LE:
-    case GST_VIDEO_FORMAT_BGRA:
-      if (premul)
-        ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "RGBAPremul"));
-      else
-        ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "RGBA"));
-      break;
-    case GST_VIDEO_FORMAT_RGBx:
-    case GST_VIDEO_FORMAT_BGRx:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "RGBx"));
-      break;
-    case GST_VIDEO_FORMAT_ARGB:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "ARGB"));
-      break;
-    case GST_VIDEO_FORMAT_xRGB:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "xRGB"));
-      break;
-    case GST_VIDEO_FORMAT_ABGR:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "ABGR"));
-      break;
-    case GST_VIDEO_FORMAT_xBGR:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "xBGR"));
-      break;
-    case GST_VIDEO_FORMAT_VUYA:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "VUYA"));
-      break;
-    case GST_VIDEO_FORMAT_AYUV:
-    case GST_VIDEO_FORMAT_AYUV64:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "AYUV"));
-      break;
-    case GST_VIDEO_FORMAT_NV12:
-    case GST_VIDEO_FORMAT_P010_10LE:
-    case GST_VIDEO_FORMAT_P012_LE:
-    case GST_VIDEO_FORMAT_P016_LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma"));
-      ret.push_back(std::make_pair(PS_OUTPUT::CHROMA, "ChromaNV12"));
-      break;
-    case GST_VIDEO_FORMAT_NV21:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma"));
-      ret.push_back(std::make_pair(PS_OUTPUT::CHROMA, "ChromaNV21"));
-      break;
-    case GST_VIDEO_FORMAT_I420:
-    case GST_VIDEO_FORMAT_Y42B:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma"));
-      ret.push_back(std::make_pair(PS_OUTPUT::CHROMA_PLANAR, "ChromaI420"));
-      break;
-    case GST_VIDEO_FORMAT_Y444:
-    case GST_VIDEO_FORMAT_Y444_16LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "Y444"));
-      break;
-    case GST_VIDEO_FORMAT_YV12:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma"));
-      ret.push_back(std::make_pair(PS_OUTPUT::CHROMA_PLANAR, "ChromaYV12"));
-      break;
-    case GST_VIDEO_FORMAT_I420_10LE:
-    case GST_VIDEO_FORMAT_I422_10LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma_10"));
-      ret.push_back(std::make_pair(PS_OUTPUT::CHROMA_PLANAR, "ChromaI420_10"));
-      break;
-    case GST_VIDEO_FORMAT_Y444_10LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "Y444_10"));
-      break;
-    case GST_VIDEO_FORMAT_I420_12LE:
-    case GST_VIDEO_FORMAT_I422_12LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma_12"));
-      ret.push_back(std::make_pair(PS_OUTPUT::CHROMA_PLANAR, "ChromaI420_12"));
-      break;
-    case GST_VIDEO_FORMAT_Y444_12LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "Y444_12"));
-      break;
-    case GST_VIDEO_FORMAT_GRAY8:
-    case GST_VIDEO_FORMAT_GRAY16_LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::LUMA, "Luma"));
-      break;
-    case GST_VIDEO_FORMAT_RGBP:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "RGBP"));
-      break;
-    case GST_VIDEO_FORMAT_BGRP:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "BGRP"));
-      break;
-    case GST_VIDEO_FORMAT_GBR:
-    case GST_VIDEO_FORMAT_GBR_16LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "GBR"));
-      break;
-    case GST_VIDEO_FORMAT_GBR_10LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "GBR_10"));
-      break;
-    case GST_VIDEO_FORMAT_GBR_12LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR, "GBR_12"));
-      break;
-    case GST_VIDEO_FORMAT_GBRA:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR_FULL, "GBRA"));
-      break;
-    case GST_VIDEO_FORMAT_GBRA_10LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR_FULL, "GBRA_10"));
-      break;
-    case GST_VIDEO_FORMAT_GBRA_12LE:
-      ret.push_back(std::make_pair(PS_OUTPUT::PLANAR_FULL, "GBRA_12"));
-      break;
-    case GST_VIDEO_FORMAT_RBGA:
-      ret.push_back(std::make_pair(PS_OUTPUT::PACKED, "RBGA"));
-      break;
-    default:
-      g_assert_not_reached ();
-      break;
-  }
-
-  return ret;
-}
+/* *INDENT-ON* */
 
 PixelShaderBlobList
 gst_d3d12_get_converter_pixel_shader_blob (GstVideoFormat in_format,
     GstVideoFormat out_format, gboolean in_premul, gboolean out_premul,
     CONVERT_TYPE type)
 {
-  auto input = make_input (in_format, in_premul);
-  auto output = make_output (out_format, out_premul);
-  std::string conv_type;
+  GstD3DConverterType conv_type;
   PixelShaderBlobList ret;
-  static std::mutex cache_lock;
-  static std::map<std::string, std::shared_ptr<PixelShaderBlob>> ps_cache;
 
   switch (type) {
     case CONVERT_TYPE::IDENTITY:
-      conv_type = "Identity";
+      conv_type = GST_D3D_CONVERTER_IDENTITY;
       break;
     case CONVERT_TYPE::SIMPLE:
-      conv_type = "Simple";
+      conv_type = GST_D3D_CONVERTER_SIMPLE;
       break;
     case CONVERT_TYPE::RANGE:
-      conv_type = "Range";
+      conv_type = GST_D3D_CONVERTER_RANGE;
       break;
     case CONVERT_TYPE::GAMMA:
-      conv_type = "Gamma";
+      conv_type = GST_D3D_CONVERTER_GAMMA;
       break;
     case CONVERT_TYPE::PRIMARY:
-      conv_type = "Primary";
+      conv_type = GST_D3D_CONVERTER_PRIMARY;
       break;
+    default:
+      g_assert_not_reached ();
+      return ret;
   }
 
-  for (const auto & it : output) {
-    std::string entry_point = "PSMain_" + input + "_" + conv_type + "_" +
-        it.second;
-    std::shared_ptr<PixelShaderBlob> source;
-    std::lock_guard<std::mutex> lk (cache_lock);
-    auto cached = ps_cache.find(entry_point);
-    if (cached != ps_cache.end()) {
-      source = cached->second;
-    } else {
-      auto precompiled = precompiled_bytecode.find (entry_point);
-      if (precompiled == precompiled_bytecode.end ()) {
-        GST_ERROR ("Couldn't find precompiled %s", entry_point.c_str ());
-        ret.clear ();
-        return ret;
-      }
-      source = std::make_shared<PixelShaderBlob> ();
-      source->bytecode.pShaderBytecode = precompiled->second.first;
-      source->bytecode.BytecodeLength = precompiled->second.second;
-      source->num_rtv = ps_output_get_num_rtv (it.first);
-      ps_cache[entry_point] = source;
-    }
+  GstD3DConverterPSByteCode blobs[4];
+  auto num_blobs = gst_d3d_converter_shader_get_ps_blob (in_format, out_format,
+      in_premul, out_premul, conv_type, GST_D3D_SM_5_0, blobs);
 
-    ret.push_back (*source);
+  if (!num_blobs) {
+    GST_ERROR ("Couldn't get compiled bytecode");
+    return ret;
+  }
+
+  for (guint i = 0; i < num_blobs; i++) {
+    auto blob = &blobs[i];
+    PixelShaderBlob ps;
+    ps.bytecode.pShaderBytecode = blob->byte_code.byte_code;
+    ps.bytecode.BytecodeLength = blob->byte_code.byte_code_len;
+    ps.num_rtv = blob->num_rtv;
+    ret.push_back (ps);
   }
 
   return ret;
 }
-/* *INDENT-ON* */
 
 HRESULT
 gst_d3d12_get_converter_vertex_shader_blob (D3D12_SHADER_BYTECODE * vs,
     D3D12_INPUT_ELEMENT_DESC input_desc[2])
 {
+  GstD3DShaderByteCode bytecode = { };
+  if (!gst_d3d_converter_shader_get_vs_blob (GST_D3D_SM_5_0, &bytecode)) {
+    GST_ERROR ("Couldn't get compiled bytecode");
+    return E_FAIL;
+  }
+
   input_desc[0].SemanticName = "POSITION";
   input_desc[0].SemanticIndex = 0;
   input_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT;
@@ -378,8 +113,8 @@ gst_d3d12_get_converter_vertex_shader_blob (D3D12_SHADER_BYTECODE * vs,
   input_desc[1].InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA;
   input_desc[1].InstanceDataStepRate = 0;
 
-  vs->BytecodeLength = sizeof (g_VSMain_converter);
-  vs->pShaderBytecode = g_VSMain_converter;
+  vs->BytecodeLength = bytecode.byte_code_len;
+  vs->pShaderBytecode = bytecode.byte_code;
 
   return S_OK;
 }
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12dxgicapture.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12dxgicapture.cpp
index 08e651f751..b8e2866981 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12dxgicapture.cpp
+++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12dxgicapture.cpp
@@ -55,8 +55,7 @@
 #include <memory>
 #include <future>
 #include <wrl.h>
-#include "PSMain_sample.h"
-#include "VSMain_coord.h"
+#include <gst/d3dshader/gstd3dshader.h>
 
 #define _XM_NO_INTRINSICS_
 #include <DirectXMath.h>
@@ -953,12 +952,26 @@ gst_d3d12_dxgi_capture_open (GstD3D12DxgiCapture * self,
   input_desc[1].InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA;
   input_desc[1].InstanceDataStepRate = 0;
 
+  GstD3DShaderByteCode vs_code;
+  GstD3DShaderByteCode ps_code;
+  if (!gst_d3d_plugin_shader_get_vs_blob (GST_D3D_PLUGIN_VS_COORD,
+          GST_D3D_SM_5_0, &vs_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get vs bytecode");
+    return FALSE;
+  }
+
+  if (!gst_d3d_plugin_shader_get_ps_blob (GST_D3D_PLUGIN_PS_SAMPLE,
+          GST_D3D_SM_5_0, &ps_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get ps bytecode");
+    return FALSE;
+  }
+
   D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = { };
   pso_desc.pRootSignature = priv->rs.Get ();
-  pso_desc.VS.BytecodeLength = sizeof (g_VSMain_coord);
-  pso_desc.VS.pShaderBytecode = g_VSMain_coord;
-  pso_desc.PS.BytecodeLength = sizeof (g_PSMain_sample);
-  pso_desc.PS.pShaderBytecode = g_PSMain_sample;
+  pso_desc.VS.BytecodeLength = vs_code.byte_code_len;
+  pso_desc.VS.pShaderBytecode = vs_code.byte_code;
+  pso_desc.PS.BytecodeLength = ps_code.byte_code_len;
+  pso_desc.PS.pShaderBytecode = ps_code.byte_code;
   pso_desc.BlendState = CD3DX12_BLEND_DESC (D3D12_DEFAULT);
   pso_desc.SampleMask = UINT_MAX;
   pso_desc.RasterizerState = CD3DX12_RASTERIZER_DESC (D3D12_DEFAULT);
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12overlaycompositor.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12overlaycompositor.cpp
index b2a913818d..61abbd2ee3 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12overlaycompositor.cpp
+++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12overlaycompositor.cpp
@@ -27,9 +27,7 @@
 #include <memory>
 #include <vector>
 #include <algorithm>
-#include "PSMain_sample.h"
-#include "PSMain_sample_premul.h"
-#include "VSMain_coord.h"
+#include <gst/d3dshader/gstd3dshader.h>
 
 GST_DEBUG_CATEGORY_STATIC (gst_d3d12_overlay_compositor_debug);
 #define GST_CAT_DEFAULT gst_d3d12_overlay_compositor_debug
@@ -430,6 +428,27 @@ gst_d3d12_overlay_compositor_setup_shader (GstD3D12OverlayCompositor * self)
   gst_d3d12_device_get_format (self->device, GST_VIDEO_INFO_FORMAT (info),
       &device_format);
 
+  GstD3DShaderByteCode vs_code;
+  GstD3DShaderByteCode ps_sample_code;
+  GstD3DShaderByteCode ps_sample_premul_code;
+  if (!gst_d3d_plugin_shader_get_vs_blob (GST_D3D_PLUGIN_VS_COORD,
+          GST_D3D_SM_5_0, &vs_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get vs bytecode");
+    return FALSE;
+  }
+
+  if (!gst_d3d_plugin_shader_get_ps_blob (GST_D3D_PLUGIN_PS_SAMPLE,
+          GST_D3D_SM_5_0, &ps_sample_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get ps bytecode");
+    return FALSE;
+  }
+
+  if (!gst_d3d_plugin_shader_get_ps_blob (GST_D3D_PLUGIN_PS_SAMPLE_PREMULT,
+          GST_D3D_SM_5_0, &ps_sample_premul_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get ps bytecode");
+    return FALSE;
+  }
+
   auto device = gst_d3d12_device_get_device_handle (self->device);
   ComPtr < ID3D12RootSignature > rs;
   device->CreateRootSignature (0, rs_blob->GetBufferPointer (),
@@ -455,10 +474,10 @@ gst_d3d12_overlay_compositor_setup_shader (GstD3D12OverlayCompositor * self)
 
   auto & pso_desc = priv->pso_desc;
   pso_desc.pRootSignature = rs.Get ();
-  pso_desc.VS.BytecodeLength = sizeof (g_VSMain_coord);
-  pso_desc.VS.pShaderBytecode = g_VSMain_coord;
-  pso_desc.PS.BytecodeLength = sizeof (g_PSMain_sample);
-  pso_desc.PS.pShaderBytecode = g_PSMain_sample;
+  pso_desc.VS.BytecodeLength = vs_code.byte_code_len;
+  pso_desc.VS.pShaderBytecode = vs_code.byte_code;
+  pso_desc.PS.BytecodeLength = ps_sample_code.byte_code_len;
+  pso_desc.PS.pShaderBytecode = ps_sample_code.byte_code;
   pso_desc.BlendState = CD3DX12_BLEND_DESC (D3D12_DEFAULT);
   pso_desc.BlendState.RenderTarget[0].BlendEnable = TRUE;
   pso_desc.BlendState.RenderTarget[0].LogicOpEnable = FALSE;
@@ -494,8 +513,8 @@ gst_d3d12_overlay_compositor_setup_shader (GstD3D12OverlayCompositor * self)
   ComPtr < ID3D12PipelineState > pso_premul;
   auto & pso_premul_desc = priv->pso_premul_desc;
   pso_premul_desc = priv->pso_desc;
-  pso_premul_desc.PS.BytecodeLength = sizeof (g_PSMain_sample_premul);
-  pso_premul_desc.PS.pShaderBytecode = g_PSMain_sample_premul;
+  pso_premul_desc.PS.BytecodeLength = ps_sample_premul_code.byte_code_len;
+  pso_premul_desc.PS.pShaderBytecode = ps_sample_premul_code.byte_code;
   hr = device->CreateGraphicsPipelineState (&pso_premul_desc,
       IID_PPV_ARGS (&pso_premul));
   if (!gst_d3d12_result (hr, self->device)) {
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12testsrc.cpp b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12testsrc.cpp
index 5b53c377f3..25f757f571 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12testsrc.cpp
+++ b/subprojects/gst-plugins-bad/sys/d3d12/gstd3d12testsrc.cpp
@@ -46,11 +46,7 @@
 #include <memory>
 #include <vector>
 #include <queue>
-#include "PSMain_checker.h"
-#include "PSMain_color.h"
-#include "PSMain_snow.h"
-#include "VSMain_color.h"
-#include "VSMain_coord.h"
+#include <gst/d3dshader/gstd3dshader.h>
 
 /* *INDENT-OFF* */
 using namespace Microsoft::WRL;
@@ -417,6 +413,20 @@ setup_snow_render (GstD3D12TestSrc * self, RenderContext * ctx,
     return FALSE;
   }
 
+  GstD3DShaderByteCode vs_code;
+  GstD3DShaderByteCode ps_code;
+  if (!gst_d3d_plugin_shader_get_vs_blob (GST_D3D_PLUGIN_VS_COORD,
+          GST_D3D_SM_5_0, &vs_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get vs bytecode");
+    return FALSE;
+  }
+
+  if (!gst_d3d_plugin_shader_get_ps_blob (GST_D3D_PLUGIN_PS_SNOW,
+          GST_D3D_SM_5_0, &ps_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get ps bytecode");
+    return FALSE;
+  }
+
   D3D12_INPUT_ELEMENT_DESC input_desc[2];
   input_desc[0].SemanticName = "POSITION";
   input_desc[0].SemanticIndex = 0;
@@ -436,10 +446,10 @@ setup_snow_render (GstD3D12TestSrc * self, RenderContext * ctx,
 
   D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = { };
   pso_desc.pRootSignature = rs.Get ();
-  pso_desc.VS.BytecodeLength = sizeof (g_VSMain_coord);
-  pso_desc.VS.pShaderBytecode = g_VSMain_coord;
-  pso_desc.PS.BytecodeLength = sizeof (g_PSMain_snow);
-  pso_desc.PS.pShaderBytecode = g_PSMain_snow;
+  pso_desc.VS.BytecodeLength = vs_code.byte_code_len;
+  pso_desc.VS.pShaderBytecode = vs_code.byte_code;
+  pso_desc.PS.BytecodeLength = ps_code.byte_code_len;
+  pso_desc.PS.pShaderBytecode = ps_code.byte_code;
   pso_desc.BlendState = CD3DX12_BLEND_DESC (D3D12_DEFAULT);
   pso_desc.SampleMask = UINT_MAX;
   pso_desc.RasterizerState = CD3DX12_RASTERIZER_DESC (D3D12_DEFAULT);
@@ -627,6 +637,20 @@ setup_smpte_render (GstD3D12TestSrc * self, RenderContext * ctx)
     return FALSE;
   }
 
+  GstD3DShaderByteCode vs_code;
+  GstD3DShaderByteCode ps_code;
+  if (!gst_d3d_plugin_shader_get_vs_blob (GST_D3D_PLUGIN_VS_COLOR,
+          GST_D3D_SM_5_0, &vs_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get vs bytecode");
+    return FALSE;
+  }
+
+  if (!gst_d3d_plugin_shader_get_ps_blob (GST_D3D_PLUGIN_PS_COLOR,
+          GST_D3D_SM_5_0, &ps_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get ps bytecode");
+    return FALSE;
+  }
+
   D3D12_INPUT_ELEMENT_DESC input_desc[2];
   input_desc[0].SemanticName = "POSITION";
   input_desc[0].SemanticIndex = 0;
@@ -646,10 +670,10 @@ setup_smpte_render (GstD3D12TestSrc * self, RenderContext * ctx)
 
   D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = { };
   pso_desc.pRootSignature = rs.Get ();
-  pso_desc.VS.BytecodeLength = sizeof (g_VSMain_color);
-  pso_desc.VS.pShaderBytecode = g_VSMain_color;
-  pso_desc.PS.BytecodeLength = sizeof (g_PSMain_color);
-  pso_desc.PS.pShaderBytecode = g_PSMain_color;
+  pso_desc.VS.BytecodeLength = vs_code.byte_code_len;
+  pso_desc.VS.pShaderBytecode = vs_code.byte_code;
+  pso_desc.PS.BytecodeLength = ps_code.byte_code_len;
+  pso_desc.PS.pShaderBytecode = ps_code.byte_code;
   pso_desc.BlendState = CD3DX12_BLEND_DESC (D3D12_DEFAULT);
   pso_desc.SampleMask = UINT_MAX;
   pso_desc.RasterizerState = CD3DX12_RASTERIZER_DESC (D3D12_DEFAULT);
@@ -1004,6 +1028,20 @@ setup_checker_render (GstD3D12TestSrc * self, RenderContext * ctx,
     return FALSE;
   }
 
+  GstD3DShaderByteCode vs_code;
+  GstD3DShaderByteCode ps_code;
+  if (!gst_d3d_plugin_shader_get_vs_blob (GST_D3D_PLUGIN_VS_COORD,
+          GST_D3D_SM_5_0, &vs_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get vs bytecode");
+    return FALSE;
+  }
+
+  if (!gst_d3d_plugin_shader_get_ps_blob (GST_D3D_PLUGIN_PS_CHECKER,
+          GST_D3D_SM_5_0, &ps_code)) {
+    GST_ERROR_OBJECT (self, "Couldn't get ps bytecode");
+    return FALSE;
+  }
+
   D3D12_INPUT_ELEMENT_DESC input_desc[2];
   input_desc[0].SemanticName = "POSITION";
   input_desc[0].SemanticIndex = 0;
@@ -1023,10 +1061,10 @@ setup_checker_render (GstD3D12TestSrc * self, RenderContext * ctx,
 
   D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = { };
   pso_desc.pRootSignature = rs.Get ();
-  pso_desc.VS.BytecodeLength = sizeof (g_VSMain_coord);
-  pso_desc.VS.pShaderBytecode = g_VSMain_coord;
-  pso_desc.PS.BytecodeLength = sizeof (g_PSMain_checker);
-  pso_desc.PS.pShaderBytecode = g_PSMain_checker;
+  pso_desc.VS.BytecodeLength = vs_code.byte_code_len;
+  pso_desc.VS.pShaderBytecode = vs_code.byte_code;
+  pso_desc.PS.BytecodeLength = ps_code.byte_code_len;
+  pso_desc.PS.pShaderBytecode = ps_code.byte_code;
   pso_desc.BlendState = CD3DX12_BLEND_DESC (D3D12_DEFAULT);
   pso_desc.SampleMask = UINT_MAX;
   pso_desc.RasterizerState = CD3DX12_RASTERIZER_DESC (D3D12_DEFAULT);
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker.hlsl
deleted file mode 100644
index 68557b62cd..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker.hlsl
+++ /dev/null
@@ -1,44 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-cbuffer CheckerConstBuffer : register(b0)
-{
-  float width;
-  float height;
-  float checker_size;
-  float alpha;
-};
-
-struct PS_INPUT
-{
-  float4 Position: SV_POSITION;
-  float2 Texture: TEXCOORD;
-};
-
-float4 PSMain_checker (PS_INPUT input) : SV_Target
-{
-  float4 output;
-  float2 xy_mod = floor (0.5 * input.Texture * float2 (width, height) / checker_size);
-  float result = fmod (xy_mod.x + xy_mod.y, 2.0);
-  output.r = step (result, 0.5);
-  output.g = 1.0 - output.r;
-  output.b = 0;
-  output.a = alpha;
-  return output;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_luma.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_luma.hlsl
deleted file mode 100644
index 990c71891d..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_luma.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-static const float blocksize = 8.0;
-static const float4 high = float4 (0.667, 0.0, 0.0, 1.0);
-static const float4 low = float4 (0.333, 0.0, 0.0, 1.0);
-
-struct PS_INPUT
-{
-  float4 Position : SV_POSITION;
-};
-
-struct PS_OUTPUT
-{
-  float4 Plane : SV_TARGET;
-};
-
-PS_OUTPUT PSMain_checker_luma (PS_INPUT input)
-{
-  PS_OUTPUT output;
-  if ((input.Position.x % (blocksize * 2.0)) >= blocksize) {
-    if ((input.Position.y % (blocksize * 2.0)) >= blocksize)
-      output.Plane = low;
-    else
-      output.Plane = high;
-  } else {
-    if ((input.Position.y % (blocksize * 2.0)) < blocksize)
-      output.Plane = low;
-    else
-      output.Plane = high;
-  }
-  return output;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_rgb.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_rgb.hlsl
deleted file mode 100644
index 32d5eb960b..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_rgb.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-static const float blocksize = 8.0;
-static const float4 high = float4 (0.667, 0.667, 0.667, 1.0);
-static const float4 low = float4 (0.333, 0.333, 0.333, 1.0);
-
-struct PS_INPUT
-{
-  float4 Position : SV_POSITION;
-};
-
-struct PS_OUTPUT
-{
-  float4 Plane : SV_TARGET;
-};
-
-PS_OUTPUT PSMain_checker_rgb (PS_INPUT input)
-{
-  PS_OUTPUT output;
-  if ((input.Position.x % (blocksize * 2.0)) >= blocksize) {
-    if ((input.Position.y % (blocksize * 2.0)) >= blocksize)
-      output.Plane = low;
-    else
-      output.Plane = high;
-  } else {
-    if ((input.Position.y % (blocksize * 2.0)) < blocksize)
-      output.Plane = low;
-    else
-      output.Plane = high;
-  }
-  return output;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_vuya.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_vuya.hlsl
deleted file mode 100644
index 22f139fe61..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_checker_vuya.hlsl
+++ /dev/null
@@ -1,49 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-static const float blocksize = 8.0;
-static const float4 high = float4 (0.5, 0.5, 0.667, 1.0);
-static const float4 low = float4 (0.5, 0.5, 0.333, 1.0);
-
-struct PS_INPUT
-{
-  float4 Position : SV_POSITION;
-};
-
-struct PS_OUTPUT
-{
-  float4 Plane : SV_TARGET;
-};
-
-PS_OUTPUT PSMain_checker_vuya (PS_INPUT input)
-{
-  PS_OUTPUT output;
-  if ((input.Position.x % (blocksize * 2.0)) >= blocksize) {
-    if ((input.Position.y % (blocksize * 2.0)) >= blocksize)
-      output.Plane = low;
-    else
-      output.Plane = high;
-  } else {
-    if ((input.Position.y % (blocksize * 2.0)) < blocksize)
-      output.Plane = low;
-    else
-      output.Plane = high;
-  }
-  return output;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_color.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_color.hlsl
deleted file mode 100644
index 8b809eb6e8..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_color.hlsl
+++ /dev/null
@@ -1,29 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-struct PS_INPUT
-{
-  float4 Position: SV_POSITION;
-  float4 Color: COLOR;
-};
-
-float4 PSMain_color (PS_INPUT input) : SV_TARGET
-{
-  return input.Color;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_converter.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_converter.hlsl
deleted file mode 100644
index 326bc7a435..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_converter.hlsl
+++ /dev/null
@@ -1,939 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-cbuffer PsAlphaFactor : register(b1)
-{
-  float alphaFactor;
-};
-
-struct PSColorSpace
-{
-  float3 CoeffX;
-  float3 CoeffY;
-  float3 CoeffZ;
-  float3 Offset;
-  float3 Min;
-  float3 Max;
-  float padding;
-};
-
-cbuffer PsConstBuffer : register(b2)
-{
-  PSColorSpace preCoeff;
-  PSColorSpace postCoeff;
-  PSColorSpace primariesCoeff;
-};
-
-Texture2D shaderTexture_0 : register(t0);
-Texture2D shaderTexture_1 : register(t1);
-Texture2D shaderTexture_2 : register(t2);
-Texture2D shaderTexture_3 : register(t3);
-Texture1D<float> gammaDecLUT : register(t4);
-Texture1D<float> gammaEncLUT : register(t5);
-
-SamplerState samplerState : register(s0);
-SamplerState lutSamplerState : register(s1);
-
-struct PS_INPUT
-{
-  float4 Position: SV_POSITION;
-  float2 Texture: TEXCOORD;
-};
-
-struct PS_OUTPUT_PACKED
-{
-  float4 Plane0: SV_TARGET0;
-};
-
-struct PS_OUTPUT_LUMA
-{
-  float4 Plane0: SV_TARGET0;
-};
-
-struct PS_OUTPUT_CHROMA
-{
-  float4 Plane0: SV_TARGET0;
-};
-
-struct PS_OUTPUT_CHROMA_PLANAR
-{
-  float4 Plane0: SV_TARGET0;
-  float4 Plane1: SV_TARGET1;
-};
-
-struct PS_OUTPUT_PLANAR
-{
-  float4 Plane0: SV_TARGET0;
-  float4 Plane1: SV_TARGET1;
-  float4 Plane2: SV_TARGET2;
-};
-
-struct PS_OUTPUT_PLANAR_FULL
-{
-  float4 Plane0: SV_TARGET0;
-  float4 Plane1: SV_TARGET1;
-  float4 Plane2: SV_TARGET2;
-  float4 Plane3: SV_TARGET3;
-};
-
-float4 DoAlphaPremul (float4 sample)
-{
-  float4 premul_tex;
-  premul_tex.rgb = sample.rgb * sample.a;
-  premul_tex.a = sample.a;
-  return premul_tex;
-}
-
-float4 DoAlphaUnpremul (float4 sample)
-{
-  float4 unpremul_tex;
-  if (sample.a == 0 || sample.a == 1)
-    return sample;
-
-  unpremul_tex.rgb = saturate (sample.rgb / sample.a);
-  unpremul_tex.a = sample.a;
-  return unpremul_tex;
-}
-
-interface ISampler
-{
-  float4 Execute (float2 uv);
-};
-
-class SamplerRGBA : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv);
-  }
-};
-
-class SamplerRGBAPremul : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return DoAlphaUnpremul (shaderTexture_0.Sample(samplerState, uv));
-  }
-};
-
-class SamplerRBGA : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).rbga;
-  }
-};
-
-class SamplerVUYA : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).zyxw;
-  }
-};
-
-class SamplerY410 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return float4 (shaderTexture_0.Sample(samplerState, uv).yxz, 1.0);
-  }
-};
-
-class SamplerY412 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).grba;
-  }
-};
-
-class SamplerAYUV : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).yzwx;
-  }
-};
-
-class SamplerRGBx : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return float4 (shaderTexture_0.Sample(samplerState, uv).rgb, 1.0);
-  }
-};
-
-class SamplerxRGB : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return float4 (shaderTexture_0.Sample(samplerState, uv).gba, 1.0);
-  }
-};
-
-class SamplerARGB : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).gbar;
-  }
-};
-
-class SamplerxBGR : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return float4 (shaderTexture_0.Sample(samplerState, uv).abg, 1.0);
-  }
-};
-
-class SamplerABGR : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).abgr;
-  }
-};
-
-class SamplerBGR10A2 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return float4 (shaderTexture_0.Sample(samplerState, uv).zyx, 1.0);
-  }
-};
-
-class SamplerBGRA64 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    return shaderTexture_0.Sample(samplerState, uv).bgra;
-  }
-};
-
-class SamplerGRAY : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.y = 0.5;
-    sample.z = 0.5;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerNV12 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.yz = shaderTexture_1.Sample(samplerState, uv).xy;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerNV21 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.yz = shaderTexture_1.Sample(samplerState, uv).yx;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerI420 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.y = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.z = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerYV12 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.z = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.y = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerI420_10 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float3 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.y = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.z = shaderTexture_2.Sample(samplerState, uv).x;
-    return float4 (saturate (sample * 64.0), 1.0);
-  }
-};
-
-class SamplerI420_12 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float3 sample;
-    sample.x = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.y = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.z = shaderTexture_2.Sample(samplerState, uv).x;
-    return float4 (saturate (sample * 16.0), 1.0);
-  }
-};
-
-class SamplerGBR : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.g = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerGBR_10 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float3 sample;
-    sample.g = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    return float4 (saturate (sample * 64.0), 1.0);
-  }
-};
-
-class SamplerGBR_12 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float3 sample;
-    sample.g = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    return float4 (saturate (sample * 16.0), 1.0);
-  }
-};
-
-class SamplerRGBP : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.r = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.g = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerBGRP : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.b = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.g = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = 1.0;
-    return sample;
-  }
-};
-
-class SamplerGBRA : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.g = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = shaderTexture_3.Sample(samplerState, uv).x;
-    return sample;
-  }
-};
-
-class SamplerGBRA_10 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.g = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = shaderTexture_3.Sample(samplerState, uv).x;
-    return saturate (sample * 64.0);
-  }
-};
-
-class SamplerGBRA_12 : ISampler
-{
-  float4 Execute (float2 uv)
-  {
-    float4 sample;
-    sample.g = shaderTexture_0.Sample(samplerState, uv).x;
-    sample.b = shaderTexture_1.Sample(samplerState, uv).x;
-    sample.r = shaderTexture_2.Sample(samplerState, uv).x;
-    sample.a = shaderTexture_3.Sample(samplerState, uv).x;
-    return saturate (sample * 16.0);
-  }
-};
-
-interface IConverter
-{
-  float4 Execute (float4 sample);
-};
-
-class ConverterIdentity : IConverter
-{
-  float4 Execute (float4 sample)
-  {
-    return sample;
-  }
-};
-
-class ConverterRange : IConverter
-{
-  float4 Execute (float4 sample)
-  {
-    float3 out_space;
-    out_space.x = postCoeff.CoeffX.x * sample.x;
-    out_space.y = postCoeff.CoeffY.y * sample.y;
-    out_space.z = postCoeff.CoeffZ.z * sample.z;
-    out_space += postCoeff.Offset;
-    return float4 (clamp (out_space, postCoeff.Min, postCoeff.Max), sample.a);
-  }
-};
-
-class ConverterSimple : IConverter
-{
-  float4 Execute (float4 sample)
-  {
-    float3 out_space;
-    out_space.x = dot (postCoeff.CoeffX, sample.xyz);
-    out_space.y = dot (postCoeff.CoeffY, sample.xyz);
-    out_space.z = dot (postCoeff.CoeffZ, sample.xyz);
-    out_space += postCoeff.Offset;
-    return float4 (clamp (out_space, postCoeff.Min, postCoeff.Max), sample.a);
-  }
-};
-
-class ConverterGamma : IConverter
-{
-  float4 Execute (float4 sample)
-  {
-    float3 out_space;
-    out_space.x = dot (preCoeff.CoeffX, sample.xyz);
-    out_space.y = dot (preCoeff.CoeffY, sample.xyz);
-    out_space.z = dot (preCoeff.CoeffZ, sample.xyz);
-    out_space += preCoeff.Offset;
-    out_space = clamp (out_space, preCoeff.Min, preCoeff.Max);
-
-    out_space.x = gammaDecLUT.Sample (lutSamplerState, out_space.x);
-    out_space.y = gammaDecLUT.Sample (lutSamplerState, out_space.y);
-    out_space.z = gammaDecLUT.Sample (lutSamplerState, out_space.z);
-
-    out_space.x = gammaEncLUT.Sample (lutSamplerState, out_space.x);
-    out_space.y = gammaEncLUT.Sample (lutSamplerState, out_space.y);
-    out_space.z = gammaEncLUT.Sample (lutSamplerState, out_space.z);
-
-    out_space.x = dot (postCoeff.CoeffX, out_space);
-    out_space.y = dot (postCoeff.CoeffY, out_space);
-    out_space.z = dot (postCoeff.CoeffZ, out_space);
-    out_space += postCoeff.Offset;
-    return float4 (clamp (out_space, postCoeff.Min, postCoeff.Max), sample.a);
-  }
-};
-
-class ConverterPrimary : IConverter
-{
-  float4 Execute (float4 sample)
-  {
-    float3 out_space;
-    float3 tmp;
-    out_space.x = dot (preCoeff.CoeffX, sample.xyz);
-    out_space.y = dot (preCoeff.CoeffY, sample.xyz);
-    out_space.z = dot (preCoeff.CoeffZ, sample.xyz);
-    out_space += preCoeff.Offset;
-    out_space = clamp (out_space, preCoeff.Min, preCoeff.Max);
-
-    out_space.x = gammaDecLUT.Sample (lutSamplerState, out_space.x);
-    out_space.y = gammaDecLUT.Sample (lutSamplerState, out_space.y);
-    out_space.z = gammaDecLUT.Sample (lutSamplerState, out_space.z);
-
-    tmp.x = dot (primariesCoeff.CoeffX, out_space);
-    tmp.y = dot (primariesCoeff.CoeffY, out_space);
-    tmp.z = dot (primariesCoeff.CoeffZ, out_space);
-
-    out_space.x = gammaEncLUT.Sample (lutSamplerState, tmp.x);
-    out_space.y = gammaEncLUT.Sample (lutSamplerState, tmp.y);
-    out_space.z = gammaEncLUT.Sample (lutSamplerState, tmp.z);
-
-    out_space.x = dot (postCoeff.CoeffX, out_space);
-    out_space.y = dot (postCoeff.CoeffY, out_space);
-    out_space.z = dot (postCoeff.CoeffZ, out_space);
-    out_space += postCoeff.Offset;
-    return float4 (clamp (out_space, postCoeff.Min, postCoeff.Max), sample.a);
-  }
-};
-
-float UnormTo10bit (float sample)
-{
-  return sample * 1023.0 / 65535.0;
-}
-
-float2 UnormTo10bit (float2 sample)
-{
-  return sample * 1023.0 / 65535.0;
-}
-
-float3 UnormTo10bit (float3 sample)
-{
-  return sample * 1023.0 / 65535.0;
-}
-
-float4 UnormTo10bit (float4 sample)
-{
-  return sample * 1023.0 / 65535.0;
-}
-
-float UnormTo12bit (float sample)
-{
-  return sample * 4095.0 / 65535.0;
-}
-
-float2 UnormTo12bit (float2 sample)
-{
-  return sample * 4095.0 / 65535.0;
-}
-
-float3 UnormTo12bit (float3 sample)
-{
-  return sample * 4095.0 / 65535.0;
-}
-
-float4 UnormTo12bit (float4 sample)
-{
-  return sample * 4095.0 / 65535.0;
-}
-
-interface IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample);
-};
-
-class OutputRGBA : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    output.Plane0 = float4 (sample.rgb, sample.a * alphaFactor);
-    return output;
-  }
-};
-
-class OutputRGBAPremul : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    sample.a *= alphaFactor;
-    output.Plane0 = DoAlphaPremul (sample);
-    return output;
-  }
-};
-
-class OutputRGBx : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    output.Plane0 = float4 (sample.rgb, 1.0);
-    return output;
-  }
-};
-
-class OutputxRGB : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    output.Plane0 = float4 (0.0, sample.rgb);
-    return output;
-  }
-};
-
-class OutputARGB : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    output.Plane0 = sample.argb;
-    return output;
-  }
-};
-
-class OutputxBGR : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    output.Plane0 = float4 (0.0, sample.bgr);
-    return output;
-  }
-};
-
-class OutputABGR : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    output.Plane0 = sample.abgr;
-    return output;
-  }
-};
-
-class OutputVUYA : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    sample.a *= alphaFactor;
-    output.Plane0 = sample.zyxw;
-    return output;
-  }
-};
-
-class OutputAYUV : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    sample.a *= alphaFactor;
-    output.Plane0 = sample.wxyz;
-    return output;
-  }
-};
-
-class OutputRBGA : IOutputPacked
-{
-  PS_OUTPUT_PACKED Build (float4 sample)
-  {
-    PS_OUTPUT_PACKED output;
-    sample.a *= alphaFactor;
-    output.Plane0 = sample.rbga;
-    return output;
-  }
-};
-
-interface IOutputLuma
-{
-  PS_OUTPUT_LUMA Build (float4 sample);
-};
-
-class OutputLuma : IOutputLuma
-{
-  PS_OUTPUT_LUMA Build (float4 sample)
-  {
-    PS_OUTPUT_LUMA output;
-    output.Plane0 = float4 (sample.x, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputLuma_10 : IOutputLuma
-{
-  PS_OUTPUT_LUMA Build (float4 sample)
-  {
-    PS_OUTPUT_LUMA output;
-    output.Plane0 = float4 (UnormTo10bit (sample.x), 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputLuma_12 : IOutputLuma
-{
-  PS_OUTPUT_LUMA Build (float4 sample)
-  {
-    PS_OUTPUT_LUMA output;
-    output.Plane0 = float4 (UnormTo12bit (sample.x), 0, 0, 0);
-    return output;
-  }
-};
-
-interface IOutputChroma
-{
-  PS_OUTPUT_CHROMA Build (float4 sample);
-};
-
-class OutputChromaNV12 : IOutputChroma
-{
-  PS_OUTPUT_CHROMA Build (float4 sample)
-  {
-    PS_OUTPUT_CHROMA output;
-    output.Plane0 = float4 (sample.yz, 0, 0);
-    return output;
-  }
-};
-
-class OutputChromaNV21 : IOutputChroma
-{
-  PS_OUTPUT_CHROMA Build (float4 sample)
-  {
-    PS_OUTPUT_CHROMA output;
-    output.Plane0 = float4 (sample.zy, 0, 0);
-    return output;
-  }
-};
-
-interface IOutputChromaPlanar
-{
-  PS_OUTPUT_CHROMA_PLANAR Build (float4 sample);
-};
-
-class OutputChromaI420 : IOutputChromaPlanar
-{
-  PS_OUTPUT_CHROMA_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_CHROMA_PLANAR output;
-    output.Plane0 = float4 (sample.y, 0, 0, 0);
-    output.Plane1 = float4 (sample.z, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputChromaYV12 : IOutputChromaPlanar
-{
-  PS_OUTPUT_CHROMA_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_CHROMA_PLANAR output;
-    output.Plane0 = float4 (sample.z, 0, 0, 0);
-    output.Plane1 = float4 (sample.y, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputChromaI420_10 : IOutputChromaPlanar
-{
-  PS_OUTPUT_CHROMA_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_CHROMA_PLANAR output;
-    float2 scaled = UnormTo10bit (sample.yz);
-    output.Plane0 = float4 (scaled.x, 0, 0, 0);
-    output.Plane1 = float4 (scaled.y, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputChromaI420_12 : IOutputChromaPlanar
-{
-  PS_OUTPUT_CHROMA_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_CHROMA_PLANAR output;
-    float2 scaled = UnormTo12bit (sample.yz);
-    output.Plane0 = float4 (scaled.x, 0, 0, 0);
-    output.Plane1 = float4 (scaled.y, 0, 0, 0);
-    return output;
-  }
-};
-
-interface IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample);
-};
-
-class OutputY444 : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    output.Plane0 = float4 (sample.x, 0, 0, 0);
-    output.Plane1 = float4 (sample.y, 0, 0, 0);
-    output.Plane2 = float4 (sample.z, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputY444_10 : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    float3 scaled = UnormTo10bit (sample.xyz);
-    output.Plane0 = float4 (scaled.x, 0, 0, 0);
-    output.Plane1 = float4 (scaled.y, 0, 0, 0);
-    output.Plane2 = float4 (scaled.z, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputY444_12 : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    float3 scaled = UnormTo12bit (sample.xyz);
-    output.Plane0 = float4 (scaled.x, 0, 0, 0);
-    output.Plane1 = float4 (scaled.y, 0, 0, 0);
-    output.Plane2 = float4 (scaled.z, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputGBR : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    output.Plane0 = float4 (sample.g, 0, 0, 0);
-    output.Plane1 = float4 (sample.b, 0, 0, 0);
-    output.Plane2 = float4 (sample.r, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputGBR_10 : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    float3 scaled = UnormTo10bit (sample.rgb);
-    output.Plane0 = float4 (scaled.g, 0, 0, 0);
-    output.Plane1 = float4 (scaled.b, 0, 0, 0);
-    output.Plane2 = float4 (scaled.r, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputGBR_12 : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    float3 scaled = UnormTo12bit (sample.rgb);
-    output.Plane0 = float4 (scaled.g, 0, 0, 0);
-    output.Plane1 = float4 (scaled.b, 0, 0, 0);
-    output.Plane2 = float4 (scaled.r, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputRGBP : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    output.Plane0 = float4 (sample.r, 0, 0, 0);
-    output.Plane1 = float4 (sample.g, 0, 0, 0);
-    output.Plane2 = float4 (sample.b, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputBGRP : IOutputPlanar
-{
-  PS_OUTPUT_PLANAR Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR output;
-    output.Plane0 = float4 (sample.b, 0, 0, 0);
-    output.Plane1 = float4 (sample.g, 0, 0, 0);
-    output.Plane2 = float4 (sample.r, 0, 0, 0);
-    return output;
-  }
-};
-
-interface IOutputPlanarFull
-{
-  PS_OUTPUT_PLANAR_FULL Build (float4 sample);
-};
-
-class OutputGBRA : IOutputPlanarFull
-{
-  PS_OUTPUT_PLANAR_FULL Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR_FULL output;
-    output.Plane0 = float4 (sample.g, 0, 0, 0);
-    output.Plane1 = float4 (sample.b, 0, 0, 0);
-    output.Plane2 = float4 (sample.r, 0, 0, 0);
-    output.Plane3 = float4 (sample.a * alphaFactor, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputGBRA_10 : IOutputPlanarFull
-{
-  PS_OUTPUT_PLANAR_FULL Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR_FULL output;
-    float4 scaled;
-    sample.a *= alphaFactor;
-    scaled = UnormTo10bit (sample);
-    output.Plane0 = float4 (scaled.g, 0, 0, 0);
-    output.Plane1 = float4 (scaled.b, 0, 0, 0);
-    output.Plane2 = float4 (scaled.r, 0, 0, 0);
-    output.Plane3 = float4 (scaled.a, 0, 0, 0);
-    return output;
-  }
-};
-
-class OutputGBRA_12 : IOutputPlanarFull
-{
-  PS_OUTPUT_PLANAR_FULL Build (float4 sample)
-  {
-    PS_OUTPUT_PLANAR_FULL output;
-    float4 scaled;
-    sample.a *= alphaFactor;
-    scaled = UnormTo12bit (sample);
-    output.Plane0 = float4 (scaled.g, 0, 0, 0);
-    output.Plane1 = float4 (scaled.b, 0, 0, 0);
-    output.Plane2 = float4 (scaled.r, 0, 0, 0);
-    output.Plane3 = float4 (scaled.a, 0, 0, 0);
-    return output;
-  }
-};
-
-OUTPUT_TYPE ENTRY_POINT (PS_INPUT input)
-{
-  SAMPLER g_sampler;
-  CONVERTER g_converter;
-  OUTPUT_BUILDER g_builder;
-  return g_builder.Build (g_converter.Execute (g_sampler.Execute (input.Texture)));
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample.hlsl
deleted file mode 100644
index e9340d926e..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample.hlsl
+++ /dev/null
@@ -1,32 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-Texture2D shaderTexture : register(t0);
-SamplerState samplerState : register(s0);
-
-struct PS_INPUT
-{
-  float4 Position : SV_POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-float4 PSMain_sample (PS_INPUT input): SV_TARGET
-{
-  return shaderTexture.Sample (samplerState, input.Texture);
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample_premul.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample_premul.hlsl
deleted file mode 100644
index 0b9b0917af..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_sample_premul.hlsl
+++ /dev/null
@@ -1,38 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-Texture2D shaderTexture : register(t0);
-SamplerState samplerState : register(s0);
-
-struct PS_INPUT
-{
-  float4 Position : SV_POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-float4 PSMain_sample_premul (PS_INPUT input): SV_TARGET
-{
-  float4 sample = shaderTexture.Sample (samplerState, input.Texture);
-  float4 premul_sample;
-  premul_sample.r = saturate (sample.r * sample.a);
-  premul_sample.g = saturate (sample.g * sample.a);
-  premul_sample.b = saturate (sample.b * sample.a);
-  premul_sample.a = sample.a;
-  return premul_sample;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_snow.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_snow.hlsl
deleted file mode 100644
index 27af33f61c..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/PSMain_snow.hlsl
+++ /dev/null
@@ -1,45 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-cbuffer SnowConstBuffer : register(b0)
-{
-  float time;
-  float alpha;
-};
-
-struct PS_INPUT
-{
-  float4 Position : SV_POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-float get_rand (float2 uv)
-{
-  return frac (sin (dot (uv, float2 (12.9898,78.233))) * 43758.5453);
-}
-
-float4 PSMain_snow (PS_INPUT input) : SV_Target
-{
-  float4 output;
-  float val = get_rand (time * input.Texture);
-  output.rgb = float3(val, val, val);
-  output.a = alpha;
-  return output;
-}
-
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_color.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_color.hlsl
deleted file mode 100644
index c9e2f631ee..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_color.hlsl
+++ /dev/null
@@ -1,35 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-struct VS_INPUT
-{
-  float4 Position : POSITION;
-  float4 Color : COLOR;
-};
-
-struct VS_OUTPUT
-{
-  float4 Position : SV_POSITION;
-  float4 Color : COLOR;
-};
-
-VS_OUTPUT VSMain_color (VS_INPUT input)
-{
-  return input;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_converter.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_converter.hlsl
deleted file mode 100644
index b2de1fbcb6..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_converter.hlsl
+++ /dev/null
@@ -1,45 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-cbuffer VsConstBuffer : register(b0)
-{
-  matrix Transform;
-};
-
-struct VS_INPUT
-{
-  float4 Position : POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-struct VS_OUTPUT
-{
-  float4 Position : SV_POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-VS_OUTPUT VSMain_converter (VS_INPUT input)
-{
-  VS_OUTPUT output;
-
-  output.Position = mul (Transform, input.Position);
-  output.Texture = input.Texture;
-
-  return output;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_coord.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_coord.hlsl
deleted file mode 100644
index 06d41d6e18..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_coord.hlsl
+++ /dev/null
@@ -1,35 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-struct VS_INPUT
-{
-  float4 Position : POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-struct VS_OUTPUT
-{
-  float4 Position : SV_POSITION;
-  float2 Texture : TEXCOORD;
-};
-
-VS_OUTPUT VSMain_coord (VS_INPUT input)
-{
-  return input;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_pos.hlsl b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_pos.hlsl
deleted file mode 100644
index df069fd5de..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/VSMain_pos.hlsl
+++ /dev/null
@@ -1,33 +0,0 @@
-/* GStreamer
- * Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-struct VS_INPUT
-{
-  float4 Position : POSITION;
-};
-
-struct VS_OUTPUT
-{
-  float4 Position : SV_POSITION;
-};
-
-VS_OUTPUT VSMain_pos (VS_INPUT input)
-{
-  return input;
-}
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/collect_hlsl_header.py b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/collect_hlsl_header.py
deleted file mode 100644
index 1c8cf3c1e1..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/collect_hlsl_header.py
+++ /dev/null
@@ -1,64 +0,0 @@
-#!/usr/bin/env python3
-# GStreamer
-# Copyright (C) 2023 Seungha Yang <seungha@centricular.com>
-#
-# This library is free software; you can redistribute it and/or
-# modify it under the terms of the GNU Library General Public
-# License as published by the Free Software Foundation; either
-# version 2 of the License, or (at your option) any later version.
-#
-# This library is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# Library General Public License for more details.
-#
-# You should have received a copy of the GNU Library General Public
-# License along with this library; if not, write to the
-# Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-
-import sys
-import os
-import argparse
-
-start_header = """/*
- * This file is autogenerated by collect_hlsl_header.py
- */
-#pragma once
-
-"""
-
-start_map = """
-#define MAKE_BYTECODE(name) { G_STRINGIFY (name), { g_##name, sizeof (g_##name)} }
-static const std::map<std::string, std::pair<const BYTE *, SIZE_T>> precompiled_bytecode = {
-"""
-
-end_map = """};
-#undef MAKE_BYTECODE
-"""
-
-def main(args):
-    parser = argparse.ArgumentParser(description='Read precompiled HLSL headers from directory and make single header')
-    parser.add_argument("--input", help="the precompiled HLSL header directory")
-    parser.add_argument("--output", help="output header file location")
-    parser.add_argument("--prefix", help="HLSL header filename prefix")
-    args = parser.parse_args(args)
-
-    # Scan precompiled PSMain_*.h headers in build directory
-    # and generate single header
-    hlsl_headers = [os.path.basename(file) for file in os.listdir(args.input) if file.startswith(args.prefix) and file.endswith(".h") ]
-
-    with open(args.output, 'w', newline='\n', encoding='utf8') as f:
-        f.write(start_header)
-        for file in hlsl_headers:
-            f.write("#include \"")
-            f.write(file)
-            f.write("\"\n")
-        f.write(start_map)
-        for file in hlsl_headers:
-            f.write("  MAKE_BYTECODE ({}),\n".format(os.path.splitext(file)[0]))
-        f.write(end_map)
-
-
-if __name__ == "__main__":
-    sys.exit(main(sys.argv[1:]))
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/meson.build b/subprojects/gst-plugins-bad/sys/d3d12/hlsl/meson.build
deleted file mode 100644
index 9c77fea939..0000000000
--- a/subprojects/gst-plugins-bad/sys/d3d12/hlsl/meson.build
+++ /dev/null
@@ -1,169 +0,0 @@
-hlsl_conv_ps_source = files('PSMain_converter.hlsl')
-
-hlsl_conv_ps_input_formats = [
-  ['NV12', false, 2],
-  ['NV21', false, 2],
-  ['I420', false, 3],
-  ['YV12', false, 3],
-  ['I420_10', false, 3],
-  ['I420_12', false, 3],
-  ['VUYA', false, 1],
-  ['Y410', false, 1],
-  ['AYUV', false, 1],
-  ['Y412', false, 1],
-  ['RGBA', true, 1],
-  ['RGBAPremul', true, 1],
-  ['RGBx', true, 1],
-  ['GBR', true, 3],
-  ['GBR_10', true, 3],
-  ['GBR_12', true, 3],
-  ['GBRA', true, 4],
-  ['GBRA_10', true, 4],
-  ['GBRA_12', true, 4],
-  ['RGBP', true, 3],
-  ['BGRP', true, 3],
-  ['xRGB', true, 1],
-  ['ARGB', true, 1],
-  ['xBGR', true, 1],
-  ['ABGR', true, 1],
-  ['BGR10A2', true, 1],
-  ['BGRA64', true, 1],
-  ['RBGA', true, 1],
-  ['GRAY', false, 1],
-]
-
-hlsl_conv_ps_output_formats = [
-  ['PS_OUTPUT_LUMA', 'Luma', false],
-  ['PS_OUTPUT_LUMA', 'Luma_10', false],
-  ['PS_OUTPUT_LUMA', 'Luma_12', false],
-  ['PS_OUTPUT_CHROMA', 'ChromaNV12', false],
-  ['PS_OUTPUT_CHROMA', 'ChromaNV21', false],
-  ['PS_OUTPUT_CHROMA_PLANAR', 'ChromaI420', false],
-  ['PS_OUTPUT_CHROMA_PLANAR', 'ChromaYV12', false],
-  ['PS_OUTPUT_CHROMA_PLANAR', 'ChromaI420_10', false],
-  ['PS_OUTPUT_CHROMA_PLANAR', 'ChromaI420_12', false],
-  ['PS_OUTPUT_PLANAR', 'Y444', false],
-  ['PS_OUTPUT_PLANAR', 'Y444_10', false],
-  ['PS_OUTPUT_PLANAR', 'Y444_12', false],
-  ['PS_OUTPUT_PLANAR', 'GBR', true],
-  ['PS_OUTPUT_PLANAR', 'GBR_10', true],
-  ['PS_OUTPUT_PLANAR', 'GBR_12', true],
-  ['PS_OUTPUT_PLANAR', 'RGBP', true],
-  ['PS_OUTPUT_PLANAR', 'BGRP', true],
-  ['PS_OUTPUT_PLANAR_FULL', 'GBRA', true],
-  ['PS_OUTPUT_PLANAR_FULL', 'GBRA_10', true],
-  ['PS_OUTPUT_PLANAR_FULL', 'GBRA_12', true],
-  ['PS_OUTPUT_PACKED', 'RGBA', true],
-  ['PS_OUTPUT_PACKED', 'RGBAPremul', true],
-  ['PS_OUTPUT_PACKED', 'RBGA', true],
-  ['PS_OUTPUT_PACKED', 'RGBx', true],
-  ['PS_OUTPUT_PACKED', 'VUYA', false],
-  ['PS_OUTPUT_PACKED', 'AYUV', false],
-  ['PS_OUTPUT_PACKED', 'xRGB', true],
-  ['PS_OUTPUT_PACKED', 'ARGB', true],
-  ['PS_OUTPUT_PACKED', 'xBGR', true],
-  ['PS_OUTPUT_PACKED', 'ABGR', true],
-]
-
-extra_converters = [
-  'Gamma',
-  'Primary',
-]
-
-header_collector = find_program('collect_hlsl_header.py')
-
-foreach input_format : hlsl_conv_ps_input_formats
-  in_format = input_format.get(0)
-  num_srv = input_format.get(2)
-  foreach output_format : hlsl_conv_ps_output_formats
-    converters = []
-    if input_format.get(1) != output_format.get(2)
-      converters += ['Simple']
-    else
-      converters += ['Identity', 'Range']
-    endif
-    output_type = output_format.get(0)
-    output_builder = output_format.get(1)
-    foreach conv : converters
-      entry_point = 'PSMain_@0@_@1@_@2@'.format(in_format, conv, output_builder)
-      header = '@0@.h'.format(entry_point)
-      compiled_shader = custom_target(header,
-          input : hlsl_conv_ps_source,
-          output : header,
-          command : [fxc, '/Fh', '@OUTPUT@',
-                    '/E', entry_point,
-                    '/T', 'ps_5_0',
-                    '/D', 'OUTPUT_TYPE=@0@'.format(output_type),
-                    '/D', 'ENTRY_POINT=@0@'.format(entry_point),
-                    '/D', 'SAMPLER=Sampler@0@'.format(in_format),
-                    '/D', 'CONVERTER=Converter@0@'.format(conv),
-                    '/D', 'OUTPUT_BUILDER=Output@0@'.format(output_builder),
-                    '/nologo',
-                    '@INPUT@'])
-      hlsl_precompiled += [compiled_shader]
-    endforeach
-
-    foreach conv : extra_converters
-      entry_point = 'PSMain_@0@_@1@_@2@'.format(in_format, conv, output_builder)
-      header = '@0@.h'.format(entry_point)
-      compiled_shader = custom_target(header,
-          input : hlsl_conv_ps_source,
-          output : header,
-          command : [fxc, '/Fh', '@OUTPUT@',
-                    '/E', entry_point,
-                    '/T', 'ps_5_0',
-                    '/D', 'OUTPUT_TYPE=@0@'.format(output_type),
-                    '/D', 'ENTRY_POINT=@0@'.format(entry_point),
-                    '/D', 'SAMPLER=Sampler@0@'.format(in_format),
-                    '/D', 'CONVERTER=Converter@0@'.format(conv),
-                    '/D', 'OUTPUT_BUILDER=Output@0@'.format(output_builder),
-                    '/nologo',
-                    '@INPUT@'])
-      hlsl_precompiled += [compiled_shader]
-    endforeach
-  endforeach
-endforeach
-
-header_collection = 'PSMainConverter.h'
-generated_collection = custom_target(header_collection,
-    input : hlsl_precompiled,
-    output : header_collection,
-    command : [header_collector,
-        '--input', meson.current_build_dir(),
-        '--prefix', 'PSMain_',
-        '--output', '@OUTPUT@'
-    ])
-
-hlsl_precompiled += generated_collection
-
-hlsl_sources = [
-  ['VSMain_converter', 'vs_5_0'],
-  ['PSMain_sample', 'ps_5_0'],
-  ['PSMain_sample_premul', 'ps_5_0'],
-  ['VSMain_coord', 'vs_5_0'],
-  ['PSMain_color', 'ps_5_0'],
-  ['VSMain_color', 'vs_5_0'],
-  ['PSMain_snow', 'ps_5_0'],
-  ['PSMain_checker', 'ps_5_0'],
-  ['PSMain_checker_luma', 'ps_5_0'],
-  ['PSMain_checker_rgb', 'ps_5_0'],
-  ['PSMain_checker_vuya', 'ps_5_0'],
-  ['VSMain_pos', 'vs_5_0'],
-]
-
-foreach shader : hlsl_sources
-  entry_point = shader.get(0)
-  source = files('@0@.hlsl'.format(entry_point))
-  header = '@0@.h'.format(entry_point)
-  compiled_shader = custom_target(header,
-      input : source,
-      output : header,
-      command : [fxc, '/Fh', '@OUTPUT@',
-                '/E', entry_point,
-                '/T', shader.get(1),
-                '/nologo',
-                '@INPUT@'])
-  hlsl_precompiled += [compiled_shader]
-endforeach
-
-
diff --git a/subprojects/gst-plugins-bad/sys/d3d12/meson.build b/subprojects/gst-plugins-bad/sys/d3d12/meson.build
index dbeb9d6777..128b02fdff 100644
--- a/subprojects/gst-plugins-bad/sys/d3d12/meson.build
+++ b/subprojects/gst-plugins-bad/sys/d3d12/meson.build
@@ -46,8 +46,6 @@ d3d12_sources = [
   'plugin.cpp',
 ]
 
-hlsl_precompiled = []
-
 extra_args = [
   '-DGST_USE_UNSTABLE_API',
   # Disable this warning error. Otherwise d3dx12.h will break build
@@ -75,10 +73,9 @@ dx_headers_dep = dependency('DirectX-Headers',
     version: '>= 1.611',
     allow_fallback: true,
     required: d3d12_option)
-fxc = find_program('fxc', required : d3d12_option)
 
 if not gstdxva_dep.found() or not d3d12_lib.found() or not dxgi_lib.found() \
-  or not dx_headers_dep.found() or not fxc.found() or not d2d_dep.found() \
+  or not dx_headers_dep.found() or not gstd3dshader_dep.found() or not d2d_dep.found() \
   or not dwmapi_lib.found()
   if d3d12_option.enabled()
     error('The d3d12 was enabled explicitly, but required dependencies were not found.')
@@ -134,9 +131,6 @@ if not have_d3d12_headers
   subdir_done()
 endif
 
-hlsl_precompiled = []
-subdir('hlsl')
-
 # https://learn.microsoft.com/en-us/windows/win32/dxmath/pg-xnamath-internals#windows-sse-versus-sse2
 # x86 with Windows 7 or older may not support SSE2
 if host_machine.cpu_family() != 'x86'
@@ -144,13 +138,13 @@ if host_machine.cpu_family() != 'x86'
 endif
 
 gstd3d12 = library('gstd3d12',
-  d3d12_sources + hlsl_precompiled,
+  d3d12_sources,
   c_args : gst_plugins_bad_args + extra_args,
   cpp_args: gst_plugins_bad_args + extra_args,
   include_directories : [configinc],
   dependencies : [gstbase_dep, gstvideo_dep, gstcodecs_dep, gmodule_dep,
                   gstdxva_dep, d3d12_lib, d3d11_lib, d2d_dep, dxgi_lib,
-                  dx_headers_dep, dwmapi_lib],
+                  gstd3dshader_dep, dx_headers_dep, dwmapi_lib],
   install : true,
   install_dir : plugins_install_dir,
 )