1
0
mirror of https://github.com/EduApps-CDG/OpenDX synced 2024-12-30 09:45:37 +01:00

[d3d11] Use EmitCs for some Copy/Clear operations

This commit is contained in:
Philip Rebohle 2018-01-20 19:30:31 +01:00
parent 9441974497
commit 496acd71b1
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99

View File

@ -273,10 +273,20 @@ namespace dxvk {
srcSubresource.mipLevel, srcSubresource.mipLevel,
srcSubresource.arrayLayer, 1 }; srcSubresource.arrayLayer, 1 };
m_context->copyImage( EmitCs([
dstTextureInfo->image, dstLayers, dstOffset, cDstImage = dstTextureInfo->image,
srcTextureInfo->image, srcLayers, srcOffset, cSrcImage = srcTextureInfo->image,
extent); cDstLayers = dstLayers,
cSrcLayers = srcLayers,
cDstOffset = dstOffset,
cSrcOffset = srcOffset,
cExtent = extent
] (DxvkContext* ctx) {
ctx->copyImage(
cDstImage, cDstLayers, cDstOffset,
cSrcImage, cSrcLayers, cSrcOffset,
cExtent);
});
} }
} }
@ -304,12 +314,17 @@ namespace dxvk {
return; return;
} }
m_context->copyBuffer( EmitCs([
dstBuffer.buffer(), cDstBuffer = std::move(dstBuffer),
dstBuffer.offset(), cSrcBuffer = std::move(srcBuffer)
srcBuffer.buffer(), ] (DxvkContext* ctx) {
srcBuffer.offset(), ctx->copyBuffer(
srcBuffer.length()); cDstBuffer.buffer(),
cDstBuffer.offset(),
cSrcBuffer.buffer(),
cSrcBuffer.offset(),
cSrcBuffer.length());
});
} else { } else {
const D3D11TextureInfo* dstTextureInfo = GetCommonTextureInfo(pDstResource); const D3D11TextureInfo* dstTextureInfo = GetCommonTextureInfo(pDstResource);
const D3D11TextureInfo* srcTextureInfo = GetCommonTextureInfo(pSrcResource); const D3D11TextureInfo* srcTextureInfo = GetCommonTextureInfo(pSrcResource);
@ -327,11 +342,19 @@ namespace dxvk {
const VkImageSubresourceLayers srcLayers = { const VkImageSubresourceLayers srcLayers = {
dstFormatInfo->aspectMask & srcFormatInfo->aspectMask, dstFormatInfo->aspectMask & srcFormatInfo->aspectMask,
i, 0, srcTextureInfo->image->info().numLayers }; i, 0, srcTextureInfo->image->info().numLayers };
m_context->copyImage( EmitCs([
dstTextureInfo->image, dstLayers, VkOffset3D { 0, 0, 0 }, cDstImage = dstTextureInfo->image,
srcTextureInfo->image, srcLayers, VkOffset3D { 0, 0, 0 }, cSrcImage = srcTextureInfo->image,
extent); cDstLayers = dstLayers,
cSrcLayers = srcLayers,
cExtent = extent
] (DxvkContext* ctx) {
ctx->copyImage(
cDstImage, cDstLayers, VkOffset3D { 0, 0, 0 },
cDstImage, cSrcLayers, VkOffset3D { 0, 0, 0 },
cExtent);
});
} }
} }
} }
@ -344,15 +367,17 @@ namespace dxvk {
auto buf = static_cast<D3D11Buffer*>(pDstBuffer); auto buf = static_cast<D3D11Buffer*>(pDstBuffer);
auto uav = static_cast<D3D11UnorderedAccessView*>(pSrcView); auto uav = static_cast<D3D11UnorderedAccessView*>(pSrcView);
const DxvkBufferSlice dstSlice = buf->GetBufferSlice(DstAlignedByteOffset); EmitCs([
const DxvkBufferSlice srcSlice = uav->GetCounterSlice(); cDstSlice = buf->GetBufferSlice(DstAlignedByteOffset),
cSrcSlice = uav->GetCounterSlice()
m_context->copyBuffer( ] (DxvkContext* ctx) {
dstSlice.buffer(), ctx->copyBuffer(
dstSlice.offset(), cDstSlice.buffer(),
srcSlice.buffer(), cDstSlice.offset(),
srcSlice.offset(), cSrcSlice.buffer(),
sizeof(uint32_t)); cSrcSlice.offset(),
sizeof(uint32_t));
});
} }
@ -399,12 +424,22 @@ namespace dxvk {
if (m_parent->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0) if (m_parent->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0)
clearRect.layerCount = 1; clearRect.layerCount = 1;
m_context->clearRenderTarget(clearInfo, clearRect); EmitCs([
cClearInfo = clearInfo,
cClearRect = clearRect
] (DxvkContext* ctx) {
ctx->clearRenderTarget(cClearInfo, cClearRect);
});
} else { } else {
// Image is not bound to the pipeline. We can still clear // Image is not bound to the pipeline. We can still clear
// it, but we'll have to use a generic clear function. // it, but we'll have to use a generic clear function.
m_context->clearColorImage(dxvkView->image(), EmitCs([
clearValue, dxvkView->subresources()); cClearValue = clearValue,
cDstView = dxvkView
] (DxvkContext* ctx) {
ctx->clearColorImage(cDstView->image(),
cClearValue, cDstView->subresources());
});
} }
} }
@ -462,10 +497,20 @@ namespace dxvk {
if (m_parent->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0) if (m_parent->GetFeatureLevel() < D3D_FEATURE_LEVEL_10_0)
clearRect.layerCount = 1; clearRect.layerCount = 1;
m_context->clearRenderTarget(clearInfo, clearRect); EmitCs([
cClearInfo = clearInfo,
cClearRect = clearRect
] (DxvkContext* ctx) {
ctx->clearRenderTarget(cClearInfo, cClearRect);
});
} else { } else {
m_context->clearDepthStencilImage(dxvkView->image(), EmitCs([
clearValue, dxvkView->subresources()); cClearValue = clearValue,
cDstView = dxvkView
] (DxvkContext* ctx) {
ctx->clearDepthStencilImage(cDstView->image(),
cClearValue, cDstView->subresources());
});
} }
} }
@ -474,9 +519,12 @@ namespace dxvk {
auto view = static_cast<D3D11ShaderResourceView*>(pShaderResourceView); auto view = static_cast<D3D11ShaderResourceView*>(pShaderResourceView);
if (view->GetResourceType() != D3D11_RESOURCE_DIMENSION_BUFFER) { if (view->GetResourceType() != D3D11_RESOURCE_DIMENSION_BUFFER) {
m_context->generateMipmaps( EmitCs([cDstImageView = view->GetImageView()]
view->GetImageView()->image(), (DxvkContext* ctx) {
view->GetImageView()->subresources()); ctx->generateMipmaps(
cDstImageView->image(),
cDstImageView->subresources());
});
} else { } else {
Logger::err("D3D11DeviceContext: GenerateMips called on a buffer"); Logger::err("D3D11DeviceContext: GenerateMips called on a buffer");
} }
@ -1999,10 +2047,16 @@ namespace dxvk {
} }
} }
m_context->setViewports( EmitCs([
m_state.rs.numViewports, cViewportCount = m_state.rs.numViewports,
viewports.data(), cViewports = viewports,
scissors.data()); cScissors = scissors
] (DxvkContext* ctx) {
ctx->setViewports(
cViewportCount,
cViewports.data(),
cScissors.data());
});
} }