Skip to content

Instantly share code, notes, and snippets.

@kei-y
Created July 10, 2019 03:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kei-y/516604110a7bcc998b82405c51812bde to your computer and use it in GitHub Desktop.
Save kei-y/516604110a7bcc998b82405c51812bde to your computer and use it in GitHub Desktop.
//
//
// $HeadURL: https://svnrepos.sandlot.jp/svn/repos/ToolAndLibraries/Libraries/LibXGL2/trunk/Library/xgl/gs/gs_DdsUtility.ps4.cpp $
// $Id: gs_DdsUtility.ps4.cpp 9677 2019-03-07 11:17:02Z prg_y_horiuchi $
//
//==============================================================================
//include
#include "stdafx.h"
#include <sgs/SGS_WARNING.h>
#include <sgs/db/db_Output.h>
#include <sgs/sgs_Warning.h>
#include "gs_Types.ps4.h"
#include "gs_DdsUtility.ps4.h"
namespace xgl
{
namespace gs
{
//=============================================================================
// ID作成
uint32_t DdsSurfaceDesc2::_CreateID(uint8_t v0, uint8_t v1, uint8_t v2, uint8_t v3) const
{
LayoutInfo::ByteID ret;
ret.elements[0] = v0, ret.elements[1] = v1, ret.elements[2] = v2, ret.elements[3] = v3;
return ret.id;
}
/// 種類
bool DdsSurfaceDesc2::IsDx10() const { return (CF_DX10 == GetFourCCFormat()); }
//=============================================================================
//fourccの種類
DdsSurfaceDesc2::FourCCFormat DdsSurfaceDesc2::GetFourCCFormat() const
{
if (ddpf_pixel_format.dw_flags & DdsPixelFormat::PIXEL_FOURCC)
{
return (DdsSurfaceDesc2::FourCCFormat)ddpf_pixel_format.dw_fourCC;
}
return CF_NONE;
}
//=============================================================================
//無圧縮フォーマットのピクセルレイアウトを取得
DdsSurfaceDesc2::LayoutInfo DdsSurfaceDesc2::_GetLayout() const
{
struct Element
{
size_t color, offset, length;
Element(uint _color)
{
color = _color;
offset = 0xFFFFFFFF;
length = 0;
}
};
Element elements[4] = {Element(C_R), Element(C_G), Element(C_B), Element(C_A)};
const uint32_t* p_color_masks[4] = {&ddpf_pixel_format.dw_r_bit_mask,
&ddpf_pixel_format.dw_g_bit_mask,
&ddpf_pixel_format.dw_b_bit_mask,
&ddpf_pixel_format.dw_rgb_alpha_bit_mask};
//=============================================================================
//各色の情報が記述されているビット位置とそのビット列の長さを色ごとに調べる
for (int i = 0; i < 4; ++i)
{
uint32_t bit_mask = 0x01; //調査ビット
size_t bit_cnt = 0;
while (bit_mask != 0)
{
if ((*(p_color_masks[i]) & bit_mask) != 0)
{
if (elements[i].offset == 0xFFFFFFFF)
elements[i].offset = bit_cnt;
++elements[i].length;
}
else if (elements[i].offset != 0xFFFFFFFF)
break;
++bit_cnt;
bit_mask <<= 1; //調査ビットをずらす
}
}
//=============================================================================
//オフセット昇順ソート
for (int i = 0; i < 4; ++i)
{
for (int j = i + 1; j < 4; ++j)
{
if (elements[j].offset < elements[i].offset)
{
//交換
Element tmp = elements[i];
elements[i] = elements[j];
elements[j] = tmp;
}
}
}
//=============================================================================
//ID作成
//dw_rgb_bit_countに記載されているサイズより
//小さい場合があり、その場合はダミーデータが存在するのでdummy_bit_sizeを使い対応させている
LayoutInfo layout;
uint32_t dummy_bit_size = ddpf_pixel_format.dw_rgb_bit_count;
for (int i = 0; i < 4; ++i)
{
if (elements[i].length != 0)
{
layout.bit.elements[i] = elements[i].length;
layout.color.elements[i] = elements[i].color;
dummy_bit_size -= elements[i].length;
}
else
{
layout.color.elements[i] = C_NONE;
layout.bit.elements[i] = dummy_bit_size;
dummy_bit_size = 0;
}
}
return layout;
}
//=============================================================================
// DDSファイルイメージ内の各情報ブロックへとアクセスするためのアドレスを取得する
bool DdsSurfaceDesc2::GetDdsAddrFromFileImage(const DdsSurfaceDesc2** pp_out_desc,
const void** pp_out_data,
const void* file_img,
size_t file_size)
{
SGS_WARNING(pp_out_desc != NULL);
SGS_WARNING(pp_out_data != NULL);
SGS_WARNING(file_img != NULL);
//=============================================================================
//先頭のファイル識別を調べる
char ext_name[] = {'D', 'D', 'S', ' '};
if (file_size < sizeof(uint32_t) || *(uint32_t*)file_img != *(uint32_t*)ext_name)
return false;
file_img = (uint32_t*)file_img + 1;
file_size -= sizeof(uint32_t);
//=============================================================================
//ヘッダ部のアドレスセット
if (file_size < sizeof(DdsSurfaceDesc2))
return false;
*pp_out_desc = (DdsSurfaceDesc2*)file_img;
file_img = (DdsSurfaceDesc2*)file_img + 1;
file_size -= sizeof(DdsSurfaceDesc2);
//=============================================================================
//データ部のアドレスセット
*pp_out_data = file_img;
return true;
}
//=============================================================================
//DDSのフォーマットからGNMのデータフォーマットを取得する
const sce::Gnm::DataFormat* DdsSurfaceDesc2::GetGnmFormat() const
{
const auto fourcc_type = GetFourCCFormat();
const sce::Gnm::DataFormat* p_out = NULL;
//==============================================================================
//特殊フォーマット
if (CF_NONE != fourcc_type)
{
// 対応しているのはDXT1~5まで
switch (fourcc_type)
{
case CF_DXT1:
p_out = &sce::Gnm::kDataFormatBc1Unorm;
break; //DXT1 , BC1 , kDataFormatBc1Unorm , kDataFormatBc1UnormSrgb
case CF_DXT2:
p_out = &sce::Gnm::kDataFormatBc2Unorm;
break; //DXT2 , BC2 , kDataFormatBc2Unorm , kDataFormatBc2UnormSrgb
case CF_DXT3:
p_out = &sce::Gnm::kDataFormatBc2Unorm;
break; //DXT3 , BC2 , kDataFormatBc2Unorm , kDataFormatBc2UnormSrgb //Bc2で問題ない
case CF_DXT4:
p_out = &sce::Gnm::kDataFormatBc3Unorm;
break; //DXT4 , BC3 , kDataFormatBc3Unorm , kDataFormatBc3UnormSrgb
case CF_DXT5:
p_out = &sce::Gnm::kDataFormatBc3Unorm;
break; //DXT5 , BC3 . kDataFormatBc3Unorm , kDataFormatBc3UnormSrgb //Bc3で問題ない
case CF_R16F:
p_out = &sce::Gnm::kDataFormatR16Float;
break;
case CF_R32F:
p_out = &sce::Gnm::kDataFormatR32Float;
break;
case CF_BC5U:
p_out = &sce::Gnm::kDataFormatBc5Unorm;
break;
case CF_BC5S:
p_out = &sce::Gnm::kDataFormatBc5Snorm;
break;
case CF_BC4U:
p_out = &sce::Gnm::kDataFormatBc4Unorm;
break;
case CF_BC4S:
p_out = &sce::Gnm::kDataFormatBc4Snorm;
break;
case CF_DX10:
{
// desc2ではdx10形式は解析しない
SGS_WARNING(false);
}
break;
default:
// 未対応で引っかかるようにしています。
SGS_WARNING(false && "未対応のフォーマット");
break;
}
}
//==============================================================================
//通常フォーマット
else
{
DdsSurfaceDesc2::LayoutInfo layout = _GetLayout();
//==============================================================================
//32bit 4色
if (layout.bit.id == _CreateID(8, 8, 8, 8))
{
if (layout.color.id == _CreateID(C_B, C_G, C_R, C_A))
p_out = &sce::Gnm::kDataFormatB8G8R8A8Unorm;
else if (layout.color.id == _CreateID(C_B, C_G, C_R, C_NONE))
p_out = &sce::Gnm::kDataFormatB8G8R8X8Unorm;
else if (layout.color.id == _CreateID(C_R, C_G, C_B, C_A))
p_out = &sce::Gnm::kDataFormatR8G8B8A8Unorm;
}
//==============================================================================
//16bit 4色
else if (layout.bit.id == _CreateID(4, 4, 4, 4))
{
if (layout.color.id == _CreateID(C_B, C_G, C_R, C_A))
p_out = &sce::Gnm::kDataFormatB4G4R4A4Unorm;
else if (layout.color.id == _CreateID(C_R, C_G, C_B, C_A))
p_out = &sce::Gnm::kDataFormatR4G4B4A4Unorm;
}
//==============================================================================
//8bit 1色
else if (layout.bit.id == _CreateID(8, 0, 0, 0))
{
if (layout.color.id == _CreateID(C_R, C_NONE, C_NONE, C_NONE))
p_out = &sce::Gnm::kDataFormatL8Unorm;
else if (layout.color.id == _CreateID(C_A, C_NONE, C_NONE, C_NONE))
p_out = &sce::Gnm::kDataFormatA8Unorm;
}
}
return p_out;
}
//=============================================================================
// 格納されているテクスチャの種類を取得
DdsSurfaceDesc2::TextureType DdsSurfaceDesc2::GetTextureType() const
{
const uint32_t CUBEMAP_FLAG = (DdsCaps2::CAPS2_CUBEMAP | DdsCaps2::CAPS2_CUBE_SURFACE_ALL);
if ((dds_caps.dw_caps2 & CUBEMAP_FLAG) == CUBEMAP_FLAG)
return TEXTURE_CUBE; //キューブマップフラグがあり6面有るならキューブテクスチャ
else if ((dds_caps.dw_caps2 & DdsCaps2::CAPS2_VOLUME) != 0)
return TEXTURE_VOLUME; //ボリュームテクスチャフラグがある
return TEXTURE_NORMAL;
}
//=============================================================================
//深度
uint32_t DdsSurfaceDesc2::GetDepth() const { return ((dw_flags & DDS_DEPTH) != 0) ? dw_depth : 1; }
//=============================================================================
//ミップマップレベル
uint32_t DdsSurfaceDesc2::GetMipMapLevel() const
{
return ((dw_flags & DDS_MIPMAP_COUNT) != 0) ? dw_mip_map_count : 1;
}
//=============================================================================
//テクスチャ数(ボリュームテクスチャは3Dの画像が一枚有ると判断しての値)
uint32_t DdsSurfaceDesc2::GetTextureNum() const
{
size_t size;
switch (GetTextureType())
{
case TEXTURE_NORMAL:
size = 1;
break;
case TEXTURE_CUBE:
size = 6;
break;
case TEXTURE_VOLUME:
size = 1;
break;
default:
size = 0;
}
SGS_WARNING(size > 0);
return size;
}
//=============================================================================
// テクスチャスライス数
uint32_t DdsSurfaceDesc2::GetTextureSliceNum() const
{
return 1; //テクスチャのスライス数はDDSでは1だけのはず
}
//=============================================================================
// デバッグ用にDDSファイルのヘッダ部を出力する
void DdsSurfaceDesc2::DebugDdsHeaderPrint()
{
PF("Print DDSHeader\n");
PF("%d,x%0.8x,%d,%d,%d,%d,%d",
dw_size,
dw_flags,
dw_height,
dw_width,
dw_pitch_or_linear_size,
dw_depth,
dw_mip_map_count);
uint32_t comp_chars[4] = {(ddpf_pixel_format.dw_fourCC & 0x000000ff),
(ddpf_pixel_format.dw_fourCC & 0x0000ff00) >> 8,
(ddpf_pixel_format.dw_fourCC & 0x00ff0000) >> 16,
(ddpf_pixel_format.dw_fourCC & 0xff000000) >> 24};
PF("pixel,%d,x%0.8x,x%0.8x,%c,%c,%c,%c,%d,x%0.8x,x%0.8x,x%0.8x,x%0.8x",
ddpf_pixel_format.dw_size,
ddpf_pixel_format.dw_flags,
ddpf_pixel_format.dw_fourCC,
(comp_chars[0] != '\0') ? comp_chars[0] : '-',
(comp_chars[1] != '\0') ? comp_chars[1] : '-',
(comp_chars[2] != '\0') ? comp_chars[2] : '-',
(comp_chars[3] != '\0') ? comp_chars[3] : '-',
ddpf_pixel_format.dw_rgb_bit_count,
ddpf_pixel_format.dw_r_bit_mask,
ddpf_pixel_format.dw_g_bit_mask,
ddpf_pixel_format.dw_b_bit_mask,
ddpf_pixel_format.dw_rgb_alpha_bit_mask);
PF("caps,x%0.8x,x%0.8x\n", dds_caps.dw_caps1, dds_caps.dw_caps2);
}
DDSImage::DDSImage()
{
m_desc = NULL;
m_dxt10 = NULL;
}
/// ファイルイメージから初期化
bool DDSImage::Initialize(const std::wstring& path, const void* fileimage, size_t size)
{
//==============================================================================
//DDSフォーマットチェック
//const DdsSurfaceDesc2* p_header = NULL;
//const uint8_t* p_src_texture_top = NULL;
bool result =
DdsSurfaceDesc2::GetDdsAddrFromFileImage(&m_desc, (const void**)&m_image_base, fileimage, size);
if (!result)
{
return false;
}
if (m_desc->IsDx10())
{
m_dxt10 = (DDS_HEADER_DXT10*)m_image_base;
m_image_base += sizeof(DDS_HEADER_DXT10);
}
return result;
}
static const sce::Gnm::DataFormat* GetFormat(dds::DXGI_FORMAT fmt);
//=============================================================================
/// DDSのフォーマットからGNMのデータフォーマットを取得する
///
/// @retval return!=NULL フォーマット定義構造体のポインタ
/// @retval return==NULL XGLのマッチ処理が未対応、または一致するフォーマットがGNM側に存在しない
const sce::Gnm::DataFormat* DDSImage::GetGnmFormat() const
{
if (m_dxt10)
{
return GetFormat(m_dxt10->dxgiFormat);
}
return m_desc->GetGnmFormat();
}
/// 格納されているテクスチャの種類を取得
DdsSurfaceDesc2::TextureType DDSImage::GetTextureType() const { return m_desc->GetTextureType(); }
/// 幅
uint32_t DDSImage::GetWidth() const { return m_desc->GetWidth(); }
/// 高さ
uint32_t DDSImage::GetHeight() const { return m_desc->GetHeight(); }
/// 深度
uint32_t DDSImage::GetDepth() const { return m_desc->GetDepth(); }
/// ミップマップレベル
uint32_t DDSImage::GetMipMapLevel() const { return m_desc->GetMipMapLevel(); }
/// テクスチャ数(ボリュームテクスチャは3Dの画像が一枚有ると判断しての値)
uint32_t DDSImage::GetTextureNum() const
{
if (m_dxt10)
{
return m_desc->GetTextureNum() * m_dxt10->arraySize;
}
return m_desc->GetTextureNum();
}
/// テクスチャ数(ボリュームテクスチャは3Dの画像が一枚有ると判断しての値)
uint32_t DDSImage::GetTextureSliceNum() const
{
if (m_dxt10)
{
return m_dxt10->arraySize;
}
return 0;
}
static const sce::Gnm::DataFormat* GetFormat(dds::DXGI_FORMAT fmt)
{
switch (fmt)
{
case dds::DXGI_FORMAT_UNKNOWN:
return NULL;
case dds::DXGI_FORMAT_R32G32B32A32_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R32G32B32A32_FLOAT:
return &sce::Gnm::kDataFormatR32G32B32A32Float;
case dds::DXGI_FORMAT_R32G32B32A32_UINT:
return &sce::Gnm::kDataFormatR32G32B32A32Uint;
case dds::DXGI_FORMAT_R32G32B32A32_SINT:
return &sce::Gnm::kDataFormatR32G32B32A32Sint;
case dds::DXGI_FORMAT_R32G32B32_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R32G32B32_FLOAT:
return &sce::Gnm::kDataFormatR32G32B32Float;
case dds::DXGI_FORMAT_R32G32B32_UINT:
return &sce::Gnm::kDataFormatR32G32B32Uint;
case dds::DXGI_FORMAT_R32G32B32_SINT:
return &sce::Gnm::kDataFormatR32G32B32Sint;
case dds::DXGI_FORMAT_R16G16B16A16_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R16G16B16A16_FLOAT:
return &sce::Gnm::kDataFormatR16G16B16A16Float;
case dds::DXGI_FORMAT_R16G16B16A16_UNORM:
return &sce::Gnm::kDataFormatR16G16B16A16Unorm;
case dds::DXGI_FORMAT_R16G16B16A16_UINT:
return &sce::Gnm::kDataFormatR16G16B16A16Uint;
case dds::DXGI_FORMAT_R16G16B16A16_SNORM:
return &sce::Gnm::kDataFormatR16G16B16A16Snorm;
case dds::DXGI_FORMAT_R16G16B16A16_SINT:
return &sce::Gnm::kDataFormatR16G16B16A16Sint;
case dds::DXGI_FORMAT_R32G32_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R32G32_FLOAT:
return &sce::Gnm::kDataFormatR32G32Float;
case dds::DXGI_FORMAT_R32G32_UINT:
return &sce::Gnm::kDataFormatR32G32Uint;
case dds::DXGI_FORMAT_R32G32_SINT:
return &sce::Gnm::kDataFormatR32G32Sint;
case dds::DXGI_FORMAT_R32G8X24_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_D32_FLOAT_S8X24_UINT:
return NULL;
case dds::DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_X32_TYPELESS_G8X24_UINT:
return NULL;
case dds::DXGI_FORMAT_R10G10B10A2_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R10G10B10A2_UNORM:
return &sce::Gnm::kDataFormatR10G10B10A2Unorm;
case dds::DXGI_FORMAT_R10G10B10A2_UINT:
return &sce::Gnm::kDataFormatR10G10B10A2Uint;
case dds::DXGI_FORMAT_R11G11B10_FLOAT:
return &sce::Gnm::kDataFormatR11G11B10Float;
case dds::DXGI_FORMAT_R8G8B8A8_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R8G8B8A8_UNORM:
return &sce::Gnm::kDataFormatR8G8B8A8Unorm;
case dds::DXGI_FORMAT_R8G8B8A8_UNORM_SRGB:
return &sce::Gnm::kDataFormatR8G8B8A8UnormSrgb;
case dds::DXGI_FORMAT_R8G8B8A8_UINT:
return &sce::Gnm::kDataFormatR8G8B8A8Uint;
case dds::DXGI_FORMAT_R8G8B8A8_SNORM:
return &sce::Gnm::kDataFormatR8G8B8A8Snorm;
case dds::DXGI_FORMAT_R8G8B8A8_SINT:
return &sce::Gnm::kDataFormatR8G8B8A8Sint;
case dds::DXGI_FORMAT_R16G16_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R16G16_FLOAT:
return &sce::Gnm::kDataFormatR16G16Float;
case dds::DXGI_FORMAT_R16G16_UNORM:
return &sce::Gnm::kDataFormatR16G16Unorm;
case dds::DXGI_FORMAT_R16G16_UINT:
return &sce::Gnm::kDataFormatR16G16Uint;
case dds::DXGI_FORMAT_R16G16_SNORM:
return &sce::Gnm::kDataFormatR16G16Snorm;
case dds::DXGI_FORMAT_R16G16_SINT:
return &sce::Gnm::kDataFormatR16G16Sint;
case dds::DXGI_FORMAT_R32_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_D32_FLOAT:
return NULL;
case dds::DXGI_FORMAT_R32_FLOAT:
return &sce::Gnm::kDataFormatR32Float;
case dds::DXGI_FORMAT_R32_UINT:
return &sce::Gnm::kDataFormatR32Uint;
case dds::DXGI_FORMAT_R32_SINT:
return &sce::Gnm::kDataFormatR32Sint;
case dds::DXGI_FORMAT_R24G8_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_D24_UNORM_S8_UINT:
return NULL;
case dds::DXGI_FORMAT_R24_UNORM_X8_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_X24_TYPELESS_G8_UINT:
return NULL;
case dds::DXGI_FORMAT_R8G8_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R8G8_UNORM:
return &sce::Gnm::kDataFormatR8G8Unorm;
case dds::DXGI_FORMAT_R8G8_UINT:
return &sce::Gnm::kDataFormatR8G8Uint;
case dds::DXGI_FORMAT_R8G8_SNORM:
return &sce::Gnm::kDataFormatR8G8Snorm;
case dds::DXGI_FORMAT_R8G8_SINT:
return &sce::Gnm::kDataFormatR8G8Sint;
case dds::DXGI_FORMAT_R16_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R16_FLOAT:
return &sce::Gnm::kDataFormatR16Float;
case dds::DXGI_FORMAT_D16_UNORM:
return NULL;
case dds::DXGI_FORMAT_R16_UNORM:
return &sce::Gnm::kDataFormatR16Unorm;
case dds::DXGI_FORMAT_R16_UINT:
return &sce::Gnm::kDataFormatR16Uint;
case dds::DXGI_FORMAT_R16_SNORM:
return &sce::Gnm::kDataFormatR16Snorm;
case dds::DXGI_FORMAT_R16_SINT:
return &sce::Gnm::kDataFormatR16Sint;
case dds::DXGI_FORMAT_R8_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_R8_UNORM:
return &sce::Gnm::kDataFormatR8Unorm;
case dds::DXGI_FORMAT_R8_UINT:
return &sce::Gnm::kDataFormatR8Uint;
case dds::DXGI_FORMAT_R8_SNORM:
return &sce::Gnm::kDataFormatR8Snorm;
case dds::DXGI_FORMAT_R8_SINT:
return &sce::Gnm::kDataFormatR8Uint;
case dds::DXGI_FORMAT_A8_UNORM:
return &sce::Gnm::kDataFormatA8Unorm;
case dds::DXGI_FORMAT_R1_UNORM:
return NULL;
case dds::DXGI_FORMAT_R9G9B9E5_SHAREDEXP:
return NULL;
case dds::DXGI_FORMAT_R8G8_B8G8_UNORM:
return NULL;
case dds::DXGI_FORMAT_G8R8_G8B8_UNORM:
return NULL;
case dds::DXGI_FORMAT_BC1_TYPELESS:
return NULL;
case dds::DXGI_FORMAT_BC1_UNORM:
return &sce::Gnm::kDataFormatBc1Unorm;
case dds::DXGI_FORMAT_BC1_UNORM_SRGB:
return &sce::Gnm::kDataFormatBc1UnormSrgb;
case dds::DXGI_FORMAT_BC2_TYPELESS:
return 0;
case dds::DXGI_FORMAT_BC2_UNORM:
return &sce::Gnm::kDataFormatBc2Unorm;
case dds::DXGI_FORMAT_BC2_UNORM_SRGB:
return &sce::Gnm::kDataFormatBc2UnormSrgb;
case dds::DXGI_FORMAT_BC3_TYPELESS:
return 0;
case dds::DXGI_FORMAT_BC3_UNORM:
return &sce::Gnm::kDataFormatBc3Unorm;
case dds::DXGI_FORMAT_BC3_UNORM_SRGB:
return &sce::Gnm::kDataFormatBc3UnormSrgb;
case dds::DXGI_FORMAT_BC4_TYPELESS:
return 0;
case dds::DXGI_FORMAT_BC4_UNORM:
return &sce::Gnm::kDataFormatBc4Unorm;
case dds::DXGI_FORMAT_BC4_SNORM:
return &sce::Gnm::kDataFormatBc4Snorm;
case dds::DXGI_FORMAT_BC5_TYPELESS:
return 0;
case dds::DXGI_FORMAT_BC5_UNORM:
return &sce::Gnm::kDataFormatBc5Unorm;
case dds::DXGI_FORMAT_BC5_SNORM:
return &sce::Gnm::kDataFormatBc5Snorm;
case dds::DXGI_FORMAT_B5G6R5_UNORM:
return &sce::Gnm::kDataFormatB5G6R5Unorm;
case dds::DXGI_FORMAT_B5G5R5A1_UNORM:
return &sce::Gnm::kDataFormatB5G5R5A1Unorm;
case dds::DXGI_FORMAT_B8G8R8A8_UNORM:
return &sce::Gnm::kDataFormatB8G8R8A8Unorm;
case dds::DXGI_FORMAT_B8G8R8X8_UNORM:
return &sce::Gnm::kDataFormatB8G8R8X8Unorm;
case dds::DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM:
return 0;
case dds::DXGI_FORMAT_B8G8R8A8_TYPELESS:
return 0;
case dds::DXGI_FORMAT_B8G8R8A8_UNORM_SRGB:
return &sce::Gnm::kDataFormatB8G8R8A8UnormSrgb;
case dds::DXGI_FORMAT_B8G8R8X8_TYPELESS:
return 0;
case dds::DXGI_FORMAT_B8G8R8X8_UNORM_SRGB:
return &sce::Gnm::kDataFormatB8G8R8X8UnormSrgb;
case dds::DXGI_FORMAT_BC6H_TYPELESS:
return 0;
case dds::DXGI_FORMAT_BC6H_UF16:
return &sce::Gnm::kDataFormatBc6Uf16;
case dds::DXGI_FORMAT_BC6H_SF16:
return &sce::Gnm::kDataFormatBc6Sf16;
case dds::DXGI_FORMAT_BC7_TYPELESS:
return 0;
case dds::DXGI_FORMAT_BC7_UNORM:
return &sce::Gnm::kDataFormatBc7Unorm;
case dds::DXGI_FORMAT_BC7_UNORM_SRGB:
return &sce::Gnm::kDataFormatBc7UnormSrgb;
case dds::DXGI_FORMAT_AYUV:
case dds::DXGI_FORMAT_Y410:
case dds::DXGI_FORMAT_Y416:
case dds::DXGI_FORMAT_NV12:
case dds::DXGI_FORMAT_P010:
case dds::DXGI_FORMAT_P016:
case dds::DXGI_FORMAT_420_OPAQUE:
case dds::DXGI_FORMAT_YUY2:
case dds::DXGI_FORMAT_Y210:
case dds::DXGI_FORMAT_Y216:
case dds::DXGI_FORMAT_NV11:
return 0;
case dds::DXGI_FORMAT_AI44:
case dds::DXGI_FORMAT_IA44:
case dds::DXGI_FORMAT_P8:
case dds::DXGI_FORMAT_A8P8:
return 0;
case dds::DXGI_FORMAT_B4G4R4A4_UNORM:
return &sce::Gnm::kDataFormatB4G4R4A4Unorm;
case dds::DXGI_FORMAT_FORCE_UINT:
break;
}
return NULL;
}
} // namespace gs
} // namespace xgl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment