Skip to content

Instantly share code, notes, and snippets.

@vinjn
Created October 17, 2012 03:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vinjn/3903507 to your computer and use it in GitHub Desktop.
Save vinjn/3903507 to your computer and use it in GitHub Desktop.
Convert DX9_VERTEX_ELEMENT to DX10/DX11_INPUT_ELEMENT
LPCSTR ConvertSemantic( const D3DDECLUSAGE& d3d9Form )
{
switch( d3d9Form )
{
case D3DDECLUSAGE_POSITION: return "POSITION";
case D3DDECLUSAGE_BLENDWEIGHT: return "BLENDWEIGHT";
case D3DDECLUSAGE_BLENDINDICES: return "BLENDINDICES";
case D3DDECLUSAGE_NORMAL: return "NORMAL";
case D3DDECLUSAGE_PSIZE: return "PSIZE";
case D3DDECLUSAGE_TEXCOORD: return "TEXCOORD";
case D3DDECLUSAGE_TANGENT: return "TANGENT";
case D3DDECLUSAGE_BINORMAL: return "BINORMAL";
case D3DDECLUSAGE_TESSFACTOR: return "TESSFACTOR";
case D3DDECLUSAGE_POSITIONT: return "POSITIONT";
case D3DDECLUSAGE_COLOR: return "COLOR";
case D3DDECLUSAGE_FOG: return "FOG";
case D3DDECLUSAGE_DEPTH: return "DEPTH";
case D3DDECLUSAGE_SAMPLE: return "SAMPLE";
default: return "UNKNOWN";
}
}
DXGI_FORMAT ConvertType( const D3DDECLTYPE& d3d9Form )
{
switch( d3d9Form )
{
case D3DDECLTYPE_FLOAT1: return DXGI_FORMAT_R32_FLOAT;
case D3DDECLTYPE_FLOAT2: return DXGI_FORMAT_R32G32_FLOAT;
case D3DDECLTYPE_FLOAT3: return DXGI_FORMAT_R32G32B32_FLOAT;
case D3DDECLTYPE_FLOAT4: return DXGI_FORMAT_R32G32B32A32_FLOAT;
case D3DDECLTYPE_D3DCOLOR: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DDECLTYPE_UBYTE4: return DXGI_FORMAT_R8G8B8A8_UINT;
case D3DDECLTYPE_SHORT2: return DXGI_FORMAT_R16G16_SINT;
case D3DDECLTYPE_SHORT4: return DXGI_FORMAT_R16G16B16A16_SINT;
case D3DDECLTYPE_UBYTE4N: return DXGI_FORMAT_R8G8B8A8_UNORM;
case D3DDECLTYPE_SHORT2N: return DXGI_FORMAT_R16G16_SNORM;
case D3DDECLTYPE_SHORT4N: return DXGI_FORMAT_R16G16B16A16_SNORM;
case D3DDECLTYPE_USHORT2N: return DXGI_FORMAT_R16G16_UNORM;
case D3DDECLTYPE_USHORT4N: return DXGI_FORMAT_R16G16B16A16_UNORM;
case D3DDECLTYPE_UDEC3: return DXGI_FORMAT_R10G10B10A2_UINT;
case D3DDECLTYPE_DEC3N: return DXGI_FORMAT_R10G10B10A2_UNORM;
case D3DDECLTYPE_FLOAT16_2: return DXGI_FORMAT_R16G16_FLOAT;
case D3DDECLTYPE_FLOAT16_4: return DXGI_FORMAT_R16G16B16A16_FLOAT;
case D3DDECLTYPE_UNUSED:
default: return DXGI_FORMAT_UNKNOWN;
}
}
HRESULT ConvertDeclaration( const D3DVERTEXELEMENT9 original[ MAX_VERTEX_ELEMENTS ], std::vector<D3D11_INPUT_ELEMENT_DESC>& output)
{
for( UINT i = 0; i < MAX_VERTEX_ELEMENTS; ++i )
{
if( original[i].Stream == 0xFF )
break;
// Convert this element
D3D11_INPUT_ELEMENT_DESC item;
item.SemanticName = ConvertSemantic( static_cast< D3DDECLUSAGE >( original[i].Usage ) );
item.SemanticIndex = original[i].UsageIndex;
item.AlignedByteOffset = original[i].Offset;
item.InputSlot = original[i].Stream;
item.InputSlotClass = D3D11_INPUT_PER_VERTEX_DATA;
item.InstanceDataStepRate = 0;
item.Format = ConvertType( static_cast< D3DDECLTYPE >( original[i].Type ) );
output.push_back(item);
}
return S_OK;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment