mirror of
https://github.com/doitsujin/dxvk.git
synced 2025-01-05 19:46:15 +01:00
224 lines
6.1 KiB
C++
224 lines
6.1 KiB
C++
#pragma once
|
|
|
|
#include <d3d9.h>
|
|
#include "d3d9_options.h"
|
|
|
|
#include "../dxvk/dxvk_adapter.h"
|
|
#include "../dxvk/dxvk_format.h"
|
|
|
|
#include <unordered_map>
|
|
|
|
namespace dxvk {
|
|
|
|
enum class D3D9Format : uint32_t {
|
|
Unknown = 0,
|
|
|
|
R8G8B8 = 20,
|
|
A8R8G8B8 = 21,
|
|
X8R8G8B8 = 22,
|
|
R5G6B5 = 23,
|
|
X1R5G5B5 = 24,
|
|
A1R5G5B5 = 25,
|
|
A4R4G4B4 = 26,
|
|
R3G3B2 = 27,
|
|
A8 = 28,
|
|
A8R3G3B2 = 29,
|
|
X4R4G4B4 = 30,
|
|
A2B10G10R10 = 31,
|
|
A8B8G8R8 = 32,
|
|
X8B8G8R8 = 33,
|
|
G16R16 = 34,
|
|
A2R10G10B10 = 35,
|
|
A16B16G16R16 = 36,
|
|
A8P8 = 40,
|
|
P8 = 41,
|
|
L8 = 50,
|
|
A8L8 = 51,
|
|
A4L4 = 52,
|
|
V8U8 = 60,
|
|
L6V5U5 = 61,
|
|
X8L8V8U8 = 62,
|
|
Q8W8V8U8 = 63,
|
|
V16U16 = 64,
|
|
A2W10V10U10 = 67,
|
|
UYVY = MAKEFOURCC('U', 'Y', 'V', 'Y'),
|
|
R8G8_B8G8 = MAKEFOURCC('R', 'G', 'B', 'G'),
|
|
YUY2 = MAKEFOURCC('Y', 'U', 'Y', '2'),
|
|
G8R8_G8B8 = MAKEFOURCC('G', 'R', 'G', 'B'),
|
|
DXT1 = MAKEFOURCC('D', 'X', 'T', '1'),
|
|
DXT2 = MAKEFOURCC('D', 'X', 'T', '2'),
|
|
DXT3 = MAKEFOURCC('D', 'X', 'T', '3'),
|
|
DXT4 = MAKEFOURCC('D', 'X', 'T', '4'),
|
|
DXT5 = MAKEFOURCC('D', 'X', 'T', '5'),
|
|
D16_LOCKABLE = 70,
|
|
D32 = 71,
|
|
D15S1 = 73,
|
|
D24S8 = 75,
|
|
D24X8 = 77,
|
|
D24X4S4 = 79,
|
|
D16 = 80,
|
|
D32F_LOCKABLE = 82,
|
|
D24FS8 = 83,
|
|
D32_LOCKABLE = 84,
|
|
S8_LOCKABLE = 85,
|
|
L16 = 81,
|
|
VERTEXDATA = 100,
|
|
INDEX16 = 101,
|
|
INDEX32 = 102,
|
|
Q16W16V16U16 = 110,
|
|
MULTI2_ARGB8 = MAKEFOURCC('M', 'E', 'T', '1'),
|
|
R16F = 111,
|
|
G16R16F = 112,
|
|
A16B16G16R16F = 113,
|
|
R32F = 114,
|
|
G32R32F = 115,
|
|
A32B32G32R32F = 116,
|
|
CxV8U8 = 117,
|
|
A1 = 118,
|
|
A2B10G10R10_XR_BIAS = 119,
|
|
BINARYBUFFER = 199,
|
|
|
|
// Driver Hacks / Unofficial Formats
|
|
ATI1 = MAKEFOURCC('A', 'T', 'I', '1'),
|
|
ATI2 = MAKEFOURCC('A', 'T', 'I', '2'),
|
|
INST = MAKEFOURCC('I', 'N', 'S', 'T'),
|
|
DF24 = MAKEFOURCC('D', 'F', '2', '4'),
|
|
DF16 = MAKEFOURCC('D', 'F', '1', '6'),
|
|
NULL_FORMAT = MAKEFOURCC('N', 'U', 'L', 'L'),
|
|
GET4 = MAKEFOURCC('G', 'E', 'T', '4'),
|
|
GET1 = MAKEFOURCC('G', 'E', 'T', '1'),
|
|
NVDB = MAKEFOURCC('N', 'V', 'D', 'B'),
|
|
A2M1 = MAKEFOURCC('A', '2', 'M', '1'),
|
|
A2M0 = MAKEFOURCC('A', '2', 'M', '0'),
|
|
ATOC = MAKEFOURCC('A', 'T', 'O', 'C'),
|
|
INTZ = MAKEFOURCC('I', 'N', 'T', 'Z'),
|
|
RAWZ = MAKEFOURCC('R', 'A', 'W', 'Z'),
|
|
RESZ = MAKEFOURCC('R', 'E', 'S', 'Z'),
|
|
|
|
NV11 = MAKEFOURCC('N', 'V', '1', '1'),
|
|
NV12 = MAKEFOURCC('N', 'V', '1', '2'),
|
|
P010 = MAKEFOURCC('P', '0', '1', '0'), // Same as NV12 but 10 bit
|
|
P016 = MAKEFOURCC('P', '0', '1', '6'), // Same as NV12 but 16 bit
|
|
Y210 = MAKEFOURCC('Y', '2', '1', '0'),
|
|
Y216 = MAKEFOURCC('Y', '2', '1', '6'),
|
|
Y410 = MAKEFOURCC('Y', '4', '1', '0'),
|
|
AYUV = MAKEFOURCC('A', 'Y', 'U', 'V'),
|
|
YV12 = MAKEFOURCC('Y', 'V', '1', '2'),
|
|
OPAQUE_420 = MAKEFOURCC('4', '2', '0', 'O'),
|
|
|
|
// Not supported but exist
|
|
AI44 = MAKEFOURCC('A', 'I', '4', '4'),
|
|
IA44 = MAKEFOURCC('I', 'A', '4', '4'),
|
|
R2VB = MAKEFOURCC('R', '2', 'V', 'B'),
|
|
COPM = MAKEFOURCC('C', 'O', 'P', 'M'),
|
|
SSAA = MAKEFOURCC('S', 'S', 'A', 'A'),
|
|
AL16 = MAKEFOURCC('A', 'L', '1', '6'),
|
|
R16 = MAKEFOURCC(' ', 'R', '1', '6'),
|
|
|
|
EXT1 = MAKEFOURCC('E', 'X', 'T', '1'),
|
|
FXT1 = MAKEFOURCC('F', 'X', 'T', '1'),
|
|
GXT1 = MAKEFOURCC('G', 'X', 'T', '1'),
|
|
HXT1 = MAKEFOURCC('H', 'X', 'T', '1'),
|
|
};
|
|
|
|
inline D3D9Format EnumerateFormat(D3DFORMAT format) {
|
|
return static_cast<D3D9Format>(format);
|
|
}
|
|
|
|
std::ostream& operator << (std::ostream& os, D3D9Format format);
|
|
|
|
enum D3D9ConversionFormat : uint32_t {
|
|
D3D9ConversionFormat_None = 0,
|
|
D3D9ConversionFormat_YUY2 = 1,
|
|
D3D9ConversionFormat_UYVY,
|
|
D3D9ConversionFormat_L6V5U5,
|
|
D3D9ConversionFormat_X8L8V8U8,
|
|
D3D9ConversionFormat_A2W10V10U10,
|
|
D3D9ConversionFormat_NV12,
|
|
D3D9ConversionFormat_YV12,
|
|
D3D9ConversionFormat_Count
|
|
};
|
|
|
|
struct D3D9_CONVERSION_FORMAT_INFO {
|
|
D3D9ConversionFormat FormatType = D3D9ConversionFormat_None;
|
|
uint32_t PlaneCount = 1;
|
|
VkFormat FormatColor = VK_FORMAT_UNDEFINED;
|
|
VkFormat FormatSrgb = VK_FORMAT_UNDEFINED;
|
|
};
|
|
|
|
/**
|
|
* \brief Format mapping
|
|
*
|
|
* Maps a D3D9 format to a set of Vulkan formats.
|
|
*/
|
|
struct D3D9_VK_FORMAT_MAPPING {
|
|
union {
|
|
struct {
|
|
VkFormat FormatColor; ///< Corresponding color format
|
|
VkFormat FormatSrgb; ///< Corresponding color format
|
|
};
|
|
VkFormat Formats[2];
|
|
};
|
|
VkImageAspectFlags Aspect = 0; ///< Defined aspects for the color format
|
|
VkComponentMapping Swizzle = { ///< Color component swizzle
|
|
VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
|
|
VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY };
|
|
D3D9_CONVERSION_FORMAT_INFO ConversionFormatInfo = { };
|
|
|
|
bool IsValid() const { return FormatColor != VK_FORMAT_UNDEFINED; }
|
|
};
|
|
|
|
D3D9_VK_FORMAT_MAPPING ConvertFormatUnfixed(D3D9Format Format);
|
|
|
|
/**
|
|
* \brief Format table
|
|
*
|
|
* Initializes a format table for a specific
|
|
* device and provides methods to look up
|
|
* formats.
|
|
*/
|
|
class D3D9VkFormatTable {
|
|
|
|
public:
|
|
|
|
D3D9VkFormatTable(
|
|
const Rc<DxvkAdapter>& adapter,
|
|
const D3D9Options& options);
|
|
|
|
/**
|
|
* \brief Retrieves info for a given D3D9 format
|
|
*
|
|
* \param [in] Format The D3D9 format to look up
|
|
* \param [in] Mode the format lookup mode
|
|
* \returns Format info
|
|
*/
|
|
D3D9_VK_FORMAT_MAPPING GetFormatMapping(
|
|
D3D9Format Format) const;
|
|
|
|
/**
|
|
* \brief Retrieves format info for unsupported
|
|
* formats.
|
|
*
|
|
* \param [in] Format The D3D9 format to look up
|
|
*/
|
|
const DxvkFormatInfo* GetUnsupportedFormatInfo(
|
|
D3D9Format Format) const;
|
|
|
|
private:
|
|
|
|
bool CheckImageFormatSupport(
|
|
const Rc<DxvkAdapter>& Adapter,
|
|
VkFormat Format,
|
|
VkFormatFeatureFlags Features) const;
|
|
|
|
bool m_a4r4g4b4Support;
|
|
bool m_d24s8Support;
|
|
bool m_d16s8Support;
|
|
|
|
bool m_dfSupport;
|
|
bool m_x4r4g4b4Support;
|
|
bool m_d32supportFinal;
|
|
};
|
|
|
|
}
|