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:
parent
9441974497
commit
496acd71b1
@ -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());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user