// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
|
//
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
// you may not use this file except in compliance with the License.
|
// You may obtain a copy of the License at
|
//
|
// http://www.apache.org/licenses/LICENSE-2.0
|
//
|
// Unless required by applicable law or agreed to in writing, software
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
// See the License for the specific language governing permissions and
|
// limitations under the License.
|
|
#ifndef D3D9_Capabilities_hpp
|
#define D3D9_Capabilities_hpp
|
|
#include "Config.hpp"
|
|
#include <d3d9.h>
|
|
namespace D3D9
|
{
|
enum
|
{
|
D3DFMT_ATI1 = MAKEFOURCC('A', 'T', 'I', '1'),
|
D3DFMT_ATI2 = MAKEFOURCC('A', 'T', 'I', '2'),
|
D3DFMT_INST = MAKEFOURCC('I', 'N', 'S', 'T'),
|
D3DFMT_DF24 = MAKEFOURCC('D', 'F', '2', '4'),
|
D3DFMT_DF16 = MAKEFOURCC('D', 'F', '1', '6'),
|
D3DFMT_NULL = MAKEFOURCC('N', 'U', 'L', 'L'),
|
D3DFMT_GET4 = MAKEFOURCC('G', 'E', 'T', '4'),
|
D3DFMT_GET1 = MAKEFOURCC('G', 'E', 'T', '1'),
|
D3DFMT_NVDB = MAKEFOURCC('N', 'V', 'D', 'B'),
|
D3DFMT_A2M1 = MAKEFOURCC('A', '2', 'M', '1'),
|
D3DFMT_A2M0 = MAKEFOURCC('A', '2', 'M', '0'),
|
D3DFMT_ATOC = MAKEFOURCC('A', 'T', 'O', 'C'),
|
D3DFMT_INTZ = MAKEFOURCC('I', 'N', 'T', 'Z')
|
};
|
|
struct Capabilities
|
{
|
struct Surface
|
{
|
struct RenderTarget
|
{
|
static bool NULL_;
|
static bool R8G8B8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool A8R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2B10G10R10;
|
static bool A2R10G10B10;
|
static bool A16B16G16R16;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
};
|
|
struct DepthStencil
|
{
|
static bool D32;
|
static bool D24S8;
|
static bool D24X8;
|
static bool D16;
|
static bool D24FS8;
|
static bool D32F_LOCKABLE;
|
static bool DF24;
|
static bool DF16;
|
static bool INTZ;
|
};
|
|
static bool A8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Paletted formats
|
static bool P8;
|
static bool A8P8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2R10G10B10;
|
static bool A2B10G10R10;
|
static bool A16B16G16R16;
|
// Compressed formats
|
static bool DXT1;
|
static bool DXT2;
|
static bool DXT3;
|
static bool DXT4;
|
static bool DXT5;
|
static bool ATI1;
|
static bool ATI2;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
// Bump map formats
|
static bool V8U8;
|
static bool L6V5U5;
|
static bool X8L8V8U8;
|
static bool Q8W8V8U8;
|
static bool V16U16;
|
static bool A2W10V10U10;
|
static bool Q16W16V16U16;
|
// Luminance formats
|
static bool L8;
|
static bool A4L4;
|
static bool L16;
|
static bool A8L8;
|
// Depth Bounds Test
|
static bool NVDB;
|
// Transparency anti-aliasing
|
static bool ATOC;
|
};
|
|
struct Volume
|
{
|
static bool A8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Paletted formats
|
static bool P8;
|
static bool A8P8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2R10G10B10;
|
static bool A2B10G10R10;
|
static bool A16B16G16R16;
|
// Compressed formats
|
static bool DXT1;
|
static bool DXT2;
|
static bool DXT3;
|
static bool DXT4;
|
static bool DXT5;
|
static bool ATI1;
|
static bool ATI2;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
// Bump map formats
|
static bool V8U8;
|
static bool L6V5U5;
|
static bool X8L8V8U8;
|
static bool Q8W8V8U8;
|
static bool V16U16;
|
static bool A2W10V10U10;
|
static bool Q16W16V16U16;
|
// Luminance formats
|
static bool L8;
|
static bool A4L4;
|
static bool L16;
|
static bool A8L8;
|
};
|
|
struct CubeMap
|
{
|
struct RenderTarget
|
{
|
static bool NULL_;
|
static bool R8G8B8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool A8R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2B10G10R10;
|
static bool A2R10G10B10;
|
static bool A16B16G16R16;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
};
|
|
struct DepthStencil
|
{
|
static bool D32;
|
static bool D24S8;
|
static bool D24X8;
|
static bool D16;
|
static bool D24FS8;
|
static bool D32F_LOCKABLE;
|
static bool DF24;
|
static bool DF16;
|
static bool INTZ;
|
};
|
|
static bool A8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Paletted formats
|
static bool P8;
|
static bool A8P8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2R10G10B10;
|
static bool A2B10G10R10;
|
static bool A16B16G16R16;
|
// Compressed formats
|
static bool DXT1;
|
static bool DXT2;
|
static bool DXT3;
|
static bool DXT4;
|
static bool DXT5;
|
static bool ATI1;
|
static bool ATI2;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
// Bump map formats
|
static bool V8U8;
|
static bool L6V5U5;
|
static bool X8L8V8U8;
|
static bool Q8W8V8U8;
|
static bool V16U16;
|
static bool A2W10V10U10;
|
static bool Q16W16V16U16;
|
// Luminance formats
|
static bool L8;
|
static bool A4L4;
|
static bool L16;
|
static bool A8L8;
|
};
|
|
struct VolumeTexture
|
{
|
static bool A8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Paletted formats
|
static bool P8;
|
static bool A8P8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2R10G10B10;
|
static bool A2B10G10R10;
|
static bool A16B16G16R16;
|
// Compressed formats
|
static bool DXT1;
|
static bool DXT2;
|
static bool DXT3;
|
static bool DXT4;
|
static bool DXT5;
|
static bool ATI1;
|
static bool ATI2;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
// Bump map formats
|
static bool V8U8;
|
static bool L6V5U5;
|
static bool X8L8V8U8;
|
static bool Q8W8V8U8;
|
static bool V16U16;
|
static bool A2W10V10U10;
|
static bool Q16W16V16U16;
|
// Luminance formats
|
static bool L8;
|
static bool A4L4;
|
static bool L16;
|
static bool A8L8;
|
};
|
|
struct Texture
|
{
|
struct RenderTarget
|
{
|
static bool NULL_;
|
static bool R8G8B8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool A8R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2B10G10R10;
|
static bool A2R10G10B10;
|
static bool A16B16G16R16;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
};
|
|
struct DepthStencil
|
{
|
static bool D32;
|
static bool D24S8;
|
static bool D24X8;
|
static bool D16;
|
static bool D24FS8;
|
static bool D32F_LOCKABLE;
|
static bool DF24;
|
static bool DF16;
|
static bool INTZ;
|
};
|
|
static bool NULL_;
|
static bool A8;
|
static bool R5G6B5;
|
static bool X1R5G5B5;
|
static bool A1R5G5B5;
|
static bool A4R4G4B4;
|
static bool R3G3B2;
|
static bool A8R3G3B2;
|
static bool X4R4G4B4;
|
static bool R8G8B8;
|
static bool X8R8G8B8;
|
static bool A8R8G8B8;
|
static bool A8B8G8R8;
|
static bool X8B8G8R8;
|
// Paletted formats
|
static bool P8;
|
static bool A8P8;
|
// Integer HDR formats
|
static bool G16R16;
|
static bool A2R10G10B10;
|
static bool A2B10G10R10;
|
static bool A16B16G16R16;
|
// Compressed formats
|
static bool DXT1;
|
static bool DXT2;
|
static bool DXT3;
|
static bool DXT4;
|
static bool DXT5;
|
static bool ATI1;
|
static bool ATI2;
|
// Floating-point formats
|
static bool R16F;
|
static bool G16R16F;
|
static bool A16B16G16R16F;
|
static bool R32F;
|
static bool G32R32F;
|
static bool A32B32G32R32F;
|
// Bump map formats
|
static bool V8U8;
|
static bool L6V5U5;
|
static bool X8L8V8U8;
|
static bool Q8W8V8U8;
|
static bool V16U16;
|
static bool A2W10V10U10;
|
static bool Q16W16V16U16;
|
// Luminance formats
|
static bool L8;
|
static bool A4L4;
|
static bool L16;
|
static bool A8L8;
|
// Depth formats
|
static bool D32;
|
static bool D24S8;
|
static bool D24X8;
|
static bool D16;
|
static bool D24FS8;
|
static bool D32F_LOCKABLE;
|
static bool DF24;
|
static bool DF16;
|
static bool INTZ;
|
};
|
|
static bool isSRGBreadable(D3DFORMAT format);
|
static bool isSRGBwritable(D3DFORMAT format);
|
};
|
|
extern unsigned int pixelShaderVersionX;
|
extern unsigned int vertexShaderVersionX;
|
|
extern unsigned long pixelShaderArbitrarySwizzle;
|
extern unsigned long pixelShaderGradientInstructions;
|
extern unsigned long pixelShaderPredication;
|
extern unsigned long pixelShaderNoDependentReadLimit;
|
extern unsigned long pixelShaderNoTexInstructionLimit;
|
|
extern unsigned long pixelShaderDynamicFlowControlDepth;
|
extern unsigned long pixelShaderStaticFlowControlDepth;
|
|
extern unsigned long vertexShaderPredication;
|
extern unsigned long vertexShaderDynamicFlowControlDepth;
|
|
extern unsigned int textureMemory;
|
extern unsigned int maxAnisotropy;
|
|
enum
|
{
|
MAX_VERTEX_SHADER_CONST = 256,
|
MAX_PIXEL_SHADER_CONST = 224,
|
MAX_VERTEX_INPUTS = 16,
|
MAX_VERTEX_OUTPUTS = 12,
|
MAX_PIXEL_INPUTS = 10,
|
};
|
|
// Shader Model 3.0 requirements
|
static_assert(MAX_VERTEX_SHADER_CONST >= 256, "");
|
static_assert(MAX_PIXEL_SHADER_CONST == 224, "");
|
static_assert(MAX_VERTEX_INPUTS == 16, "");
|
static_assert(MAX_VERTEX_OUTPUTS == 12, "");
|
static_assert(MAX_PIXEL_INPUTS == 10, "");
|
|
// Back-end minimum requirements
|
static_assert(sw::VERTEX_UNIFORM_VECTORS >= MAX_VERTEX_SHADER_CONST, "");
|
static_assert(sw::FRAGMENT_UNIFORM_VECTORS >= MAX_PIXEL_SHADER_CONST, "");
|
static_assert(sw::MAX_VERTEX_INPUTS >= MAX_VERTEX_INPUTS, "");
|
static_assert(sw::MAX_VERTEX_OUTPUTS >= MAX_VERTEX_OUTPUTS, "");
|
static_assert(sw::MAX_FRAGMENT_INPUTS >= MAX_PIXEL_INPUTS, "");
|
}
|
|
#endif // D3D9_Capabilities_hpp
|