mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-01 16:24:12 +01:00
[d3d9] Consolidate format helper code
This commit is contained in:
parent
1b26fabc6e
commit
27d7af65a1
@ -27,11 +27,13 @@ namespace dxvk {
|
|||||||
const Rc<DxvkBuffer>& srcBuffer) {
|
const Rc<DxvkBuffer>& srcBuffer) {
|
||||||
switch (conversionFormat.FormatType) {
|
switch (conversionFormat.FormatType) {
|
||||||
case D3D9ConversionFormat_YUY2:
|
case D3D9ConversionFormat_YUY2:
|
||||||
case D3D9ConversionFormat_UYVY:
|
case D3D9ConversionFormat_UYVY: {
|
||||||
ConvertVideoFormat(conversionFormat, dstImage, dstSubresource, srcBuffer);
|
uint32_t specConstant = conversionFormat.FormatType == D3D9ConversionFormat_UYVY ? 1 : 0;
|
||||||
|
ConvertGenericFormat(conversionFormat, dstImage, dstSubresource, srcBuffer, VK_FORMAT_R32_UINT, specConstant);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case D3D9ConversionFormat_L6V5U5:
|
case D3D9ConversionFormat_L6V5U5:
|
||||||
ConvertGenericFormat(conversionFormat, dstImage, dstSubresource, srcBuffer, VK_FORMAT_R16_UINT);
|
ConvertGenericFormat(conversionFormat, dstImage, dstSubresource, srcBuffer, VK_FORMAT_R16_UINT, 0);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Logger::warn("Unimplemented format conversion");
|
Logger::warn("Unimplemented format conversion");
|
||||||
@ -44,44 +46,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
VkImageSubresourceLayers dstSubresource,
|
VkImageSubresourceLayers dstSubresource,
|
||||||
const Rc<DxvkBuffer>& srcBuffer,
|
const Rc<DxvkBuffer>& srcBuffer,
|
||||||
VkFormat bufferFormat) {
|
VkFormat bufferFormat,
|
||||||
DxvkImageViewCreateInfo imageViewInfo;
|
uint32_t specConstantValue) {
|
||||||
imageViewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
|
||||||
imageViewInfo.format = dstImage->info().format;
|
|
||||||
imageViewInfo.usage = VK_IMAGE_USAGE_STORAGE_BIT;
|
|
||||||
imageViewInfo.aspect = dstSubresource.aspectMask;
|
|
||||||
imageViewInfo.minLevel = dstSubresource.mipLevel;
|
|
||||||
imageViewInfo.numLevels = 1;
|
|
||||||
imageViewInfo.minLayer = dstSubresource.baseArrayLayer;
|
|
||||||
imageViewInfo.numLayers = dstSubresource.layerCount;
|
|
||||||
auto tmpImageView = m_device->createImageView(dstImage, imageViewInfo);
|
|
||||||
|
|
||||||
VkExtent3D imageExtent = dstImage->mipLevelExtent(dstSubresource.mipLevel);
|
|
||||||
|
|
||||||
DxvkBufferViewCreateInfo bufferViewInfo;
|
|
||||||
bufferViewInfo.format = bufferFormat;
|
|
||||||
bufferViewInfo.rangeOffset = 0;
|
|
||||||
bufferViewInfo.rangeLength = srcBuffer->info().size;
|
|
||||||
auto tmpBufferView = m_device->createBufferView(srcBuffer, bufferViewInfo);
|
|
||||||
|
|
||||||
m_context->bindResourceView(BindingIds::Image, tmpImageView, nullptr);
|
|
||||||
m_context->bindResourceView(BindingIds::Buffer, nullptr, tmpBufferView);
|
|
||||||
m_context->bindShader(VK_SHADER_STAGE_COMPUTE_BIT, m_shaders[videoFormat.FormatType]);
|
|
||||||
m_context->pushConstants(0, sizeof(VkExtent2D), &imageExtent);
|
|
||||||
m_context->dispatch(
|
|
||||||
(imageExtent.width / 8) + (imageExtent.width % 8),
|
|
||||||
(imageExtent.height / 8) + (imageExtent.height % 8),
|
|
||||||
1);
|
|
||||||
|
|
||||||
m_transferCommands += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void D3D9FormatHelper::ConvertVideoFormat(
|
|
||||||
D3D9_CONVERSION_FORMAT_INFO videoFormat,
|
|
||||||
const Rc<DxvkImage>& dstImage,
|
|
||||||
VkImageSubresourceLayers dstSubresource,
|
|
||||||
const Rc<DxvkBuffer>& srcBuffer) {
|
|
||||||
DxvkImageViewCreateInfo imageViewInfo;
|
DxvkImageViewCreateInfo imageViewInfo;
|
||||||
imageViewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
imageViewInfo.type = VK_IMAGE_VIEW_TYPE_2D;
|
||||||
imageViewInfo.format = dstImage->info().format;
|
imageViewInfo.format = dstImage->info().format;
|
||||||
@ -99,12 +65,13 @@ namespace dxvk {
|
|||||||
1 };
|
1 };
|
||||||
|
|
||||||
DxvkBufferViewCreateInfo bufferViewInfo;
|
DxvkBufferViewCreateInfo bufferViewInfo;
|
||||||
bufferViewInfo.format = VK_FORMAT_R32_UINT;
|
bufferViewInfo.format = bufferFormat;
|
||||||
bufferViewInfo.rangeOffset = 0;
|
bufferViewInfo.rangeOffset = 0;
|
||||||
bufferViewInfo.rangeLength = srcBuffer->info().size;
|
bufferViewInfo.rangeLength = srcBuffer->info().size;
|
||||||
auto tmpBufferView = m_device->createBufferView(srcBuffer, bufferViewInfo);
|
auto tmpBufferView = m_device->createBufferView(srcBuffer, bufferViewInfo);
|
||||||
|
|
||||||
m_context->setSpecConstant(VK_PIPELINE_BIND_POINT_COMPUTE, 0, videoFormat.FormatType == D3D9ConversionFormat_UYVY);
|
if (specConstantValue)
|
||||||
|
m_context->setSpecConstant(VK_PIPELINE_BIND_POINT_COMPUTE, 0, specConstantValue);
|
||||||
|
|
||||||
m_context->bindResourceView(BindingIds::Image, tmpImageView, nullptr);
|
m_context->bindResourceView(BindingIds::Image, tmpImageView, nullptr);
|
||||||
m_context->bindResourceView(BindingIds::Buffer, nullptr, tmpBufferView);
|
m_context->bindResourceView(BindingIds::Buffer, nullptr, tmpBufferView);
|
||||||
@ -116,7 +83,8 @@ namespace dxvk {
|
|||||||
1);
|
1);
|
||||||
|
|
||||||
// Reset the spec constants used...
|
// Reset the spec constants used...
|
||||||
m_context->setSpecConstant(VK_PIPELINE_BIND_POINT_COMPUTE, 0, 0);
|
if (specConstantValue)
|
||||||
|
m_context->setSpecConstant(VK_PIPELINE_BIND_POINT_COMPUTE, 0, 0);
|
||||||
|
|
||||||
m_transferCommands += 1;
|
m_transferCommands += 1;
|
||||||
}
|
}
|
||||||
|
@ -28,13 +28,8 @@ namespace dxvk {
|
|||||||
const Rc<DxvkImage>& dstImage,
|
const Rc<DxvkImage>& dstImage,
|
||||||
VkImageSubresourceLayers dstSubresource,
|
VkImageSubresourceLayers dstSubresource,
|
||||||
const Rc<DxvkBuffer>& srcBuffer,
|
const Rc<DxvkBuffer>& srcBuffer,
|
||||||
VkFormat bufferFormat);
|
VkFormat bufferFormat,
|
||||||
|
uint32_t specConstantValue);
|
||||||
void ConvertVideoFormat(
|
|
||||||
D3D9_CONVERSION_FORMAT_INFO videoFormat,
|
|
||||||
const Rc<DxvkImage>& dstImage,
|
|
||||||
VkImageSubresourceLayers dstSubresource,
|
|
||||||
const Rc<DxvkBuffer>& srcBuffer);
|
|
||||||
|
|
||||||
enum BindingIds : uint32_t {
|
enum BindingIds : uint32_t {
|
||||||
Image = 0,
|
Image = 0,
|
||||||
|
Loading…
Reference in New Issue
Block a user