mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-22 05:27:20 +00:00
[dxgi] cache the input shader resource view of the src texture
This commit is contained in:
parent
52410beea7
commit
1e30539fb2
@ -54,8 +54,10 @@ extern const DXGIPostProcess DXGIPP_SDRWhiteLevel;
|
|||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const DXGIPostProcess * pp;
|
ID3D11Texture2D * src;
|
||||||
void * opaque;
|
ID3D11ShaderResourceView * srv;
|
||||||
|
const DXGIPostProcess * pp;
|
||||||
|
void * opaque;
|
||||||
}
|
}
|
||||||
PostProcessInstance;
|
PostProcessInstance;
|
||||||
|
|
||||||
@ -1336,7 +1338,42 @@ static ID3D11Texture2D * ppRun(Texture * tex, ID3D11Texture2D * src)
|
|||||||
{
|
{
|
||||||
PostProcessInstance * inst;
|
PostProcessInstance * inst;
|
||||||
vector_forEachRef(inst, &tex->pp)
|
vector_forEachRef(inst, &tex->pp)
|
||||||
src = inst->pp->run(inst->opaque, src);
|
{
|
||||||
|
// if the srv exists and the src has changed, release it
|
||||||
|
if (inst->src != src && inst->srv)
|
||||||
|
{
|
||||||
|
ID3D11ShaderResourceView_Release(inst->srv);
|
||||||
|
inst->srv = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the srv is not set, create one
|
||||||
|
if (!inst->srv)
|
||||||
|
{
|
||||||
|
D3D11_TEXTURE2D_DESC desc;
|
||||||
|
ID3D11Texture2D_GetDesc(src, &desc);
|
||||||
|
|
||||||
|
const D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc =
|
||||||
|
{
|
||||||
|
.Format = desc.Format,
|
||||||
|
.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D,
|
||||||
|
.Texture2D.MipLevels = 1
|
||||||
|
};
|
||||||
|
|
||||||
|
HRESULT status = ID3D11Device_CreateShaderResourceView(
|
||||||
|
*this->device, (ID3D11Resource *)src, &srvDesc, &inst->srv);
|
||||||
|
|
||||||
|
if (FAILED(status))
|
||||||
|
{
|
||||||
|
DEBUG_WINERROR("Failed to create the source resource view", status);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
inst->src = src;
|
||||||
|
}
|
||||||
|
|
||||||
|
// run the post processor
|
||||||
|
src = inst->pp->run(inst->opaque, inst->srv);
|
||||||
|
}
|
||||||
|
|
||||||
return src;
|
return src;
|
||||||
}
|
}
|
||||||
@ -1352,6 +1389,9 @@ static void ppFreeAll(void)
|
|||||||
PostProcessInstance * inst;
|
PostProcessInstance * inst;
|
||||||
vector_forEachRef(inst, &tex->pp)
|
vector_forEachRef(inst, &tex->pp)
|
||||||
{
|
{
|
||||||
|
if(inst->srv)
|
||||||
|
ID3D11ShaderResourceView_Release(inst->srv);
|
||||||
|
|
||||||
inst->pp->free(inst->opaque);
|
inst->pp->free(inst->opaque);
|
||||||
if (i == this->maxTextures - 1)
|
if (i == this->maxTextures - 1)
|
||||||
inst->pp->finish();
|
inst->pp->finish();
|
||||||
|
@ -43,7 +43,7 @@ typedef struct
|
|||||||
bool shareable);
|
bool shareable);
|
||||||
|
|
||||||
/* perform the processing */
|
/* perform the processing */
|
||||||
ID3D11Texture2D * (*run)(void * opaque, ID3D11Texture2D * src);
|
ID3D11Texture2D * (*run)(void * opaque, ID3D11ShaderResourceView * srv);
|
||||||
|
|
||||||
/* instance destruction */
|
/* instance destruction */
|
||||||
void (*free)(void * opaque);
|
void (*free)(void * opaque);
|
||||||
|
@ -313,40 +313,19 @@ static void updateConsts(void)
|
|||||||
0, NULL, &consts, 0, 0);
|
0, NULL, &consts, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque, ID3D11Texture2D * src)
|
static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque,
|
||||||
|
ID3D11ShaderResourceView * srv)
|
||||||
{
|
{
|
||||||
comRef_scopePush();
|
|
||||||
ID3D11Texture2D * result = NULL;
|
|
||||||
SDRWhiteLevelInst * inst = (SDRWhiteLevelInst *)opaque;
|
SDRWhiteLevelInst * inst = (SDRWhiteLevelInst *)opaque;
|
||||||
HRESULT status;
|
|
||||||
|
|
||||||
updateConsts();
|
updateConsts();
|
||||||
|
|
||||||
// setup the pixel shader input resource view
|
|
||||||
comRef_defineLocal(ID3D11ShaderResourceView, inputSRV);
|
|
||||||
D3D11_TEXTURE2D_DESC desc;
|
|
||||||
ID3D11Texture2D_GetDesc(src, &desc);
|
|
||||||
|
|
||||||
const D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc =
|
|
||||||
{
|
|
||||||
.Format = desc.Format,
|
|
||||||
.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D,
|
|
||||||
.Texture2D.MipLevels = 1
|
|
||||||
};
|
|
||||||
status = ID3D11Device_CreateShaderResourceView(
|
|
||||||
*this.device, (ID3D11Resource *)src, &srvDesc, inputSRV);
|
|
||||||
if (FAILED(status))
|
|
||||||
{
|
|
||||||
DEBUG_WINERROR("Failed to create the source resource view", status);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the vertex and pixel shader
|
// set the vertex and pixel shader
|
||||||
ID3D11DeviceContext_VSSetShader(*this.context, *this.vshader, NULL, 0);
|
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
|
||||||
ID3D11DeviceContext_PSSetShaderResources(*this.context, 0, 1, inputSRV );
|
ID3D11DeviceContext_PSSetShaderResources(*this.context, 0, 1, &srv );
|
||||||
ID3D11DeviceContext_PSSetSamplers (*this.context, 0, 1, this.sampler);
|
ID3D11DeviceContext_PSSetSamplers (*this.context, 0, 1, this.sampler);
|
||||||
ID3D11DeviceContext_PSSetConstantBuffers(*this.context, 0, 1, this.buffer );
|
ID3D11DeviceContext_PSSetConstantBuffers(*this.context, 0, 1, this.buffer );
|
||||||
|
|
||||||
@ -358,11 +337,7 @@ static ID3D11Texture2D * sdrWhiteLevel_run(void * opaque, ID3D11Texture2D * src)
|
|||||||
|
|
||||||
ID3D11DeviceContext_Draw(*this.context, 4, 0);
|
ID3D11DeviceContext_Draw(*this.context, 4, 0);
|
||||||
|
|
||||||
result = *inst->tex;
|
return *inst->tex;
|
||||||
|
|
||||||
exit:
|
|
||||||
comRef_scopePop();
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DXGIPostProcess DXGIPP_SDRWhiteLevel =
|
DXGIPostProcess DXGIPP_SDRWhiteLevel =
|
||||||
|
Loading…
Reference in New Issue
Block a user