mirror of
				https://github.com/gnif/LookingGlass.git
				synced 2025-11-04 06:31:54 +00:00 
			
		
		
		
	[dxgi] cache the input shader resource view of the src texture
This commit is contained in:
		@@ -54,8 +54,10 @@ extern const DXGIPostProcess DXGIPP_SDRWhiteLevel;
 | 
			
		||||
 | 
			
		||||
typedef struct
 | 
			
		||||
{
 | 
			
		||||
  const DXGIPostProcess * pp;
 | 
			
		||||
  void                  * opaque;
 | 
			
		||||
  ID3D11Texture2D          * src;
 | 
			
		||||
  ID3D11ShaderResourceView * srv;
 | 
			
		||||
  const DXGIPostProcess    * pp;
 | 
			
		||||
  void                     * opaque;
 | 
			
		||||
}
 | 
			
		||||
PostProcessInstance;
 | 
			
		||||
 | 
			
		||||
@@ -1336,7 +1338,42 @@ static ID3D11Texture2D * ppRun(Texture * tex, ID3D11Texture2D * src)
 | 
			
		||||
{
 | 
			
		||||
  PostProcessInstance * inst;
 | 
			
		||||
  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;
 | 
			
		||||
}
 | 
			
		||||
@@ -1352,6 +1389,9 @@ static void ppFreeAll(void)
 | 
			
		||||
    PostProcessInstance * inst;
 | 
			
		||||
    vector_forEachRef(inst, &tex->pp)
 | 
			
		||||
    {
 | 
			
		||||
      if(inst->srv)
 | 
			
		||||
        ID3D11ShaderResourceView_Release(inst->srv);
 | 
			
		||||
 | 
			
		||||
      inst->pp->free(inst->opaque);
 | 
			
		||||
      if (i == this->maxTextures - 1)
 | 
			
		||||
        inst->pp->finish();
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ typedef struct
 | 
			
		||||
    bool    shareable);
 | 
			
		||||
 | 
			
		||||
  /* perform the processing */
 | 
			
		||||
  ID3D11Texture2D * (*run)(void * opaque, ID3D11Texture2D * src);
 | 
			
		||||
  ID3D11Texture2D * (*run)(void * opaque, ID3D11ShaderResourceView * srv);
 | 
			
		||||
 | 
			
		||||
  /* instance destruction */
 | 
			
		||||
  void (*free)(void * opaque);
 | 
			
		||||
 
 | 
			
		||||
@@ -313,40 +313,19 @@ static void updateConsts(void)
 | 
			
		||||
    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;
 | 
			
		||||
  HRESULT status;
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
  ID3D11DeviceContext_VSSetShader(*this.context, *this.vshader, NULL, 0);
 | 
			
		||||
  ID3D11DeviceContext_PSSetShader(*this.context, *this.pshader, NULL, 0);
 | 
			
		||||
 | 
			
		||||
  // 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_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);
 | 
			
		||||
 | 
			
		||||
  result = *inst->tex;
 | 
			
		||||
 | 
			
		||||
exit:
 | 
			
		||||
  comRef_scopePop();
 | 
			
		||||
  return result;
 | 
			
		||||
  return *inst->tex;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
DXGIPostProcess DXGIPP_SDRWhiteLevel =
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user