mirror of
				https://github.com/gnif/LookingGlass.git
				synced 2025-11-03 22:22:08 +00:00 
			
		
		
		
	[host] windows: the vertex shader is common to all post-processors
This commit is contained in:
		@@ -271,6 +271,57 @@ static bool dxgi_create(CaptureGetPointerBuffer getPointerBufferFn, CapturePostP
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool initVertexShader(void)
 | 
			
		||||
{
 | 
			
		||||
  static const char * vshaderSrc =
 | 
			
		||||
    "void main(\n"
 | 
			
		||||
    "  in  uint   vertexID : SV_VERTEXID,\n"
 | 
			
		||||
    "  out float4 position : SV_POSITION,\n"
 | 
			
		||||
    "  out float2 texCoord : TEXCOORD0)\n"
 | 
			
		||||
    "{\n"
 | 
			
		||||
    "  float2 positions[4] =\n"
 | 
			
		||||
    "  {\n"
 | 
			
		||||
    "    float2(-1.0,  1.0),\n"
 | 
			
		||||
    "    float2( 1.0,  1.0),\n"
 | 
			
		||||
    "    float2(-1.0, -1.0),\n"
 | 
			
		||||
    "    float2( 1.0, -1.0)\n"
 | 
			
		||||
    "  };\n"
 | 
			
		||||
    "\n"
 | 
			
		||||
    "  float2 texCoords[4] =\n"
 | 
			
		||||
    "  {\n"
 | 
			
		||||
    "    float2(0.0, 0.0),\n"
 | 
			
		||||
    "    float2(1.0, 0.0),\n"
 | 
			
		||||
    "    float2(0.0, 1.0),\n"
 | 
			
		||||
    "    float2(1.0, 1.0)\n"
 | 
			
		||||
    "  };\n"
 | 
			
		||||
    "\n"
 | 
			
		||||
    "  position = float4(positions[vertexID], 0.0, 1.0);\n"
 | 
			
		||||
    "  texCoord = texCoords[vertexID];\n"
 | 
			
		||||
    "}";
 | 
			
		||||
 | 
			
		||||
  // compile and create the vertex shader
 | 
			
		||||
  comRef_defineLocal(ID3DBlob, byteCode);
 | 
			
		||||
  if (!compileShader(byteCode, "main", "vs_5_0", vshaderSrc))
 | 
			
		||||
    return false;
 | 
			
		||||
 | 
			
		||||
  comRef_defineLocal(ID3D11VertexShader, vshader);
 | 
			
		||||
  HRESULT status = ID3D11Device_CreateVertexShader(
 | 
			
		||||
    *this->device,
 | 
			
		||||
    ID3D10Blob_GetBufferPointer(*byteCode),
 | 
			
		||||
    ID3D10Blob_GetBufferSize   (*byteCode),
 | 
			
		||||
    NULL,
 | 
			
		||||
    vshader);
 | 
			
		||||
 | 
			
		||||
  if (FAILED(status))
 | 
			
		||||
  {
 | 
			
		||||
    DEBUG_WINERROR("Failed to create the vertex shader", status);
 | 
			
		||||
    return false;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  comRef_toGlobal(this->vshader, vshader);
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static bool dxgi_init(void)
 | 
			
		||||
{
 | 
			
		||||
  DEBUG_ASSERT(this);
 | 
			
		||||
@@ -758,6 +809,9 @@ static bool dxgi_init(void)
 | 
			
		||||
    vector_create(&this->texture[i].pp, sizeof(PostProcessInstance), 0);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (!initVertexShader())
 | 
			
		||||
    goto fail;
 | 
			
		||||
 | 
			
		||||
  const D3D11_VIEWPORT vp =
 | 
			
		||||
  {
 | 
			
		||||
    .TopLeftX = 0.0f,
 | 
			
		||||
@@ -1371,8 +1425,24 @@ static ID3D11Texture2D * ppRun(Texture * tex, ID3D11Texture2D * src)
 | 
			
		||||
      inst->src = src;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // set the vertex shader
 | 
			
		||||
    ID3D11DeviceContext_VSSetShader(
 | 
			
		||||
      *this->deviceContext, *this->vshader, NULL, 0);
 | 
			
		||||
 | 
			
		||||
    // run the post processor
 | 
			
		||||
    src = inst->pp->run(inst->opaque, inst->srv);
 | 
			
		||||
    ID3D11Texture2D * out = inst->pp->run(inst->opaque, inst->srv);
 | 
			
		||||
 | 
			
		||||
    // if the post processor returned a different texture then draw to run it
 | 
			
		||||
    if (out == src)
 | 
			
		||||
      continue;
 | 
			
		||||
 | 
			
		||||
    // draw the full screen quad
 | 
			
		||||
    ID3D11DeviceContext_IASetPrimitiveTopology(
 | 
			
		||||
      *this->deviceContext, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
 | 
			
		||||
    ID3D11DeviceContext_Draw(*this->deviceContext, 4, 0);
 | 
			
		||||
 | 
			
		||||
    // the output is now the input
 | 
			
		||||
    src = out;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return src;
 | 
			
		||||
 
 | 
			
		||||
@@ -94,6 +94,7 @@ struct DXGIInterface
 | 
			
		||||
  DXGI_FORMAT                dxgiSrcFormat, dxgiFormat;
 | 
			
		||||
  bool                       hdr;
 | 
			
		||||
  DXGI_COLOR_SPACE_TYPE      dxgiColorSpace;
 | 
			
		||||
  ID3D11VertexShader      ** vshader;
 | 
			
		||||
  struct DXGICopyBackend   * backend;
 | 
			
		||||
 | 
			
		||||
  CaptureGetPointerBuffer    getPointerBufferFn;
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,6 @@ typedef struct SDRWhiteLevel
 | 
			
		||||
  ID3D11Device        ** device;
 | 
			
		||||
  ID3D11DeviceContext ** context;
 | 
			
		||||
 | 
			
		||||
  ID3D11VertexShader  ** vshader;
 | 
			
		||||
  ID3D11PixelShader   ** pshader;
 | 
			
		||||
  ID3D11SamplerState  ** sampler;
 | 
			
		||||
  ID3D11Buffer        ** buffer;
 | 
			
		||||
@@ -56,49 +55,6 @@ struct ShaderConsts
 | 
			
		||||
}
 | 
			
		||||
__attribute__((aligned(16)));
 | 
			
		||||
 | 
			
		||||
static const char * vshader =
 | 
			
		||||
  "void main(\n"
 | 
			
		||||
  "  in  uint   vertexID : SV_VERTEXID,\n"
 | 
			
		||||
  "  out float4 position : SV_POSITION,\n"
 | 
			
		||||
  "  out float2 texCoord : TEXCOORD0)\n"
 | 
			
		||||
  "{\n"
 | 
			
		||||
  "  float2 positions[4] =\n"
 | 
			
		||||
  "  {\n"
 | 
			
		||||
  "    float2(-1.0,  1.0),\n"
 | 
			
		||||
  "    float2( 1.0,  1.0),\n"
 | 
			
		||||
  "    float2(-1.0, -1.0),\n"
 | 
			
		||||
  "    float2( 1.0, -1.0)\n"
 | 
			
		||||
  "  };\n"
 | 
			
		||||
  "\n"
 | 
			
		||||
  "  float2 texCoords[4] =\n"
 | 
			
		||||
  "  {\n"
 | 
			
		||||
  "    float2(0.0, 0.0),\n"
 | 
			
		||||
  "    float2(1.0, 0.0),\n"
 | 
			
		||||
  "    float2(0.0, 1.0),\n"
 | 
			
		||||
  "    float2(1.0, 1.0)\n"
 | 
			
		||||
  "  };\n"
 | 
			
		||||
  "\n"
 | 
			
		||||
  "  position = float4(positions[vertexID], 0.0, 1.0);\n"
 | 
			
		||||
  "  texCoord = texCoords[vertexID];\n"
 | 
			
		||||
  "}";
 | 
			
		||||
 | 
			
		||||
static const char * pshader =
 | 
			
		||||
  "Texture2D    gInputTexture : register(t0);\n"
 | 
			
		||||
  "SamplerState gSamplerState : register(s0);\n"
 | 
			
		||||
  "cbuffer      gConsts       : register(b0)\n"
 | 
			
		||||
  "{\n"
 | 
			
		||||
  "  float SDRWhiteLevel;"
 | 
			
		||||
  "};\n"
 | 
			
		||||
  "\n"
 | 
			
		||||
  "float4 main(\n"
 | 
			
		||||
  "  float4 position : SV_POSITION,\n"
 | 
			
		||||
  "  float2 texCoord : TEXCOORD0) : SV_TARGET"
 | 
			
		||||
  "{\n"
 | 
			
		||||
  "  float4 color = gInputTexture.Sample(gSamplerState, texCoord);\n"
 | 
			
		||||
  "  color.rgb   *= SDRWhiteLevel;\n"
 | 
			
		||||
  "  return color;\n"
 | 
			
		||||
  "}\n";
 | 
			
		||||
 | 
			
		||||
static void updateConsts(void);
 | 
			
		||||
 | 
			
		||||
static bool sdrWhiteLevel_setup(
 | 
			
		||||
@@ -132,34 +88,34 @@ static bool sdrWhiteLevel_setup(
 | 
			
		||||
    goto exit;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // compile and create the vertex shader
 | 
			
		||||
  static const char * pshaderSrc =
 | 
			
		||||
    "Texture2D    gInputTexture : register(t0);\n"
 | 
			
		||||
    "SamplerState gSamplerState : register(s0);\n"
 | 
			
		||||
    "cbuffer      gConsts       : register(b0)\n"
 | 
			
		||||
    "{\n"
 | 
			
		||||
    "  float SDRWhiteLevel;"
 | 
			
		||||
    "};\n"
 | 
			
		||||
    "\n"
 | 
			
		||||
    "float4 main(\n"
 | 
			
		||||
    "  float4 position : SV_POSITION,\n"
 | 
			
		||||
    "  float2 texCoord : TEXCOORD0) : SV_TARGET"
 | 
			
		||||
    "{\n"
 | 
			
		||||
    "  float4 color = gInputTexture.Sample(gSamplerState, texCoord);\n"
 | 
			
		||||
    "  color.rgb   *= SDRWhiteLevel;\n"
 | 
			
		||||
    "  return color;\n"
 | 
			
		||||
    "}\n";
 | 
			
		||||
 | 
			
		||||
  comRef_defineLocal(ID3DBlob, byteCode);
 | 
			
		||||
  if (!compileShader(byteCode, "main", "vs_5_0", vshader))
 | 
			
		||||
    goto exit;
 | 
			
		||||
 | 
			
		||||
  status = ID3D11Device_CreateVertexShader(
 | 
			
		||||
    *this.device,
 | 
			
		||||
    ID3D10Blob_GetBufferPointer(*byteCode),
 | 
			
		||||
    ID3D10Blob_GetBufferSize   (*byteCode),
 | 
			
		||||
    NULL,
 | 
			
		||||
    (ID3D11VertexShader **)comRef_newGlobal(&this.vshader));
 | 
			
		||||
 | 
			
		||||
  if (FAILED(status))
 | 
			
		||||
  {
 | 
			
		||||
    DEBUG_WINERROR("Failed to create the vertex shader", status);
 | 
			
		||||
    goto exit;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  comRef_release(byteCode);
 | 
			
		||||
  if (!compileShader(byteCode, "main", "ps_5_0", pshader))
 | 
			
		||||
  if (!compileShader(byteCode, "main", "ps_5_0", pshaderSrc))
 | 
			
		||||
    goto exit;
 | 
			
		||||
 | 
			
		||||
  comRef_defineLocal(ID3D11PixelShader, pshader);
 | 
			
		||||
  status = ID3D11Device_CreatePixelShader(
 | 
			
		||||
    *this.device,
 | 
			
		||||
    ID3D10Blob_GetBufferPointer(*byteCode),
 | 
			
		||||
    ID3D10Blob_GetBufferSize   (*byteCode),
 | 
			
		||||
    NULL,
 | 
			
		||||
    (ID3D11PixelShader **)comRef_newGlobal(&this.pshader));
 | 
			
		||||
    pshader);
 | 
			
		||||
 | 
			
		||||
  if (FAILED(status))
 | 
			
		||||
  {
 | 
			
		||||
@@ -167,6 +123,8 @@ static bool sdrWhiteLevel_setup(
 | 
			
		||||
    goto exit;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  comRef_toGlobal(this.pshader, pshader);
 | 
			
		||||
 | 
			
		||||
  const D3D11_SAMPLER_DESC samplerDesc =
 | 
			
		||||
  {
 | 
			
		||||
    .Filter         = D3D11_FILTER_MIN_MAG_MIP_LINEAR,
 | 
			
		||||
@@ -320,8 +278,7 @@ static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque,
 | 
			
		||||
 | 
			
		||||
  updateConsts();
 | 
			
		||||
 | 
			
		||||
  // set the vertex and pixel shader
 | 
			
		||||
  ID3D11DeviceContext_VSSetShader(*this.context, *this.vshader, NULL, 0);
 | 
			
		||||
  // set the pixel shader & resource
 | 
			
		||||
  ID3D11DeviceContext_PSSetShader(*this.context, *this.pshader, NULL, 0);
 | 
			
		||||
 | 
			
		||||
  // set the pixel shader resources
 | 
			
		||||
@@ -332,11 +289,6 @@ static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque,
 | 
			
		||||
  // set the render target
 | 
			
		||||
  ID3D11DeviceContext_OMSetRenderTargets(*this.context, 1, inst->target, NULL);
 | 
			
		||||
 | 
			
		||||
  ID3D11DeviceContext_IASetPrimitiveTopology(
 | 
			
		||||
    *this.context, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
 | 
			
		||||
 | 
			
		||||
  ID3D11DeviceContext_Draw(*this.context, 4, 0);
 | 
			
		||||
 | 
			
		||||
  return *inst->tex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user