mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-25 14:57:20 +00:00
[host] windows: the vertex shader is common to all post-processors
This commit is contained in:
parent
f6b2cec841
commit
b3879ff1d7
@ -271,6 +271,57 @@ static bool dxgi_create(CaptureGetPointerBuffer getPointerBufferFn, CapturePostP
|
|||||||
return true;
|
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)
|
static bool dxgi_init(void)
|
||||||
{
|
{
|
||||||
DEBUG_ASSERT(this);
|
DEBUG_ASSERT(this);
|
||||||
@ -758,6 +809,9 @@ static bool dxgi_init(void)
|
|||||||
vector_create(&this->texture[i].pp, sizeof(PostProcessInstance), 0);
|
vector_create(&this->texture[i].pp, sizeof(PostProcessInstance), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!initVertexShader())
|
||||||
|
goto fail;
|
||||||
|
|
||||||
const D3D11_VIEWPORT vp =
|
const D3D11_VIEWPORT vp =
|
||||||
{
|
{
|
||||||
.TopLeftX = 0.0f,
|
.TopLeftX = 0.0f,
|
||||||
@ -1371,8 +1425,24 @@ static ID3D11Texture2D * ppRun(Texture * tex, ID3D11Texture2D * src)
|
|||||||
inst->src = src;
|
inst->src = src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// set the vertex shader
|
||||||
|
ID3D11DeviceContext_VSSetShader(
|
||||||
|
*this->deviceContext, *this->vshader, NULL, 0);
|
||||||
|
|
||||||
// run the post processor
|
// 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;
|
return src;
|
||||||
|
@ -94,6 +94,7 @@ struct DXGIInterface
|
|||||||
DXGI_FORMAT dxgiSrcFormat, dxgiFormat;
|
DXGI_FORMAT dxgiSrcFormat, dxgiFormat;
|
||||||
bool hdr;
|
bool hdr;
|
||||||
DXGI_COLOR_SPACE_TYPE dxgiColorSpace;
|
DXGI_COLOR_SPACE_TYPE dxgiColorSpace;
|
||||||
|
ID3D11VertexShader ** vshader;
|
||||||
struct DXGICopyBackend * backend;
|
struct DXGICopyBackend * backend;
|
||||||
|
|
||||||
CaptureGetPointerBuffer getPointerBufferFn;
|
CaptureGetPointerBuffer getPointerBufferFn;
|
||||||
|
@ -32,7 +32,6 @@ typedef struct SDRWhiteLevel
|
|||||||
ID3D11Device ** device;
|
ID3D11Device ** device;
|
||||||
ID3D11DeviceContext ** context;
|
ID3D11DeviceContext ** context;
|
||||||
|
|
||||||
ID3D11VertexShader ** vshader;
|
|
||||||
ID3D11PixelShader ** pshader;
|
ID3D11PixelShader ** pshader;
|
||||||
ID3D11SamplerState ** sampler;
|
ID3D11SamplerState ** sampler;
|
||||||
ID3D11Buffer ** buffer;
|
ID3D11Buffer ** buffer;
|
||||||
@ -56,49 +55,6 @@ struct ShaderConsts
|
|||||||
}
|
}
|
||||||
__attribute__((aligned(16)));
|
__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 void updateConsts(void);
|
||||||
|
|
||||||
static bool sdrWhiteLevel_setup(
|
static bool sdrWhiteLevel_setup(
|
||||||
@ -132,34 +88,34 @@ static bool sdrWhiteLevel_setup(
|
|||||||
goto exit;
|
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);
|
comRef_defineLocal(ID3DBlob, byteCode);
|
||||||
if (!compileShader(byteCode, "main", "vs_5_0", vshader))
|
if (!compileShader(byteCode, "main", "ps_5_0", pshaderSrc))
|
||||||
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))
|
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
comRef_defineLocal(ID3D11PixelShader, pshader);
|
||||||
status = ID3D11Device_CreatePixelShader(
|
status = ID3D11Device_CreatePixelShader(
|
||||||
*this.device,
|
*this.device,
|
||||||
ID3D10Blob_GetBufferPointer(*byteCode),
|
ID3D10Blob_GetBufferPointer(*byteCode),
|
||||||
ID3D10Blob_GetBufferSize (*byteCode),
|
ID3D10Blob_GetBufferSize (*byteCode),
|
||||||
NULL,
|
NULL,
|
||||||
(ID3D11PixelShader **)comRef_newGlobal(&this.pshader));
|
pshader);
|
||||||
|
|
||||||
if (FAILED(status))
|
if (FAILED(status))
|
||||||
{
|
{
|
||||||
@ -167,6 +123,8 @@ static bool sdrWhiteLevel_setup(
|
|||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
comRef_toGlobal(this.pshader, pshader);
|
||||||
|
|
||||||
const D3D11_SAMPLER_DESC samplerDesc =
|
const D3D11_SAMPLER_DESC samplerDesc =
|
||||||
{
|
{
|
||||||
.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR,
|
.Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR,
|
||||||
@ -320,8 +278,7 @@ static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque,
|
|||||||
|
|
||||||
updateConsts();
|
updateConsts();
|
||||||
|
|
||||||
// set the vertex and pixel shader
|
// set the pixel shader & resource
|
||||||
ID3D11DeviceContext_VSSetShader(*this.context, *this.vshader, NULL, 0);
|
|
||||||
ID3D11DeviceContext_PSSetShader(*this.context, *this.pshader, NULL, 0);
|
ID3D11DeviceContext_PSSetShader(*this.context, *this.pshader, NULL, 0);
|
||||||
|
|
||||||
// set the pixel shader resources
|
// set the pixel shader resources
|
||||||
@ -332,11 +289,6 @@ static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque,
|
|||||||
// set the render target
|
// set the render target
|
||||||
ID3D11DeviceContext_OMSetRenderTargets(*this.context, 1, inst->target, NULL);
|
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;
|
return *inst->tex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user