@@ -3305,6 +3305,8 @@ struct CopyPixelParams
33053305 bool uintTex;
33063306 bool intTex;
33073307
3308+ UINT subres;
3309+
33083310 bool depthcopy; // are we copying depth or colour
33093311 bool depthbound; // if copying depth, was any depth bound (or should we write <-1,-1> marker)
33103312
@@ -3324,7 +3326,7 @@ void D3D11DebugManager::PixelHistoryCopyPixel(CopyPixelParams &p, uint32_t x, ui
33243326{
33253327 // perform a subresource copy if the real source tex couldn't be directly bound as SRV
33263328 if (p.sourceTex != p.srvTex && p.sourceTex && p.srvTex )
3327- m_pImmediateContext->CopySubresourceRegion (p.srvTex , 0 , 0 , 0 , 0 , p.sourceTex , 0 , NULL );
3329+ m_pImmediateContext->CopySubresourceRegion (p.srvTex , p. subres , 0 , 0 , 0 , p.sourceTex , p. subres , NULL );
33283330
33293331 ID3D11RenderTargetView* tmpViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT ] = {0 };
33303332 m_pImmediateContext->OMGetRenderTargets (D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT , tmpViews, NULL );
@@ -3428,7 +3430,7 @@ void D3D11DebugManager::PixelHistoryCopyPixel(CopyPixelParams &p, uint32_t x, ui
34283430 for (size_t i=0 ; i < ARRAY_COUNT (curCSUAV); i++) SAFE_RELEASE (curCSUAV[i]);
34293431}
34303432
3431- vector<PixelModification> D3D11DebugManager::PixelHistory (uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t sampleIdx)
3433+ vector<PixelModification> D3D11DebugManager::PixelHistory (uint32_t frameID, vector<EventUsage> events, ResourceId target, uint32_t x, uint32_t y, uint32_t slice, uint32_t mip, uint32_t sampleIdx)
34323434{
34333435 vector<PixelModification> history;
34343436
@@ -3636,8 +3638,8 @@ vector<PixelModification> D3D11DebugManager::PixelHistory(uint32_t frameID, vect
36363638 D3D11_TEXTURE2D_DESC depthCopyD24S8Desc = {
36373639 details.texWidth ,
36383640 details.texHeight ,
3639- 1U ,
3640- 1U ,
3641+ details. texMips ,
3642+ details. texArraySize ,
36413643 DXGI_FORMAT_R24G8_TYPELESS ,
36423644 { details.sampleCount , details.sampleQuality },
36433645 D3D11_USAGE_DEFAULT ,
@@ -3679,13 +3681,12 @@ vector<PixelModification> D3D11DebugManager::PixelHistory(uint32_t frameID, vect
36793681 }
36803682
36813683 uint32_t srcxyData[8 ] = {
3682- x, y, sampleIdx,
3684+ x, y, multisampled ? sampleIdx : mip, slice,
3685+
36833686 uint32_t (multisampled),
3684-
36853687 uint32_t (floatTex),
36863688 uint32_t (uintTex),
36873689 uint32_t (intTex),
3688- 0 ,
36893690 };
36903691
36913692 ID3D11Buffer *srcxyCBuf = MakeCBuffer (sizeof (srcxyData));
@@ -3729,6 +3730,7 @@ vector<PixelModification> D3D11DebugManager::PixelHistory(uint32_t frameID, vect
37293730 colourCopyParams.intTex = intTex;
37303731 colourCopyParams.srcxyCBuf = srcxyCBuf;
37313732 colourCopyParams.storexyCBuf = storexyCBuf;
3733+ colourCopyParams.subres = details.texArraySize * slice + mip;
37323734
37333735 CopyPixelParams depthCopyParams = colourCopyParams;
37343736
@@ -4442,6 +4444,165 @@ vector<PixelModification> D3D11DebugManager::PixelHistory(uint32_t frameID, vect
44424444
44434445 m_WrappedDevice->ReplayLog (frameID, 0 , events[i].eventID , eReplay_WithoutDraw);
44444446
4447+ {
4448+ ID3D11RenderTargetView* tmpViews[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT ] = {0 };
4449+ m_pImmediateContext->OMGetRenderTargets (D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT , tmpViews, NULL );
4450+
4451+ uint32_t UAVStartSlot = 0 ;
4452+ for (int v=0 ; v < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT ; v++)
4453+ {
4454+ if (tmpViews[v] != NULL )
4455+ {
4456+ UAVStartSlot = v+1 ;
4457+ SAFE_RELEASE (tmpViews[v]);
4458+ }
4459+ }
4460+
4461+ ID3D11RenderTargetView* curRTVs[D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT ] = {0 };
4462+ ID3D11UnorderedAccessView* curUAVs[D3D11_1_UAV_SLOT_COUNT ] = {0 };
4463+ ID3D11DepthStencilView *curDSV = NULL ;
4464+ const UINT numUAVs = m_WrappedContext->GetReal1 () ? D3D11_1_UAV_SLOT_COUNT : D3D11_PS_CS_UAV_REGISTER_COUNT ;
4465+ m_pImmediateContext->OMGetRenderTargetsAndUnorderedAccessViews (UAVStartSlot, curRTVs, &curDSV,
4466+ UAVStartSlot, numUAVs-UAVStartSlot, curUAVs);
4467+
4468+ // check that this selected mip/slice is the one being rendered to here
4469+ if (events[i].usage == eUsage_ColourTarget)
4470+ {
4471+ bool used = false ;
4472+ for (int i=0 ; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT ; i++)
4473+ {
4474+ if (curRTVs[i])
4475+ {
4476+ ID3D11Resource *res = NULL ;
4477+ curRTVs[i]->GetResource (&res);
4478+
4479+ if (res != targetres)
4480+ continue ;
4481+
4482+ SAFE_RELEASE (res);
4483+
4484+ D3D11_RENDER_TARGET_VIEW_DESC desc;
4485+ curRTVs[i]->GetDesc (&desc);
4486+ if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE1D &&
4487+ desc.Texture1D .MipSlice == mip)
4488+ {
4489+ used = true ;
4490+ break ;
4491+ }
4492+ else if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE1DARRAY &&
4493+ desc.Texture1DArray .MipSlice == mip &&
4494+ desc.Texture1DArray .FirstArraySlice <= slice &&
4495+ desc.Texture1DArray .FirstArraySlice +desc.Texture1DArray .ArraySize > slice)
4496+ {
4497+ used = true ;
4498+ break ;
4499+ }
4500+ else if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2D &&
4501+ desc.Texture2D .MipSlice == mip)
4502+ {
4503+ used = true ;
4504+ break ;
4505+ }
4506+ else if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DARRAY &&
4507+ desc.Texture2DArray .MipSlice == mip &&
4508+ desc.Texture2DArray .FirstArraySlice <= slice &&
4509+ desc.Texture2DArray .FirstArraySlice +desc.Texture2DArray .ArraySize > slice)
4510+ {
4511+ used = true ;
4512+ break ;
4513+ }
4514+ else if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DMS )
4515+ {
4516+ used = true ;
4517+ break ;
4518+ }
4519+ else if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY &&
4520+ desc.Texture2DMSArray .FirstArraySlice <= slice &&
4521+ desc.Texture2DMSArray .FirstArraySlice +desc.Texture2DMSArray .ArraySize > slice)
4522+ {
4523+ used = true ;
4524+ break ;
4525+ }
4526+ else if (desc.ViewDimension == D3D11_RTV_DIMENSION_TEXTURE3D &&
4527+ desc.Texture3D .MipSlice == mip &&
4528+ desc.Texture3D .FirstWSlice <= slice &&
4529+ desc.Texture3D .FirstWSlice +desc.Texture3D .WSize > slice)
4530+ {
4531+ used = true ;
4532+ break ;
4533+ }
4534+ }
4535+ }
4536+ if (!used) continue ;
4537+ }
4538+ else if (events[i].usage == eUsage_DepthStencilTarget)
4539+ {
4540+ if (!curDSV) continue ;
4541+
4542+ ID3D11Resource *res = NULL ;
4543+ curDSV->GetResource (&res);
4544+
4545+ if (res != targetres)
4546+ continue ;
4547+
4548+ SAFE_RELEASE (res);
4549+
4550+ D3D11_DEPTH_STENCIL_VIEW_DESC desc;
4551+ curDSV->GetDesc (&desc);
4552+
4553+ bool used = false ;
4554+
4555+ if (desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE1D &&
4556+ desc.Texture1D .MipSlice == mip)
4557+ {
4558+ used = true ;
4559+ break ;
4560+ }
4561+ else if (desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE1DARRAY &&
4562+ desc.Texture1DArray .MipSlice == mip &&
4563+ desc.Texture1DArray .FirstArraySlice <= slice &&
4564+ desc.Texture1DArray .FirstArraySlice +desc.Texture1DArray .ArraySize > slice)
4565+ {
4566+ used = true ;
4567+ break ;
4568+ }
4569+ else if (desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2D &&
4570+ desc.Texture2D .MipSlice == mip)
4571+ {
4572+ used = true ;
4573+ break ;
4574+ }
4575+ else if (desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2DARRAY &&
4576+ desc.Texture2DArray .MipSlice == mip &&
4577+ desc.Texture2DArray .FirstArraySlice <= slice &&
4578+ desc.Texture2DArray .FirstArraySlice +desc.Texture2DArray .ArraySize > slice)
4579+ {
4580+ used = true ;
4581+ break ;
4582+ }
4583+ else if (desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2DMS )
4584+ {
4585+ used = true ;
4586+ break ;
4587+ }
4588+ else if (desc.ViewDimension == D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY &&
4589+ desc.Texture2DMSArray .FirstArraySlice <= slice &&
4590+ desc.Texture2DMSArray .FirstArraySlice +desc.Texture2DMSArray .ArraySize > slice)
4591+ {
4592+ used = true ;
4593+ break ;
4594+ }
4595+
4596+ if (!used) continue ;
4597+ }
4598+
4599+ for (int i=0 ; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT ; i++)
4600+ SAFE_RELEASE (curRTVs[i]);
4601+ for (int i=0 ; i < D3D11_1_UAV_SLOT_COUNT ; i++)
4602+ SAFE_RELEASE (curUAVs[i]);
4603+ SAFE_RELEASE (curDSV);
4604+ }
4605+
44454606 curNumScissors = curNumViews = 16 ;
44464607 m_pImmediateContext->RSGetViewports (&curNumViews, curViewports);
44474608 m_pImmediateContext->RSGetScissorRects (&curNumScissors, curScissors);
0 commit comments