DX11 renderer wip.

This commit is contained in:
bkaradzic 2012-07-22 21:08:58 -07:00
parent 055131b7bb
commit 09aa9a38c1
18 changed files with 4021 additions and 1222 deletions

View File

@ -165,6 +165,7 @@ namespace bgfx
D3D9_UnableToCreateDevice,
D3D9_UnableToCreateRenderTarget,
D3D9_UnableToCreateTexture,
D3D11_UnableToInitialize,
OPENGL_UnableToCreateContext,
};
};
@ -175,7 +176,8 @@ namespace bgfx
{
Null = 0,
Direct3D9,
OpenGLES,
Direct3D11,
OpenGLES2,
OpenGL,
};
};
@ -283,10 +285,10 @@ namespace bgfx
};
};
typedef void (*fatalFn)(Fatal::Enum _code, const char* _str);
typedef void* (*reallocFn)(void* _ptr, size_t _size);
typedef void (*freeFn)(void* _ptr);
typedef void (*cacheFn)(uint64_t _id, bool _store, void* _data, uint32_t& _length);
typedef void (*FatalFn)(Fatal::Enum _code, const char* _str);
typedef void* (*ReallocFn)(void* _ptr, size_t _size);
typedef void (*FreeFn)(void* _ptr);
typedef void (*CacheFn)(uint64_t _id, bool _store, void* _data, uint32_t& _length);
struct VertexDecl
{
@ -305,7 +307,7 @@ namespace bgfx
RendererType::Enum getRendererType();
///
void init(bool _createRenderThread = true, fatalFn _fatal = NULL, reallocFn _realloc = NULL, freeFn _free = NULL, cacheFn _cache = NULL);
void init(bool _createRenderThread = true, FatalFn _fatal = NULL, ReallocFn _realloc = NULL, FreeFn _free = NULL, CacheFn _cache = NULL);
///
void shutdown();

View File

@ -25,6 +25,7 @@ project "bgfx"
includedirs {
BGFX_DIR .. "include",
"$(DXSDK_DIR)/include",
}
files {

View File

@ -52,4 +52,6 @@ project "shaderc"
links {
"d3dx9",
"d3dcompiler",
"dxguid",
}

View File

@ -63,10 +63,10 @@ namespace bgfx
_length = 0;
}
fatalFn g_fatal = fatalStub;
reallocFn g_realloc = reallocStub;
freeFn g_free = freeStub;
cacheFn g_cache = cacheStub;
FatalFn g_fatal = fatalStub;
ReallocFn g_realloc = reallocStub;
FreeFn g_free = freeStub;
CacheFn g_cache = cacheStub;
static BX_THREAD uint32_t s_threadIndex = 0;
static Context s_ctx;
@ -199,8 +199,8 @@ namespace bgfx
{
m_decl.begin();
m_decl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float);
m_decl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8);
m_decl.add(bgfx::Attrib::Color1, 4, bgfx::AttribType::Uint8);
m_decl.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true);
m_decl.add(bgfx::Attrib::Color1, 4, bgfx::AttribType::Uint8, true);
m_decl.add(bgfx::Attrib::TexCoord0, 2, bgfx::AttribType::Float);
m_decl.end();
@ -228,8 +228,11 @@ namespace bgfx
m_texture = s_ctx.createTexture(mem, BGFX_TEXTURE_MIN_POINT|BGFX_TEXTURE_MAG_POINT|BGFX_TEXTURE_MIP_POINT, NULL, NULL);
#if BGFX_CONFIG_RENDERER_DIRECT3D9
mem = bgfx::alloc(sizeof(vs_debugfont_hlsl)+1);
memcpy(mem->data, vs_debugfont_hlsl, mem->size-1);
mem = bgfx::alloc(sizeof(vs_debugfont_dx9)+1);
memcpy(mem->data, vs_debugfont_dx9, mem->size-1);
#elif BGFX_CONFIG_RENDERER_DIRECT3D11
mem = bgfx::alloc(sizeof(vs_debugfont_dx11)+1);
memcpy(mem->data, vs_debugfont_dx11, mem->size-1);
#else
mem = bgfx::alloc(sizeof(vs_debugfont_glsl)+1);
memcpy(mem->data, vs_debugfont_glsl, mem->size-1);
@ -238,8 +241,11 @@ namespace bgfx
bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem);
#if BGFX_CONFIG_RENDERER_DIRECT3D9
mem = bgfx::alloc(sizeof(fs_debugfont_hlsl)+1);
memcpy(mem->data, fs_debugfont_hlsl, mem->size-1);
mem = bgfx::alloc(sizeof(fs_debugfont_dx9)+1);
memcpy(mem->data, fs_debugfont_dx9, mem->size-1);
#elif BGFX_CONFIG_RENDERER_DIRECT3D11
mem = bgfx::alloc(sizeof(fs_debugfont_dx11)+1);
memcpy(mem->data, fs_debugfont_dx11, mem->size-1);
#else
mem = bgfx::alloc(sizeof(fs_debugfont_glsl)+1);
memcpy(mem->data, fs_debugfont_glsl, mem->size-1);
@ -372,6 +378,11 @@ namespace bgfx
"u_alphaRef",
};
const char* getPredefinedUniformName(PredefinedUniform::Enum _enum)
{
return s_predefinedName[_enum];
}
PredefinedUniform::Enum nameToPredefinedUniformEnum(const char* _name)
{
for (uint32_t ii = 0; ii < PredefinedUniform::Count; ++ii)
@ -460,16 +471,18 @@ namespace bgfx
{
#if BGFX_CONFIG_RENDERER_DIRECT3D9
return RendererType::Direct3D9;
#elif BGFX_CONFIG_RENDERER_DIRECT3D11
return RendererType::Direct3D11;
#elif BGFX_CONFIG_RENDERER_OPENGL
return RendererType::OpenGL;
#elif BGFX_CONFIG_RENDERER_OPENGLES2
return RendererType::OpenGLES;
return RendererType::OpenGLES2;
#else
return RendererType::Null;
#endif // BGFX_CONFIG_RENDERER_
}
void init(bool _createRenderThread, fatalFn _fatal, reallocFn _realloc, freeFn _free, cacheFn _cache)
void init(bool _createRenderThread, FatalFn _fatal, ReallocFn _realloc, FreeFn _free, CacheFn _cache)
{
if (NULL != _fatal)
{
@ -742,9 +755,9 @@ namespace bgfx
return mem;
}
void release(Memory* _mem)
void release(const Memory* _mem)
{
g_free(_mem);
g_free(const_cast<Memory*>(_mem) );
}
void setDebug(uint32_t _debug)

View File

@ -134,6 +134,8 @@ namespace stl = std;
#if BGFX_CONFIG_RENDERER_DIRECT3D9
# define BGFX_RENDERER_NAME "Direct3D 9"
#elif BGFX_CONFIG_RENDERER_DIRECT3D11
# define BGFX_RENDERER_NAME "Direct3D 11"
#elif BGFX_CONFIG_RENDERER_OPENGL
# define BGFX_RENDERER_NAME "OpenGL"
#elif BGFX_CONFIG_RENDERER_OPENGLES2
@ -143,13 +145,13 @@ namespace stl = std;
namespace bgfx
{
extern const uint32_t g_constantTypeSize[ConstantType::Count];
extern fatalFn g_fatal;
extern reallocFn g_realloc;
extern freeFn g_free;
extern cacheFn g_cache;
extern FatalFn g_fatal;
extern ReallocFn g_realloc;
extern FreeFn g_free;
extern CacheFn g_cache;
void fatal(bgfx::Fatal::Enum _code, const char* _format, ...);
void release(Memory* _mem);
void release(const Memory* _mem);
void saveTga(const char* _filePath, uint32_t _width, uint32_t _height, uint32_t _srcPitch, const void* _src, bool _grayscale = false, bool _yflip = false);
const char* getAttribName(Attrib::Enum _attr);
bool renderFrame();
@ -339,6 +341,7 @@ namespace bgfx
uint16_t m_count;
};
const char* getPredefinedUniformName(PredefinedUniform::Enum _enum);
PredefinedUniform::Enum nameToPredefinedUniformEnum(const char* _name);
class StreamRead

File diff suppressed because it is too large Load Diff

View File

@ -24,7 +24,7 @@
# endif // BGFX_CONFIG_RENDERER_OPENGLES
# ifndef BGFX_CONFIG_RENDERER_NULL
# define BGFX_CONFIG_RENDERER_NULL (!(BGFX_CONFIG_RENDERER_DIRECT3D9|BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES2) )
# define BGFX_CONFIG_RENDERER_NULL (!(BGFX_CONFIG_RENDERER_DIRECT3D9|BGFX_CONFIG_RENDERER_DIRECT3D11|BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES2) )
# endif // BGFX_CONFIG_RENDERER_NULL
#endif // !defined...

View File

@ -0,0 +1,58 @@
static const uint8_t fs_debugfont_dx11[879] =
{
0x00, 0x00, 0x00, 0x00, 0x68, 0x03, 0x44, 0x58, 0x42, 0x43, 0x86, 0xad, 0xb6, 0x81, 0xa7, 0x03, // ....h.DXBC......
0x01, 0x3e, 0x2a, 0x57, 0xe1, 0x88, 0xd8, 0x74, 0xb7, 0x81, 0x01, 0x00, 0x00, 0x00, 0x68, 0x03, // .>*W...t......h.
0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xf4, 0x00, 0x00, 0x00, 0x80, 0x01, // ......4.........
0x00, 0x00, 0xb4, 0x01, 0x00, 0x00, 0xcc, 0x02, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0xb8, 0x00, // ..........RDEF..
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x00, // ..............<.
0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x00, 0x91, 0x00, 0x00, 0x87, 0x00, 0x00, 0x00, 0x52, 0x44, // ..............RD
0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, // 11<....... ...(.
0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, // ..$...........|.
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x7c, 0x00, // ..............|.
0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, // ................
0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x75, 0x5f, // ..............u_
0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, // texColor.Microso
0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, // ft (R) HLSL Shad
0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, // er Compiler 9.29
0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x49, 0x53, 0x47, 0x4e, 0x84, 0x00, // .952.3111.ISGN..
0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, // ..........h.....
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, // ................
0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, // ..t.............
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, // ..........t.....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, // ................
0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, // ..z.............
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, // ..........SV_POS
0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, // ITION.COLOR.TEXC
0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, // OORD..OSGN,.....
0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ...... .........
0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x53, 0x56, // ..............SV
0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, 0x58, 0x10, 0x01, // _TARGET...SHEX..
0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x5a, 0x00, // ..P...D...j...Z.
0x00, 0x03, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, 0x04, 0x00, 0x70, // ...`......X....p
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, // ......UU..b.....
0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x02, 0x00, // ......b.........
0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x65, 0x00, // ..b...2.......e.
0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x02, 0x00, // ... ......h.....
0x00, 0x00, 0x45, 0x00, 0x00, 0x8b, 0xc2, 0x00, 0x00, 0x80, 0x43, 0x55, 0x15, 0x00, 0x12, 0x00, // ..E.......CU....
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x46, 0x7e, // ......F.......F~
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .......`........
0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, // ..........F.....
0x00, 0x00, 0x46, 0x1e, 0x10, 0x80, 0x41, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x32, 0x00, // ..F...A.......2.
0x00, 0x09, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x02, 0x00, // ..F.......F.....
0x00, 0x00, 0x31, 0x00, 0x00, 0x07, 0x12, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3a, 0x00, // ..1...........:.
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x81, 0x80, 0x80, 0x3b, 0x0d, 0x00, // .......@.....;..
0x04, 0x03, 0x0a, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, // ..........6....
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, // ......F.......>.
0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, // ..STAT..........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ...............
};

View File

@ -0,0 +1,25 @@
static const uint8_t fs_debugfont_dx9[345] =
{
0x00, 0x00, 0x54, 0x01, 0x01, 0x02, 0xff, 0xff, 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, // ..T.......".CTAB
0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, 0x01, 0x02, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, // ....S...........
0x1c, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, // ........L...0...
0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........<.......
0x75, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0c, 0x00, // u_texColor......
0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32, // ............ps_2
0x5f, 0x61, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, // _a.Microsoft (R)
0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, // HLSL Shader Com
0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, // piler 9.29.952.3
0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0f, 0xa0, 0x81, 0x80, 0x80, 0xbb, // 111.Q...........
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x80, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x02, // ................
0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, // ................
0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0xb0, // ................
0x1f, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x90, 0x00, 0x08, 0x0f, 0xa0, 0x42, 0x00, 0x00, 0x03, // ............B...
0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, 0x00, 0x08, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, // ................
0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x02, 0x00, 0x00, 0x03, 0x01, 0x00, 0x0f, 0x80, // ................
0x01, 0x00, 0xe4, 0x81, 0x00, 0x00, 0xe4, 0x90, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, // ................
0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0xe4, 0x80, 0x01, 0x00, 0xe4, 0x90, 0x02, 0x00, 0x00, 0x03, // ................
0x01, 0x00, 0x01, 0x80, 0x00, 0x00, 0xff, 0x80, 0x00, 0x00, 0x00, 0xa0, 0x58, 0x00, 0x00, 0x04, // ............X...
0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x55, 0xa0, 0x00, 0x00, 0xaa, 0xa0, // ..........U.....
0x41, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, // A...............
0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00, 0x00, // .........
};

58
src/renderer_d3d.h Normal file
View File

@ -0,0 +1,58 @@
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#ifndef __RENDERER_D3D_H__
#define __RENDERER_D3D_H__
#if BGFX_CONFIG_DEBUG && BX_PLATFORM_WINDOWS && BX_COMPILER_MSVC
# include <dxerr.h>
# pragma comment(lib, "dxerr.lib")
# define DX_CHECK_EXTRA_F " (%s): %s"
# define DX_CHECK_EXTRA_ARGS , DXGetErrorString(__hr__), DXGetErrorDescription(__hr__)
#else
# define DX_CHECK_EXTRA_F ""
# define DX_CHECK_EXTRA_ARGS
#endif // BGFX_CONFIG_DEBUG && BX_PLATFORM_WINDOWS && BX_COMPILER_MSVC
namespace bgfx
{
#define _DX_CHECK(_call) \
do { \
HRESULT __hr__ = _call; \
BX_CHECK(SUCCEEDED(__hr__), #_call " FAILED 0x%08x" DX_CHECK_EXTRA_F "\n" \
, (uint32_t)__hr__ \
DX_CHECK_EXTRA_ARGS \
); \
} while (0)
#if BGFX_CONFIG_DEBUG
# define DX_CHECK(_call) _DX_CHECK(_call)
#else
# define DX_CHECK(_call) _call
#endif // BGFX_CONFIG_DEBUG
#if BGFX_CONFIG_DEBUG
# define DX_RELEASE(_ptr, _expected) \
do { \
if (NULL != _ptr) \
{ \
ULONG count = _ptr->Release(); \
BX_CHECK(_expected == count, "RefCount is %d (expected %d).", count, _expected); \
_ptr = NULL; \
} \
} while (0)
#else
# define DX_RELEASE(_ptr, _expected) \
do { \
if (NULL != _ptr) \
{ \
_ptr->Release(); \
_ptr = NULL; \
} \
} while (0)
#endif // BGFX_CONFIG_DEBUG
} // namespace bgfx
#endif // __RENDERER_D3D_H__

File diff suppressed because it is too large Load Diff

289
src/renderer_d3d11.h Normal file
View File

@ -0,0 +1,289 @@
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#ifndef __RENDERER_D3D11_H__
#define __RENDERER_D3D11_H__
#include <d3d11.h>
#include "renderer_d3d.h"
typedef HRESULT (WINAPI *CreateDXGIFactoryFn)(REFIID, void**);
namespace bgfx
{
template <typename Ty>
class StateCacheT
{
public:
void add(uint64_t _id, Ty* _item)
{
invalidate(_id);
m_hashMap.insert(stl::make_pair(_id, _item) );
}
Ty* find(uint64_t _id)
{
HashMap::iterator it = m_hashMap.find(_id);
if (it != m_hashMap.end() )
{
return it->second;
}
return NULL;
}
void invalidate(uint64_t _id)
{
HashMap::iterator it = m_hashMap.find(_id);
if (it != m_hashMap.end() )
{
DX_RELEASE(it->second, 0);
m_hashMap.erase(it);
}
}
void invalidate()
{
for (HashMap::iterator it = m_hashMap.begin(), itEnd = m_hashMap.end(); it != itEnd; ++it)
{
DX_RELEASE(it->second, 0);
}
m_hashMap.clear();
}
private:
typedef stl::unordered_map<uint64_t, Ty*> HashMap;
HashMap m_hashMap;
};
struct IndexBuffer
{
IndexBuffer()
: m_ptr(NULL)
, m_dynamic(false)
{
}
void create(uint32_t _size, void* _data);
void update(uint32_t _offset, uint32_t _size, void* _data);
void destroy()
{
if (NULL != m_ptr)
{
DX_RELEASE(m_ptr, 0);
m_dynamic = false;
}
}
ID3D11Buffer* m_ptr;
uint32_t m_size;
bool m_dynamic;
};
struct VertexBuffer
{
VertexBuffer()
: m_ptr(NULL)
, m_dynamic(false)
{
}
void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle);
void update(uint32_t _offset, uint32_t _size, void* _data);
void destroy()
{
if (NULL != m_ptr)
{
DX_RELEASE(m_ptr, 0);
m_dynamic = false;
}
}
ID3D11Buffer* m_ptr;
uint32_t m_size;
VertexDeclHandle m_decl;
bool m_dynamic;
};
struct Uniform
{
Uniform()
: m_ptr(NULL)
, m_data(NULL)
{
}
void create(ConstantType::Enum _type, uint16_t _num, bool _alloc = true);
void destroy();
ID3D11Buffer* m_ptr;
void* m_data;
};
struct Shader
{
Shader()
: m_ptr(NULL)
, m_code(NULL)
, m_buffer(NULL)
, m_hash(0)
{
}
void create(bool _fragment, const Memory* _mem);
DWORD* getShaderCode(uint8_t _fragmentBit, const Memory* _mem);
void destroy()
{
ConstantBuffer::destroy(m_constantBuffer);
m_constantBuffer = NULL;
m_numPredefined = 0;
if (NULL != m_buffer)
{
DX_RELEASE(m_buffer, 0);
}
DX_RELEASE(m_ptr, 0);
if (NULL != m_code)
{
release(m_code);
m_code = NULL;
m_hash = 0;
}
}
IUnknown* m_ptr;
const Memory* m_code;
ID3D11Buffer* m_buffer;
ConstantBuffer* m_constantBuffer;
PredefinedUniform m_predefined[PredefinedUniform::Count];
uint32_t m_hash;
uint16_t m_numUniforms;
uint8_t m_numPredefined;
};
struct Material
{
Material()
: m_vsh(NULL)
, m_fsh(NULL)
{
}
void create(const Shader& _vsh, const Shader& _fsh)
{
BX_CHECK(NULL != _vsh.m_ptr, "Vertex shader doesn't exist.");
m_vsh = &_vsh;
BX_CHECK(NULL != _fsh.m_ptr, "Fragment shader doesn't exist.");
m_fsh = &_fsh;
memcpy(&m_predefined[0], _vsh.m_predefined, _vsh.m_numPredefined*sizeof(PredefinedUniform) );
memcpy(&m_predefined[_vsh.m_numPredefined], _fsh.m_predefined, _fsh.m_numPredefined*sizeof(PredefinedUniform) );
m_numPredefined = _vsh.m_numPredefined + _fsh.m_numPredefined;
}
void destroy()
{
m_numPredefined = 0;
m_vsh = NULL;
m_fsh = NULL;
}
const Shader* m_vsh;
const Shader* m_fsh;
PredefinedUniform m_predefined[PredefinedUniform::Count*2];
uint8_t m_numPredefined;
};
struct Texture
{
enum Enum
{
Texture2D,
Texture3D,
TextureCube,
};
Texture()
: m_ptr(NULL)
{
}
// void createTexture(uint32_t _width, uint32_t _height, uint8_t _numMips, D3DFORMAT _fmt);
// void createVolumeTexture(uint32_t _width, uint32_t _height, uint32_t _depth, uint32_t _numMips, D3DFORMAT _fmt);
// void createCubeTexture(uint32_t _edge, uint32_t _numMips, D3DFORMAT _fmt);
void create(const Memory* _mem, uint32_t _flags);
void destroy()
{
DX_RELEASE(m_ptr, 0);
}
void commit(uint8_t _stage);
ID3D11ShaderResourceView* m_ptr;
ID3D11SamplerState* m_sampler;
Enum m_type;
bool m_srgb;
};
struct RenderTarget
{
RenderTarget()
:
// m_rt(NULL)
// , m_colorTexture(NULL)
// , m_color(NULL)
// , m_depthTexture(NULL)
// , m_depth(NULL)
// , m_minFilter(D3DTEXF_LINEAR)
// , m_magFilter(D3DTEXF_LINEAR)
m_width(0)
, m_height(0)
, m_flags(0)
, m_depthOnly(false)
{
}
void create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags);
// void createTextures();
// void destroyTextures();
void destroy()
{
// destroyTextures();
m_flags = 0;
}
void commit(uint8_t _stage);
// void resolve();
// Msaa m_msaa;
// IDirect3DSurface9* m_rt;
// IDirect3DTexture9* m_colorTexture;
// IDirect3DSurface9* m_color;
// IDirect3DTexture9* m_depthTexture;
// IDirect3DSurface9* m_depth;
// D3DTEXTUREFILTERTYPE m_minFilter;
// D3DTEXTUREFILTERTYPE m_magFilter;
uint16_t m_width;
uint16_t m_height;
uint32_t m_flags;
bool m_depthOnly;
};
} // namespace bgfx
#endif // __RENDERER_D3D11_H__

View File

@ -193,11 +193,11 @@ namespace bgfx
m_D3DPERF_EndEvent = (D3DPERF_EndEventFunc)GetProcAddress(m_d3d9dll, "D3DPERF_EndEvent");
#if BGFX_CONFIG_RENDERER_DIRECT3D9EX
Direct3DCreate9ExFunc direct3DCreate9Ex = (Direct3DCreate9ExFunc)GetProcAddress(m_d3d9dll, "Direct3DCreate9Ex");
Direct3DCreate9ExFn direct3DCreate9Ex = (Direct3DCreate9ExFn)GetProcAddress(m_d3d9dll, "Direct3DCreate9Ex");
BGFX_FATAL(NULL != direct3DCreate9Ex, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9Ex not found.");
direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d9);
#else
Direct3DCreate9Func direct3DCreate9 = (Direct3DCreate9Func)GetProcAddress(m_d3d9dll, "Direct3DCreate9");
Direct3DCreate9Fn direct3DCreate9 = (Direct3DCreate9Fn)GetProcAddress(m_d3d9dll, "Direct3DCreate9");
BGFX_FATAL(NULL != direct3DCreate9, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9 not found.");
m_d3d9 = direct3DCreate9(D3D_SDK_VERSION);
#endif // defined(D3D_DISABLE_9EX)
@ -308,8 +308,10 @@ namespace bgfx
|| (m_caps.VertexShaderVersion >= D3DVS_VERSION(3, 0) )
;
if (m_instancing)
if (m_amd
&& s_extendedFormats[ExtendedFormat::Inst].m_supported)
{
// ATi only
m_device->SetRenderState(D3DRS_POINTSIZE, D3DFMT_INST);
}
@ -949,14 +951,6 @@ namespace bgfx
elem->Type = declType;
elem->Offset = _decl.m_offset[attr];
++elem;
// BX_TRACE("\tattr %d, num %d, type %d, norm %d, offset %d"
// , attr
// , num
// , type
// , normalized
// , _decl.m_offset[attr]
// );
}
}
@ -1657,7 +1651,7 @@ namespace bgfx
matrix_ortho(proj, 0.0f, (float)width, (float)height, 0.0f, 0.0f, 1000.0f);
PredefinedUniform& predefined = material.m_predefined[0];
uint8_t flags = predefined.m_type&BGFX_UNIFORM_FRAGMENTBIT;
uint8_t flags = predefined.m_type;
s_renderCtx.setShaderConstantF(flags, predefined.m_loc, proj, 4);
s_renderCtx.m_textures[m_texture.idx].commit(0);
@ -1829,11 +1823,13 @@ namespace bgfx
void Context::rendererSubmit()
{
IDirect3DDevice9* device = s_renderCtx.m_device;
PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), "rendererSubmit");
s_renderCtx.updateResolution(m_render->m_resolution);
s_renderCtx.m_device->BeginScene();
device->BeginScene();
if (0 < m_render->m_iboffset)
{
@ -1859,7 +1855,7 @@ namespace bgfx
matrix_mul(viewProj[ii].val, m_render->m_view[ii].val, m_render->m_proj[ii].val);
}
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_FILLMODE, m_render->m_debug&BGFX_DEBUG_WIREFRAME ? D3DFILL_WIREFRAME : D3DFILL_SOLID) );
DX_CHECK(device->SetRenderState(D3DRS_FILLMODE, m_render->m_debug&BGFX_DEBUG_WIREFRAME ? D3DFILL_WIREFRAME : D3DFILL_SOLID) );
uint16_t materialIdx = bgfx::invalidHandle;
SortKey key;
uint8_t view = 0xff;
@ -1913,7 +1909,7 @@ namespace bgfx
vp.Height = rect.m_height;
vp.MinZ = 0.0f;
vp.MaxZ = 1.0f;
DX_CHECK(s_renderCtx.m_device->SetViewport(&vp) );
DX_CHECK(device->SetViewport(&vp) );
Clear& clear = m_render->m_clear[view];
@ -1927,13 +1923,13 @@ namespace bgfx
flags |= D3DCLEAR_TARGET;
uint32_t rgba = clear.m_rgba;
color = D3DCOLOR_RGBA(rgba>>24, (rgba>>16)&0xff, (rgba>>8)&0xff, rgba&0xff);
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_ALPHA) );
DX_CHECK(device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_ALPHA) );
}
if (BGFX_CLEAR_DEPTH_BIT & clear.m_flags)
{
flags |= D3DCLEAR_ZBUFFER;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE) );
DX_CHECK(device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE) );
}
if (BGFX_CLEAR_STENCIL_BIT & clear.m_flags)
@ -1948,18 +1944,18 @@ namespace bgfx
rc.top = rect.m_y;
rc.right = rect.m_x + rect.m_width;
rc.bottom = rect.m_y + rect.m_height;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE) );
DX_CHECK(s_renderCtx.m_device->SetScissorRect(&rc) );
DX_CHECK(s_renderCtx.m_device->Clear(0, NULL, flags, color, clear.m_depth, clear.m_stencil) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE) );
DX_CHECK(device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE) );
DX_CHECK(device->SetScissorRect(&rc) );
DX_CHECK(device->Clear(0, NULL, flags, color, clear.m_depth, clear.m_stencil) );
DX_CHECK(device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE) );
}
}
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZENABLE, TRUE) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER) );
DX_CHECK(device->SetRenderState(D3DRS_ZENABLE, TRUE) );
DX_CHECK(device->SetRenderState(D3DRS_ZFUNC, D3DCMP_LESS) );
DX_CHECK(device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE) );
DX_CHECK(device->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE) );
DX_CHECK(device->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATER) );
}
if ( (BGFX_STATE_CULL_MASK|BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK
@ -1970,22 +1966,22 @@ namespace bgfx
if (BGFX_STATE_CULL_MASK & changedFlags)
{
uint32_t cull = (newFlags&BGFX_STATE_CULL_MASK)>>BGFX_STATE_CULL_SHIFT;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_CULLMODE, s_cullMode[cull]) );
DX_CHECK(device->SetRenderState(D3DRS_CULLMODE, s_cullMode[cull]) );
}
if (BGFX_STATE_DEPTH_WRITE & changedFlags)
{
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZWRITEENABLE, !!(BGFX_STATE_DEPTH_WRITE & newFlags) ) );
DX_CHECK(device->SetRenderState(D3DRS_ZWRITEENABLE, !!(BGFX_STATE_DEPTH_WRITE & newFlags) ) );
}
if (BGFX_STATE_DEPTH_TEST_MASK & changedFlags)
{
uint32_t func = (newFlags&BGFX_STATE_DEPTH_TEST_MASK)>>BGFX_STATE_DEPTH_TEST_SHIFT;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZENABLE, 0 != func) );
DX_CHECK(device->SetRenderState(D3DRS_ZENABLE, 0 != func) );
if (0 != func)
{
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZFUNC, s_depthFunc[func]) );
DX_CHECK(device->SetRenderState(D3DRS_ZFUNC, s_depthFunc[func]) );
}
}
@ -1993,39 +1989,39 @@ namespace bgfx
{
uint32_t ref = (newFlags&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT;
alphaRef = ref/255.0f;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ALPHAREF, ref) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ALPHATESTENABLE, !!(BGFX_STATE_ALPHA_TEST & newFlags) ) );
DX_CHECK(device->SetRenderState(D3DRS_ALPHAREF, ref) );
DX_CHECK(device->SetRenderState(D3DRS_ALPHATESTENABLE, !!(BGFX_STATE_ALPHA_TEST & newFlags) ) );
}
if ( (BGFX_STATE_PT_POINTS|BGFX_STATE_POINT_SIZE_MASK) & changedFlags)
{
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_POINTSIZE, castfu( (float)( (newFlags&BGFX_STATE_POINT_SIZE_MASK)>>BGFX_STATE_POINT_SIZE_SHIFT) ) ) );
DX_CHECK(device->SetRenderState(D3DRS_POINTSIZE, castfu( (float)( (newFlags&BGFX_STATE_POINT_SIZE_MASK)>>BGFX_STATE_POINT_SIZE_SHIFT) ) ) );
}
#if BX_PLATFORM_WINDOWS
if (BGFX_STATE_SRGBWRITE & changedFlags)
{
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SRGBWRITEENABLE, (newFlags&BGFX_STATE_SRGBWRITE) == BGFX_STATE_SRGBWRITE) );
DX_CHECK(device->SetRenderState(D3DRS_SRGBWRITEENABLE, (newFlags&BGFX_STATE_SRGBWRITE) == BGFX_STATE_SRGBWRITE) );
}
#endif // BX_PLATFORM_WINDOWS
if (BGFX_STATE_MSAA & changedFlags)
{
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, (newFlags&BGFX_STATE_MSAA) == BGFX_STATE_MSAA) );
DX_CHECK(device->SetRenderState(D3DRS_MULTISAMPLEANTIALIAS, (newFlags&BGFX_STATE_MSAA) == BGFX_STATE_MSAA) );
}
if ( (BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE) & changedFlags)
{
uint32_t writeEnable = (newFlags&BGFX_STATE_ALPHA_WRITE) ? D3DCOLORWRITEENABLE_ALPHA : 0;
writeEnable |= (newFlags&BGFX_STATE_RGB_WRITE) ? D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE : 0;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_COLORWRITEENABLE, writeEnable) );
DX_CHECK(device->SetRenderState(D3DRS_COLORWRITEENABLE, writeEnable) );
}
if (BGFX_STATE_BLEND_MASK & changedFlags)
{
bool alphaBlendEnabled = !!(BGFX_STATE_BLEND_MASK & newFlags);
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ALPHABLENDENABLE, alphaBlendEnabled) );
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, alphaBlendEnabled) );
DX_CHECK(device->SetRenderState(D3DRS_ALPHABLENDENABLE, alphaBlendEnabled) );
// DX_CHECK(device->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, alphaBlendEnabled) );
if (alphaBlendEnabled)
{
@ -2033,10 +2029,10 @@ namespace bgfx
uint32_t src = blend&0xf;
uint32_t dst = (blend>>4)&0xf;
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SRCBLEND, s_blendFactor[src]) );
DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_DESTBLEND, s_blendFactor[dst]) );
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_SRCALPHA) );
// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA) );
DX_CHECK(device->SetRenderState(D3DRS_SRCBLEND, s_blendFactor[src]) );
DX_CHECK(device->SetRenderState(D3DRS_DESTBLEND, s_blendFactor[dst]) );
// DX_CHECK(device->SetRenderState(D3DRS_SRCBLENDALPHA, D3DBLEND_SRCALPHA) );
// DX_CHECK(device->SetRenderState(D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA) );
}
}
@ -2055,14 +2051,14 @@ namespace bgfx
if (bgfx::invalidHandle == materialIdx)
{
s_renderCtx.m_device->SetVertexShader(NULL);
s_renderCtx.m_device->SetPixelShader(NULL);
device->SetVertexShader(NULL);
device->SetPixelShader(NULL);
}
else
{
Material& material = s_renderCtx.m_materials[materialIdx];
s_renderCtx.m_device->SetVertexShader( (IDirect3DVertexShader9*)material.m_vsh->m_ptr);
s_renderCtx.m_device->SetPixelShader( (IDirect3DPixelShader9*)material.m_fsh->m_ptr);
device->SetVertexShader( (IDirect3DVertexShader9*)material.m_vsh->m_ptr);
device->SetPixelShader( (IDirect3DPixelShader9*)material.m_fsh->m_ptr);
}
materialChanged =
@ -2220,7 +2216,7 @@ namespace bgfx
}
else
{
DX_CHECK(s_renderCtx.m_device->SetTexture(stage, NULL) );
DX_CHECK(device->SetTexture(stage, NULL) );
}
}
@ -2240,30 +2236,31 @@ namespace bgfx
uint16_t decl = vb.m_decl.idx == bgfx::invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx;
const VertexDeclaration& vertexDecl = s_renderCtx.m_vertexDecls[decl];
DX_CHECK(s_renderCtx.m_device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) );
DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) );
if (invalidHandle != state.m_instanceDataBuffer.idx)
if (invalidHandle != state.m_instanceDataBuffer.idx
&& s_renderCtx.m_instancing)
{
const VertexBuffer& inst = s_renderCtx.m_vertexBuffers[state.m_instanceDataBuffer.idx];
DX_CHECK(s_renderCtx.m_device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA|state.m_numInstances) );
DX_CHECK(s_renderCtx.m_device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA|1) );
DX_CHECK(s_renderCtx.m_device->SetStreamSource(1, inst.m_ptr, state.m_instanceDataOffset, state.m_instanceDataStride) );
DX_CHECK(device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA|state.m_numInstances) );
DX_CHECK(device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA|1) );
DX_CHECK(device->SetStreamSource(1, inst.m_ptr, state.m_instanceDataOffset, state.m_instanceDataStride) );
IDirect3DVertexDeclaration9* ptr = createVertexDecl(vertexDecl.m_decl, state.m_instanceDataStride/16);
DX_CHECK(s_renderCtx.m_device->SetVertexDeclaration(ptr) );
DX_CHECK(device->SetVertexDeclaration(ptr) );
DX_RELEASE(ptr, 0);
}
else
{
DX_CHECK(s_renderCtx.m_device->SetStreamSourceFreq(0, 1) );
DX_CHECK(s_renderCtx.m_device->SetStreamSource(1, NULL, 0, 0) );
DX_CHECK(s_renderCtx.m_device->SetVertexDeclaration(vertexDecl.m_ptr) );
DX_CHECK(device->SetStreamSourceFreq(0, 1) );
DX_CHECK(device->SetStreamSource(1, NULL, 0, 0) );
DX_CHECK(device->SetVertexDeclaration(vertexDecl.m_ptr) );
}
}
else
{
DX_CHECK(s_renderCtx.m_device->SetStreamSource(0, NULL, 0, 0) );
DX_CHECK(s_renderCtx.m_device->SetStreamSource(1, NULL, 0, 0) );
DX_CHECK(device->SetStreamSource(0, NULL, 0, 0) );
DX_CHECK(device->SetStreamSource(1, NULL, 0, 0) );
}
}
@ -2275,11 +2272,11 @@ namespace bgfx
if (bgfx::invalidHandle != handle)
{
IndexBuffer& ib = s_renderCtx.m_indexBuffers[handle];
DX_CHECK(s_renderCtx.m_device->SetIndices(ib.m_ptr) );
DX_CHECK(device->SetIndices(ib.m_ptr) );
}
else
{
DX_CHECK(s_renderCtx.m_device->SetIndices(NULL) );
DX_CHECK(device->SetIndices(NULL) );
}
}
@ -2308,7 +2305,7 @@ namespace bgfx
numInstances = state.m_numInstances;
numPrimsRendered = numPrimsSubmitted*state.m_numInstances;
DX_CHECK(s_renderCtx.m_device->DrawIndexedPrimitive(primType
DX_CHECK(device->DrawIndexedPrimitive(primType
, state.m_startVertex
, 0
, numVertices
@ -2323,7 +2320,7 @@ namespace bgfx
numInstances = state.m_numInstances;
numPrimsRendered = numPrimsSubmitted*state.m_numInstances;
DX_CHECK(s_renderCtx.m_device->DrawIndexedPrimitive(primType
DX_CHECK(device->DrawIndexedPrimitive(primType
, state.m_startVertex
, 0
, numVertices
@ -2337,7 +2334,7 @@ namespace bgfx
numPrimsSubmitted = numVertices/primNumVerts;
numInstances = state.m_numInstances;
numPrimsRendered = numPrimsSubmitted*state.m_numInstances;
DX_CHECK(s_renderCtx.m_device->DrawPrimitive(primType
DX_CHECK(device->DrawPrimitive(primType
, state.m_startVertex
, numPrimsSubmitted
) );
@ -2412,7 +2409,7 @@ namespace bgfx
PIX_ENDEVENT();
}
s_renderCtx.m_device->EndScene();
device->EndScene();
}
}

View File

@ -23,9 +23,9 @@
# include <d3d9.h>
# if BGFX_CONFIG_RENDERER_DIRECT3D9EX
typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT SDKVersion, IDirect3D9Ex**);
typedef HRESULT (WINAPI *Direct3DCreate9ExFn)(UINT SDKVersion, IDirect3D9Ex**);
# else
typedef IDirect3D9* (WINAPI *Direct3DCreate9Func)(UINT SDKVersion);
typedef IDirect3D9* (WINAPI *Direct3DCreate9Fn)(UINT SDKVersion);
# endif // BGFX_CONFIG_RENDERER_DIRECT3D9EX
typedef int (WINAPI *D3DPERF_BeginEventFunc)(D3DCOLOR col, LPCWSTR wszName);
@ -56,20 +56,10 @@ typedef DWORD (WINAPI *D3DPERF_GetStatusFunc)();
# define _PIX_ENDEVENT() do {} while(0)
#endif // BX_PLATFORM_
#include "renderer_d3d.h"
namespace bgfx
{
# define _DX_CHECK(_call) \
do { \
HRESULT __hr__ = _call; \
BX_CHECK(SUCCEEDED(__hr__), #_call " FAILED 0x%08x\n", (uint32_t)__hr__); \
} while (0)
#if BGFX_CONFIG_DEBUG
# define DX_CHECK(_call) _DX_CHECK(_call)
#else
# define DX_CHECK(_call) _call
#endif // BGFX_CONFIG_DEBUG
#if BGFX_CONFIG_DEBUG_PIX
# define PIX_SETMARKER(_col, _name) _PIX_SETMARKER(_col, _name)
# define PIX_BEGINEVENT(_col, _name) _PIX_BEGINEVENT(_col, _name)
@ -80,27 +70,6 @@ namespace bgfx
# define PIX_ENDEVENT()
#endif // BGFX_CONFIG_DEBUG_PIX
#if BGFX_CONFIG_DEBUG
# define DX_RELEASE(_ptr, _expected) \
do { \
if (NULL != _ptr) \
{ \
ULONG count = _ptr->Release(); \
BX_CHECK(_expected == count, "RefCount is %d (expected %d).", count, _expected); \
_ptr = NULL; \
} \
} while (0)
#else
# define DX_RELEASE(_ptr, _expected) \
do { \
if (NULL != _ptr) \
{ \
_ptr->Release(); \
_ptr = NULL; \
} \
} while (0)
#endif // BGFX_CONFIG_DEBUG
# ifndef D3DFMT_ATI1
# define D3DFMT_ATI1 ( (D3DFORMAT)MAKEFOURCC('A','T','I','1') )
# endif // D3DFMT_ATI1

View File

@ -1,141 +1,145 @@
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "bgfx_p.h"
#if BGFX_CONFIG_RENDERER_NULL
namespace bgfx
{
void ConstantBuffer::commit()
{
}
void TextVideoMemBlitter::setup()
{
}
void TextVideoMemBlitter::render(uint32_t /*_numIndices*/)
{
}
void Context::flip()
{
}
void Context::rendererInit()
{
}
void Context::rendererShutdown()
{
}
void Context::rendererCreateIndexBuffer(IndexBufferHandle /*_handle*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyIndexBuffer(IndexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateVertexDecl(VertexDeclHandle /*_handle*/, const VertexDecl& /*_decl*/)
{
}
void Context::rendererDestroyVertexDecl(VertexDeclHandle /*_handle*/)
{
}
void Context::rendererCreateVertexBuffer(VertexBufferHandle /*_handle*/, Memory* /*_mem*/, VertexDeclHandle /*_declHandle*/)
{
}
void Context::rendererDestroyVertexBuffer(VertexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateDynamicIndexBuffer(IndexBufferHandle /*_handle*/, uint32_t /*_size*/)
{
}
void Context::rendererUpdateDynamicIndexBuffer(IndexBufferHandle /*_handle*/, uint32_t /*_offset*/, uint32_t /*_size*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyDynamicIndexBuffer(IndexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateDynamicVertexBuffer(VertexBufferHandle /*_handle*/, uint32_t /*_size*/)
{
}
void Context::rendererUpdateDynamicVertexBuffer(VertexBufferHandle /*_handle*/, uint32_t /*_offset*/, uint32_t /*_size*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyDynamicVertexBuffer(VertexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateVertexShader(VertexShaderHandle /*_handle*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyVertexShader(VertexShaderHandle /*_handle*/)
{
}
void Context::rendererCreateFragmentShader(FragmentShaderHandle /*_handle*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyFragmentShader(FragmentShaderHandle /*_handle*/)
{
}
void Context::rendererCreateMaterial(MaterialHandle /*_handle*/, VertexShaderHandle /*_vsh*/, FragmentShaderHandle /*_fsh*/)
{
}
void Context::rendererDestroyMaterial(FragmentShaderHandle /*_handle*/)
{
}
void Context::rendererCreateTexture(TextureHandle /*_handle*/, Memory* /*_mem*/, uint32_t /*_flags*/)
{
}
void Context::rendererDestroyTexture(TextureHandle /*_handle*/)
{
}
void Context::rendererCreateRenderTarget(RenderTargetHandle /*_handle*/, uint16_t /*_width*/, uint16_t /*_height*/, uint32_t /*_flags*/, uint32_t /*_textureFlags*/)
{
}
void Context::rendererDestroyRenderTarget(RenderTargetHandle /*_handle*/)
{
}
void Context::rendererCreateUniform(UniformHandle /*_handle*/, ConstantType::Enum /*_type*/, uint16_t /*_num*/, const char* /*_name*/)
{
}
void Context::rendererDestroyUniform(UniformHandle /*_handle*/)
{
}
void Context::rendererSaveScreenShot(Memory* /*_mem*/)
{
}
void Context::rendererSubmit()
{
}
}
#endif // BGFX_CONFIG_RENDERER_NULL
/*
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#include "bgfx_p.h"
#if BGFX_CONFIG_RENDERER_NULL
namespace bgfx
{
void ConstantBuffer::commit()
{
}
void TextVideoMemBlitter::setup()
{
}
void TextVideoMemBlitter::render(uint32_t /*_numIndices*/)
{
}
void Context::flip()
{
}
void Context::rendererInit()
{
}
void Context::rendererShutdown()
{
}
void Context::rendererCreateIndexBuffer(IndexBufferHandle /*_handle*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyIndexBuffer(IndexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateVertexDecl(VertexDeclHandle /*_handle*/, const VertexDecl& /*_decl*/)
{
}
void Context::rendererDestroyVertexDecl(VertexDeclHandle /*_handle*/)
{
}
void Context::rendererCreateVertexBuffer(VertexBufferHandle /*_handle*/, Memory* /*_mem*/, VertexDeclHandle /*_declHandle*/)
{
}
void Context::rendererDestroyVertexBuffer(VertexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateDynamicIndexBuffer(IndexBufferHandle /*_handle*/, uint32_t /*_size*/)
{
}
void Context::rendererUpdateDynamicIndexBuffer(IndexBufferHandle /*_handle*/, uint32_t /*_offset*/, uint32_t /*_size*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyDynamicIndexBuffer(IndexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateDynamicVertexBuffer(VertexBufferHandle /*_handle*/, uint32_t /*_size*/)
{
}
void Context::rendererUpdateDynamicVertexBuffer(VertexBufferHandle /*_handle*/, uint32_t /*_offset*/, uint32_t /*_size*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyDynamicVertexBuffer(VertexBufferHandle /*_handle*/)
{
}
void Context::rendererCreateVertexShader(VertexShaderHandle /*_handle*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyVertexShader(VertexShaderHandle /*_handle*/)
{
}
void Context::rendererCreateFragmentShader(FragmentShaderHandle /*_handle*/, Memory* /*_mem*/)
{
}
void Context::rendererDestroyFragmentShader(FragmentShaderHandle /*_handle*/)
{
}
void Context::rendererCreateMaterial(MaterialHandle /*_handle*/, VertexShaderHandle /*_vsh*/, FragmentShaderHandle /*_fsh*/)
{
}
void Context::rendererDestroyMaterial(FragmentShaderHandle /*_handle*/)
{
}
void Context::rendererCreateTexture(TextureHandle /*_handle*/, Memory* /*_mem*/, uint32_t /*_flags*/)
{
}
void Context::rendererDestroyTexture(TextureHandle /*_handle*/)
{
}
void Context::rendererCreateRenderTarget(RenderTargetHandle /*_handle*/, uint16_t /*_width*/, uint16_t /*_height*/, uint32_t /*_flags*/, uint32_t /*_textureFlags*/)
{
}
void Context::rendererDestroyRenderTarget(RenderTargetHandle /*_handle*/)
{
}
void Context::rendererCreateUniform(UniformHandle /*_handle*/, ConstantType::Enum /*_type*/, uint16_t /*_num*/, const char* /*_name*/)
{
}
void Context::rendererDestroyUniform(UniformHandle /*_handle*/)
{
}
void Context::rendererSaveScreenShot(Memory* /*_mem*/)
{
}
void Context::rendererUpdateUniform(uint16_t /*_loc*/, const void* /*_data*/, uint32_t /*_size*/)
{
}
void Context::rendererSubmit()
{
}
}
#endif // BGFX_CONFIG_RENDERER_NULL

179
src/vs_debugfont_dx11.bin.h Normal file
View File

@ -0,0 +1,179 @@
static const uint8_t vs_debugfont_dx11[2809] =
{
0x01, 0x00, 0xc0, 0x0a, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, // .....u_modelView
0x50, 0x72, 0x6f, 0x6a, 0x09, 0x00, 0x00, 0x0a, 0x40, 0x00, 0xdc, 0x0a, 0x44, 0x58, 0x42, 0x43, // Proj....@...DXBC
0x49, 0xc3, 0x37, 0x49, 0xa7, 0x55, 0xe6, 0x4d, 0x05, 0x66, 0x2d, 0x74, 0x33, 0xa1, 0xec, 0xf1, // I.7I.U.M.f-t3...
0x01, 0x00, 0x00, 0x00, 0xdc, 0x0a, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, // ............4...
0xcc, 0x07, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xe0, 0x08, 0x00, 0x00, 0x40, 0x0a, 0x00, 0x00, // ....T.......@...
0x52, 0x44, 0x45, 0x46, 0x90, 0x07, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, // RDEF........h...
0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0xff, 0x00, 0x91, 0x00, 0x00, // ....<...........
0x5d, 0x07, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, // ]...RD11<.......
0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, // ...(...$.......
0x00, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x24, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x73, 0x00, 0xab, 0xab, 0xab, // ....$Globals....
0x5c, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x0a, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x18, 0x05, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x05, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // ................
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x31, 0x05, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 1...............
0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x05, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, // ........=.......
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x44, 0x05, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // D...............
0xf4, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x05, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, // ........O.......
0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........`.......
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x84, 0x05, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .... ...........
0x98, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xbc, 0x05, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, // ............0...
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xf4, 0x05, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ....@...........
0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, // ............P...
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x10, 0x06, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ....`...........
0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x06, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, // ............p...
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x2e, 0x06, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, // ........>.......
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x49, 0x06, 0x00, 0x00, 0xa0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // I...............
0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x53, 0x06, 0x00, 0x00, 0xb0, 0x00, 0x00, 0x00, // ........S.......
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x5e, 0x06, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ^...............
0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x6a, 0x06, 0x00, 0x00, 0xd0, 0x00, 0x00, 0x00, // ........j.......
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x78, 0x06, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // x...............
0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, // ................
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x93, 0x06, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........@.......
0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x06, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, // ............@...
0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xf8, 0x06, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x24, 0x07, 0x00, 0x00, 0xc0, 0x09, 0x00, 0x00, // ........$.......
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // @...............
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x30, 0x07, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, // 0.......@.......
0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x40, 0x07, 0x00, 0x00, 0x40, 0x0a, 0x00, 0x00, // ........@...@...
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // @...............
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0x51, 0x07, 0x00, 0x00, 0x80, 0x0a, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Q.......@.......
0xa4, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, // ................
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x52, // ........u_alphaR
0x65, 0x66, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x00, 0xab, 0xab, 0xab, 0x00, 0x00, 0x03, 0x00, // ef.float........
0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x04, 0x00, 0x00, // ................
0x75, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x00, 0x75, 0x5f, 0x72, 0x67, 0x62, 0x64, 0x69, 0x73, 0x70, // u_time.u_rgbdisp
0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x75, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, // lacement.u_inter
0x6c, 0x61, 0x63, 0x65, 0x00, 0x75, 0x5f, 0x7a, 0x6f, 0x6f, 0x6d, 0x00, 0x75, 0x5f, 0x73, 0x74, // lace.u_zoom.u_st
0x72, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x00, 0x75, 0x5f, 0x63, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x00, // rength.u_center.
0x66, 0x6c, 0x6f, 0x61, 0x74, 0x32, 0x00, 0xab, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, // float2..........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x05, 0x00, 0x00, 0x75, 0x5f, 0x6d, 0x65, // ........X...u_me
0x73, 0x68, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x56, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x33, 0x00, // shTileUV.float3.
0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x91, 0x05, 0x00, 0x00, 0x75, 0x5f, 0x6d, 0x61, 0x74, 0x44, 0x69, 0x66, 0x66, 0x75, 0x73, 0x65, // ....u_matDiffuse
0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x04, 0x00, // .float4.........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x05, 0x00, 0x00, 0x75, 0x5f, 0x68, 0x69, // ............u_hi
0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x75, 0x5f, 0x6c, // ghlightColor.u_l
0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x72, 0x00, 0x75, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x41, // ightDir.u_lightA
0x6d, 0x62, 0x69, 0x65, 0x6e, 0x74, 0x00, 0x75, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, // mbient.u_lightDi
0x66, 0x66, 0x75, 0x73, 0x65, 0x00, 0x75, 0x5f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x53, 0x70, 0x65, // ffuse.u_lightSpe
0x63, 0x75, 0x6c, 0x61, 0x72, 0x00, 0x75, 0x5f, 0x66, 0x6f, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, // cular.u_fogColor
0x00, 0x75, 0x5f, 0x66, 0x6f, 0x67, 0x41, 0x72, 0x67, 0x73, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, // .u_fogArgs.u_vie
0x77, 0x52, 0x65, 0x63, 0x74, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x54, 0x65, 0x78, 0x65, // wRect.u_viewTexe
0x6c, 0x00, 0x75, 0x5f, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, // l.u_shadowColor.
0x75, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x41, 0x72, 0x67, 0x73, 0x00, 0x75, 0x5f, 0x63, // u_filterArgs.u_c
0x6f, 0x6e, 0x74, 0x6f, 0x75, 0x72, 0x41, 0x72, 0x67, 0x73, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, // ontourArgs.u_vie
0x77, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x00, 0xab, 0x03, 0x00, 0x03, 0x00, // w.float4x4......
0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, // ................
0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0xab, 0x03, 0x00, 0x03, 0x00, // u_viewProj......
0x04, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, // ................
0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, // u_model.........
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ...............
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9a, 0x06, 0x00, 0x00, 0x75, 0x5f, 0x6d, 0x6f, // ............u_mo
0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, // delView.u_modelV
0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, // iewProj.u_modelV
0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x58, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, // iewProjX.u_viewP
0x72, 0x6f, 0x6a, 0x58, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // rojX.Microsoft (
0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, // R) HLSL Shader C
0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, // ompiler 9.29.952
0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x80, 0x00, 0x00, 0x00, // .3111...ISGN....
0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........h.......
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, // ................
0x71, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // q...............
0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // ........q.......
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, // ................
0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // w...............
0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, // ........POSITION
0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, // .COLOR.TEXCOORD.
0x4f, 0x53, 0x47, 0x4e, 0x84, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // OSGN............
0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // h...............
0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........t.......
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, // ................
0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, // t...............
0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ........z.......
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, // ................
0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, // SV_POSITION.COLO
0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x53, 0x48, 0x45, 0x58, // R.TEXCOORD..SHEX
0x58, 0x01, 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x56, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, // X...P...V...j...
0x59, 0x00, 0x00, 0x04, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa4, 0x00, 0x00, 0x00, // Y...F. .........
0x5f, 0x00, 0x00, 0x03, 0x72, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, // _...r......._...
0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, // ........_.......
0x02, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, // ...._...2.......
0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, // g.... ..........
0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, // e.... ......e...
0xf2, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0x32, 0x20, 0x10, 0x00, // . ......e...2 ..
0x03, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, // ....h.......8...
0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x15, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ........V.......
0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, // F. .........2...
0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, // ........F. .....
0xa0, 0x00, 0x00, 0x00, 0x06, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, // ............F...
0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // ....2...........
0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0xa6, 0x1a, 0x10, 0x00, // F. .............
0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, // ....F...........
0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, // . ......F.......
0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, // F. .........6...
0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, // . ......F.......
0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, // 6.... ......F...
0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x32, 0x20, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, // ....6...2 ......
0x46, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, // F.......>...STAT
0x94, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........
};

View File

@ -0,0 +1,24 @@
static const uint8_t vs_debugfont_dx9[335] =
{
0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, // ...u_modelViewPr
0x6f, 0x6a, 0x09, 0x01, 0x00, 0x00, 0x04, 0x00, 0x34, 0x01, 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, // oj......4.......
0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, // #.CTAB....W.....
0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x50, 0x00, // ..............P.
0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, // ..0...........@.
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // ......u_modelVie
0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, // wProj...........
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, // ......vs_2_0.Mic
0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, // rosoft (R) HLSL
0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, // Shader Compiler
0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x1f, 0x00, // 9.29.952.3111...
0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, // ................
0x00, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x01, 0x80, 0x02, 0x00, // ................
0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x80, 0x03, 0x00, 0x0f, 0x90, 0x05, 0x00, // ................
0x00, 0x03, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, 0x04, 0x00, // ........U.......
0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xa0, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, // ................
0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x00, 0x00, // ................
0xaa, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x0f, 0xc0, 0x00, 0x00, // ................
0xe4, 0x80, 0x03, 0x00, 0xe4, 0xa0, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x0f, 0xd0, 0x01, 0x00, // ................
0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, 0x0f, 0xd0, 0x02, 0x00, 0xe4, 0x90, 0x01, 0x00, // ................
0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x03, 0x00, 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ...............
};

View File

@ -3,6 +3,7 @@
* License: http://www.opensource.org/licenses/BSD-2-Clause
*/
#define NOMINMAX
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
@ -17,7 +18,7 @@ extern "C" {
# include <fpp.h>
} // extern "C"
#if 0
#if 1
# define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__)
#endif // DEBUG
@ -35,6 +36,7 @@ extern "C" {
#if BX_PLATFORM_WINDOWS
# include <d3dx9.h>
# include <d3dcompiler.h>
#endif // BX_PLATFORM_WINDOWS
long int fsize(FILE* _file)
@ -93,7 +95,7 @@ struct Uniform
typedef std::vector<Uniform> UniformArray;
#if BX_PLATFORM_WINDOWS
struct ConstRemap
struct ConstRemapDx9
{
ConstantType::Enum id;
D3DXPARAMETER_CLASS paramClass;
@ -101,23 +103,23 @@ struct ConstRemap
uint32_t paramBytes;
};
static const ConstRemap s_constRemap[7] =
static const ConstRemapDx9 s_constRemapDx9[7] =
{
{ ConstantType::Uniform1iv, D3DXPC_SCALAR, D3DXPT_INT, 4 },
{ ConstantType::Uniform1fv, D3DXPC_SCALAR, D3DXPT_FLOAT, 4 },
{ ConstantType::Uniform2fv, D3DXPC_VECTOR, D3DXPT_FLOAT, 8 },
{ ConstantType::Uniform3fv, D3DXPC_VECTOR, D3DXPT_FLOAT, 12 },
{ ConstantType::Uniform4fv, D3DXPC_VECTOR, D3DXPT_FLOAT, 16 },
{ ConstantType::Uniform1iv, D3DXPC_SCALAR, D3DXPT_INT, 4 },
{ ConstantType::Uniform1fv, D3DXPC_SCALAR, D3DXPT_FLOAT, 4 },
{ ConstantType::Uniform2fv, D3DXPC_VECTOR, D3DXPT_FLOAT, 8 },
{ ConstantType::Uniform3fv, D3DXPC_VECTOR, D3DXPT_FLOAT, 12 },
{ ConstantType::Uniform4fv, D3DXPC_VECTOR, D3DXPT_FLOAT, 16 },
{ ConstantType::Uniform3x3fv, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 36 },
{ ConstantType::Uniform4x4fv, D3DXPC_MATRIX_COLUMNS, D3DXPT_FLOAT, 64 },
};
ConstantType::Enum findConstantType(const D3DXCONSTANT_DESC& constDesc)
ConstantType::Enum findConstantTypeDx9(const D3DXCONSTANT_DESC& constDesc)
{
uint32_t count = sizeof(s_constRemap)/sizeof(ConstRemap);
uint32_t count = sizeof(s_constRemapDx9)/sizeof(ConstRemapDx9);
for (uint32_t ii = 0; ii < count; ++ii)
{
const ConstRemap& remap = s_constRemap[ii];
const ConstRemapDx9& remap = s_constRemapDx9[ii];
if (remap.paramClass == constDesc.Class
&& remap.paramType == constDesc.Type
@ -130,31 +132,117 @@ ConstantType::Enum findConstantType(const D3DXCONSTANT_DESC& constDesc)
return ConstantType::Count;
}
static uint32_t s_optimizationLevel[4] =
static uint32_t s_optimizationLevelDx9[4] =
{
D3DXSHADER_OPTIMIZATION_LEVEL0,
D3DXSHADER_OPTIMIZATION_LEVEL1,
D3DXSHADER_OPTIMIZATION_LEVEL2,
D3DXSHADER_OPTIMIZATION_LEVEL3,
};
struct ConstRemapDx11
{
ConstantType::Enum id;
D3D_SHADER_VARIABLE_CLASS paramClass;
D3D_SHADER_VARIABLE_TYPE paramType;
uint32_t paramBytes;
};
static const ConstRemapDx11 s_constRemapDx11[7] =
{
{ ConstantType::Uniform1iv, D3D_SVC_SCALAR, D3D_SVT_INT, 4 },
{ ConstantType::Uniform1fv, D3D_SVC_SCALAR, D3D_SVT_FLOAT, 4 },
{ ConstantType::Uniform2fv, D3D_SVC_VECTOR, D3D_SVT_FLOAT, 8 },
{ ConstantType::Uniform3fv, D3D_SVC_VECTOR, D3D_SVT_FLOAT, 12 },
{ ConstantType::Uniform4fv, D3D_SVC_VECTOR, D3D_SVT_FLOAT, 16 },
{ ConstantType::Uniform3x3fv, D3D_SVC_MATRIX_COLUMNS, D3D_SVT_FLOAT, 36 },
{ ConstantType::Uniform4x4fv, D3D_SVC_MATRIX_COLUMNS, D3D_SVT_FLOAT, 64 },
};
ConstantType::Enum findConstantTypeDx11(const D3D11_SHADER_TYPE_DESC& constDesc, uint32_t _size)
{
uint32_t count = sizeof(s_constRemapDx11)/sizeof(ConstRemapDx9);
for (uint32_t ii = 0; ii < count; ++ii)
{
const ConstRemapDx11& remap = s_constRemapDx11[ii];
if (remap.paramClass == constDesc.Class
&& remap.paramType == constDesc.Type
&& remap.paramBytes == _size)
{
return remap.id;
}
}
return ConstantType::Count;
}
static uint32_t s_optimizationLevelDx11[4] =
{
D3DCOMPILE_OPTIMIZATION_LEVEL0,
D3DCOMPILE_OPTIMIZATION_LEVEL1,
D3DCOMPILE_OPTIMIZATION_LEVEL2,
D3DCOMPILE_OPTIMIZATION_LEVEL3,
};
#endif // BX_PLATFORM_WINDOWS
class Stream
class IStreamWriter
{
public:
Stream(FILE* _file, bool _bigEndian = false)
: m_file(_file)
virtual ~IStreamWriter() = 0;
virtual bool open() = 0;
virtual void close() = 0;
virtual void writef(const char* _format, ...) = 0;
virtual void write(const char* _str) = 0;
virtual void write(const void* _data, size_t _size) = 0;
template<typename Ty>
void write(Ty _value)
{
write(&_value, sizeof(Ty) );
}
// template<typename Ty>
// void write(Ty _value)
// {
// Ty temp = m_bigEndian ? bx::bigEndian<Ty>(_value) : _value;
// write(&temp, sizeof(Ty) );
// }
};
IStreamWriter::~IStreamWriter()
{
}
class FileWriter : public IStreamWriter
{
public:
FileWriter(const char* _filePath, bool _bigEndian = false)
: m_filePath(_filePath)
, m_file(NULL)
, m_bigEndian(_bigEndian)
{
}
~Stream()
~FileWriter()
{
}
bool open()
{
BX_CHECK(NULL == m_file, "Still open!");
m_file = fopen(m_filePath.c_str(), "wb");
return NULL != m_file;
}
void close()
{
m_file = NULL;
if (NULL != m_file)
{
fclose(m_file);
m_file = NULL;
}
}
void writef(const char* _format, ...)
@ -188,16 +276,116 @@ public:
}
}
template<typename Ty>
void write(Ty _value)
private:
std::string m_filePath;
FILE* m_file;
bool m_bigEndian;
};
class Bin2cStream : public IStreamWriter
{
public:
Bin2cStream(const char* _filePath, const char* _name)
: m_filePath(_filePath)
, m_name(_name)
, m_file(NULL)
{
Ty temp = m_bigEndian ? bx::bigEndian<Ty>(_value) : _value;
write(&temp, sizeof(Ty) );
}
~Bin2cStream()
{
}
bool open()
{
BX_CHECK(NULL == m_file, "Still open!");
m_file = fopen(m_filePath.c_str(), "wb");
return NULL != m_file;
}
void close()
{
if (NULL != m_file)
{
#define HEX_DUMP_WIDTH 16
#define HEX_DUMP_SPACE_WIDTH 96
#define HEX_DUMP_FORMAT "%-" BX_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "." BX_STRINGIZE(HEX_DUMP_SPACE_WIDTH) "s"
const uint8_t* data = &m_buffer[0];
uint32_t size = m_buffer.size();
fprintf(m_file, "static const uint8_t %s[%d] =\n{\n", m_name.c_str(), size);
if (NULL != data)
{
char hex[HEX_DUMP_SPACE_WIDTH+1];
char ascii[HEX_DUMP_WIDTH+1];
uint32_t hexPos = 0;
uint32_t asciiPos = 0;
for (uint32_t ii = 0; ii < size; ++ii)
{
_snprintf(&hex[hexPos], sizeof(hex)-hexPos, "0x%02x, ", data[asciiPos]);
hexPos += 6;
ascii[asciiPos] = isprint(data[asciiPos]) && data[asciiPos] != '\\' ? data[asciiPos] : '.';
asciiPos++;
if (HEX_DUMP_WIDTH == asciiPos)
{
ascii[asciiPos] = '\0';
fprintf(m_file, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii);
data += asciiPos;
hexPos = 0;
asciiPos = 0;
}
}
if (0 != asciiPos)
{
ascii[asciiPos] = '\0';
fprintf(m_file, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii);
}
}
fprintf(m_file, "};\n");
#undef HEX_DUMP_WIDTH
#undef HEX_DUMP_SPACE_WIDTH
#undef HEX_DUMP_FORMAT
fclose(m_file);
m_file = NULL;
}
}
void writef(const char* _format, ...)
{
va_list argList;
va_start(argList, _format);
char temp[2048];
int len = vsnprintf(temp, sizeof(temp), _format, argList);
m_buffer.insert(m_buffer.end(), temp, temp+len);
va_end(argList);
}
void write(const char* _str)
{
m_buffer.insert(m_buffer.end(), _str, _str+strlen(_str) );
}
void write(const void* _data, size_t _size)
{
const char* data = (const char*)_data;
m_buffer.insert(m_buffer.end(), data, data+_size);
}
private:
std::string m_filePath;
std::string m_name;
typedef std::vector<uint8_t> Buffer;
Buffer m_buffer;
FILE* m_file;
bool m_bigEndian;
};
class LineReader
@ -266,7 +454,7 @@ void printCode(const char* _code)
fprintf(stderr, "---\n");
}
bool compileGLSLShader(CommandLine& _cmdLine, const std::string& _code, const char* _outFilePath)
bool compileGLSLShader(CommandLine& _cmdLine, const std::string& _code, IStreamWriter& _stream)
{
const glslopt_shader_type type = tolower(_cmdLine.findOption('\0', "type")[0]) == 'f' ? kGlslOptShaderFragment : kGlslOptShaderVertex;
@ -284,40 +472,28 @@ bool compileGLSLShader(CommandLine& _cmdLine, const std::string& _code, const ch
const char* optimizedShader = glslopt_get_output(shader);
FILE* out = fopen(_outFilePath, "wb");
if (NULL == out)
{
fprintf(stderr, "Unable to open output file '%s'.", _outFilePath);
glslopt_cleanup(ctx);
return false;
}
Stream stream(out);
const char* profile = _cmdLine.findOption('p');
if (NULL == profile)
{
stream.write("#ifdef GL_ES\n");
stream.write("precision highp float;\n");
stream.write("#endif // GL_ES\n\n");
_stream.write("#ifdef GL_ES\n");
_stream.write("precision highp float;\n");
_stream.write("#endif // GL_ES\n\n");
}
else
{
stream.writef("#version %s\n\n", profile);
_stream.writef("#version %s\n\n", profile);
}
stream.write(optimizedShader, strlen(optimizedShader) );
_stream.write(optimizedShader, strlen(optimizedShader) );
uint8_t nul = 0;
stream.write(nul);
stream.close();
fclose(out);
_stream.write(nul);
glslopt_cleanup(ctx);
return true;
}
bool compileHLSLShader(CommandLine& _cmdLine, const std::string& _code, const char* _outFilePath)
bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStreamWriter& _stream)
{
#if BX_PLATFORM_WINDOWS
const char* profile = _cmdLine.findOption('p');
@ -342,8 +518,8 @@ bool compileHLSLShader(CommandLine& _cmdLine, const std::string& _code, const ch
uint32_t optimization = 3;
if (_cmdLine.hasArg(optimization, 'O') )
{
optimization = bx::uint32_min(optimization, countof(s_optimizationLevel)-1);
flags |= s_optimizationLevel[optimization];
optimization = bx::uint32_min(optimization, countof(s_optimizationLevelDx9)-1);
flags |= s_optimizationLevelDx9[optimization];
}
else
{
@ -411,7 +587,7 @@ bool compileHLSLShader(CommandLine& _cmdLine, const std::string& _code, const ch
, constDesc.RegisterCount
);
ConstantType::Enum type = findConstantType(constDesc);
ConstantType::Enum type = findConstantTypeDx9(constDesc);
if (ConstantType::Count != type)
{
Uniform un;
@ -424,29 +600,20 @@ bool compileHLSLShader(CommandLine& _cmdLine, const std::string& _code, const ch
}
}
FILE* out = fopen(_outFilePath, "wb");
if (NULL == out)
{
fprintf(stderr, "Unable to open output file '%s'.", _outFilePath);
return false;
}
Stream stream(out, bigEndian);
uint16_t count = (uint16_t)uniforms.size();
stream.write(count);
_stream.write(count);
uint32_t fragmentBit = profile[0] == 'p' ? ConstantType::FragmentBit : 0;
for (UniformArray::const_iterator it = uniforms.begin(); it != uniforms.end(); ++it)
{
const Uniform& un = *it;
uint8_t nameSize = (uint8_t)un.name.size();
stream.write(nameSize);
stream.write(un.name.c_str(), nameSize);
stream.write<uint8_t>(un.type|fragmentBit);
stream.write(un.num);
stream.write(un.regIndex);
stream.write(un.regCount);
_stream.write(nameSize);
_stream.write(un.name.c_str(), nameSize);
_stream.write<uint8_t>(un.type|fragmentBit);
_stream.write(un.num);
_stream.write(un.regIndex);
_stream.write(un.regCount);
BX_TRACE("%s, %s, %d, %d, %d"
, un.name.c_str()
@ -458,12 +625,10 @@ bool compileHLSLShader(CommandLine& _cmdLine, const std::string& _code, const ch
}
uint16_t shaderSize = (uint16_t)code->GetBufferSize();
stream.write(shaderSize);
stream.write(code->GetBufferPointer(), shaderSize);
_stream.write(shaderSize);
_stream.write(code->GetBufferPointer(), shaderSize);
uint8_t nul = 0;
stream.write(nul);
stream.close();
fclose(out);
_stream.write(nul);
if (NULL != code)
{
@ -487,6 +652,231 @@ bool compileHLSLShader(CommandLine& _cmdLine, const std::string& _code, const ch
#endif // BX_PLATFORM_WINDOWS
}
bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStreamWriter& _stream)
{
#if BX_PLATFORM_WINDOWS
const char* profile = _cmdLine.findOption('p');
if (NULL == profile)
{
printf("Shader profile must be specified.\n");
return false;
}
bool bigEndian = _cmdLine.hasArg('\0', "xbox360");
uint32_t flags = D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY;
flags |= _cmdLine.hasArg('\0', "debug") ? D3DCOMPILE_DEBUG : 0;
flags |= _cmdLine.hasArg('\0', "avoid-flow-control") ? D3DCOMPILE_AVOID_FLOW_CONTROL : 0;
flags |= _cmdLine.hasArg('\0', "no-preshader") ? D3DCOMPILE_NO_PRESHADER : 0;
flags |= _cmdLine.hasArg('\0', "partial-precision") ? D3DCOMPILE_PARTIAL_PRECISION : 0;
flags |= _cmdLine.hasArg('\0', "prefer-flow-control") ? D3DCOMPILE_PREFER_FLOW_CONTROL : 0;
flags |= _cmdLine.hasArg('\0', "backwards-compatibility") ? D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY : 0;
bool werror = _cmdLine.hasArg('\0', "Werror");
if (werror)
{
flags |= D3DCOMPILE_WARNINGS_ARE_ERRORS;
}
uint32_t optimization = 3;
if (_cmdLine.hasArg(optimization, 'O') )
{
optimization = bx::uint32_min(optimization, countof(s_optimizationLevelDx11)-1);
flags |= s_optimizationLevelDx11[optimization];
}
else
{
flags |= D3DCOMPILE_SKIP_OPTIMIZATION;
}
BX_TRACE("Profile: %s", profile);
BX_TRACE("Flags: 0x%08x", flags);
BX_TRACE("Big Endian: %s", bigEndian?"true":"false");
ID3DBlob* code;
ID3DBlob* errorMsg;
HRESULT hr = D3DCompile(_code.c_str()
, _code.size()
, NULL
, NULL
, NULL
, "main"
, profile
, flags
, 0
, &code
, &errorMsg
);
if (FAILED(hr)
|| werror && NULL != errorMsg)
{
printCode(_code.c_str() );
fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x %s\n", hr, errorMsg->GetBufferPointer() );
return false;
}
UniformArray uniforms;
ID3D11ShaderReflection* reflect = NULL;
hr = D3DReflect(code->GetBufferPointer()
, code->GetBufferSize()
, IID_ID3D11ShaderReflection
, (void**)&reflect
);
if (FAILED(hr) )
{
fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x\n", hr);
return false;
}
D3D11_SHADER_DESC desc;
hr = reflect->GetDesc(&desc);
if (FAILED(hr) )
{
fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x\n", hr);
return false;
}
BX_TRACE("Creator: %s 0x%08x", desc.Creator, desc.Version);
BX_TRACE("Num constant buffers: %d", desc.ConstantBuffers);
BX_TRACE("# cl ty RxC S By Name");
// bx::HashMurmur2A hash;
// hash.begin();
BX_TRACE("Input:");
for (uint32_t ii = 0; ii < desc.InputParameters; ++ii)
{
D3D11_SIGNATURE_PARAMETER_DESC spd;
reflect->GetInputParameterDesc(ii, &spd);
BX_TRACE("\t%2d: %s%d, %d, %d", ii, spd.SemanticName, spd.SemanticIndex, spd.SystemValueType, spd.ComponentType);
// hash.add(inputSignature->GetBufferPointer(), inputSignature->GetBufferSize() );
}
BX_TRACE("Output:");
for (uint32_t ii = 0; ii < desc.OutputParameters; ++ii)
{
D3D11_SIGNATURE_PARAMETER_DESC spd;
reflect->GetOutputParameterDesc(ii, &spd);
BX_TRACE("\t%2d: %s%d, %d, %d", ii, spd.SemanticName, spd.SemanticIndex, spd.SystemValueType, spd.ComponentType);
// hash.add(inputSignature->GetBufferPointer(), inputSignature->GetBufferSize() );
}
// uint32_t inputSignatureHash = hash.end();
uint16_t size = 0;
for (uint32_t ii = 0; ii < bx::uint32_min(1, desc.ConstantBuffers); ++ii)
{
ID3D11ShaderReflectionConstantBuffer* cbuffer = reflect->GetConstantBufferByIndex(ii);
D3D11_SHADER_BUFFER_DESC bufferDesc;
hr = cbuffer->GetDesc(&bufferDesc);
size = (uint16_t)bufferDesc.Size;
if (SUCCEEDED(hr) )
{
BX_TRACE("%s, %d, vars %d, size %d"
, bufferDesc.Name
, bufferDesc.Type
, bufferDesc.Variables
, bufferDesc.Size
);
for (uint32_t jj = 0; jj < bufferDesc.Variables; ++jj)
{
ID3D11ShaderReflectionVariable* var = cbuffer->GetVariableByIndex(jj);
ID3D11ShaderReflectionType* type = var->GetType();
D3D11_SHADER_VARIABLE_DESC varDesc;
hr = var->GetDesc(&varDesc);
if (SUCCEEDED(hr) )
{
D3D11_SHADER_TYPE_DESC constDesc;
hr = type->GetDesc(&constDesc);
if (SUCCEEDED(hr) )
{
ConstantType::Enum type = findConstantTypeDx11(constDesc, varDesc.Size);
if (ConstantType::Count != type
&& 0 != (varDesc.uFlags & D3D10_SVF_USED) )
{
Uniform un;
un.name = varDesc.Name;
un.type = type;
un.num = constDesc.Elements;
un.regIndex = varDesc.StartOffset;
un.regCount = varDesc.Size;
uniforms.push_back(un);
BX_TRACE("\t%s, %d, size %d, flags 0x%08x, %d"
, varDesc.Name
, varDesc.StartOffset
, varDesc.Size
, varDesc.uFlags
, type
);
}
}
}
}
}
}
uint16_t count = (uint16_t)uniforms.size();
_stream.write(count);
_stream.write(size);
uint32_t fragmentBit = profile[0] == 'p' ? ConstantType::FragmentBit : 0;
for (UniformArray::const_iterator it = uniforms.begin(); it != uniforms.end(); ++it)
{
const Uniform& un = *it;
uint8_t nameSize = (uint8_t)un.name.size();
_stream.write(nameSize);
_stream.write(un.name.c_str(), nameSize);
_stream.write<uint8_t>(un.type|fragmentBit);
_stream.write(un.num);
_stream.write(un.regIndex);
_stream.write(un.regCount);
BX_TRACE("%s, %s, %d, %d, %d"
, un.name.c_str()
, s_constantTypeName[un.type]
, un.num
, un.regIndex
, un.regCount
);
}
uint16_t shaderSize = (uint16_t)code->GetBufferSize();
_stream.write(shaderSize);
_stream.write(code->GetBufferPointer(), shaderSize);
uint8_t nul = 0;
_stream.write(nul);
if (NULL != reflect)
{
reflect->Release();
}
if (NULL != code)
{
code->Release();
}
if (NULL != errorMsg)
{
errorMsg->Release();
}
return true;
#else
fprintf(stderr, "HLSL compiler is not supported on this platform.\n");
return false;
#endif // BX_PLATFORM_WINDOWS
}
struct Preprocessor
{
Preprocessor(const char* _filePath)
@ -653,6 +1043,20 @@ struct Preprocessor
uint32_t m_fgetsPos;
};
const char* baseName(const char* _filePath)
{
const char* bs = strrchr(_filePath, '\\');
const char* fs = strrchr(_filePath, '/');
const char* column = strrchr(_filePath, ':');
const char* basename = std::max(std::max(bs, fs), column);
if (NULL != basename)
{
return basename+1;
}
return _filePath;
}
// OpenGL #version Features Direct3D Features Shader Model
// 2.1 120 vf 9.0 vf 2.0
// 3.0 130
@ -695,6 +1099,33 @@ int main(int _argc, const char* _argv[])
return EXIT_FAILURE;
}
const char* bin2c = NULL;
if (cmdLine.hasArg("bin2c") )
{
bin2c = cmdLine.findOption("bin2c");
if (NULL == bin2c)
{
bin2c = baseName(outFilePath);
uint32_t len = strlen(bin2c);
char* temp = (char*)alloca(len+1);
for (char *out = temp; *bin2c != '\0';)
{
char ch = *bin2c++;
if (isalnum(ch) )
{
*out++ = ch;
}
else
{
*out++ = '_';
}
}
temp[len] = '\0';
bin2c = temp;
}
}
bool depends = cmdLine.hasArg("depends");
bool preprocessOnly = cmdLine.hasArg("preprocess");
@ -782,14 +1213,14 @@ int main(int _argc, const char* _argv[])
if (preprocessOnly)
{
FILE* out = fopen(outFilePath, "wb");
if (NULL == out)
FileWriter stream(outFilePath);
if (!stream.open() )
{
fprintf(stderr, "Unable to open output file '%s'.", outFilePath);
return false;
}
Stream stream(out);
if (glsl)
{
const char* profile = cmdLine.findOption('p');
@ -806,20 +1237,50 @@ int main(int _argc, const char* _argv[])
}
stream.write(preprocessor.m_preprocessed.c_str(), preprocessor.m_preprocessed.size() );
stream.close();
fclose(out);
return EXIT_SUCCESS;
}
bool compiled = false;
if (glsl)
{
compiled = compileGLSLShader(cmdLine, preprocessor.m_preprocessed, outFilePath);
}
else
{
compiled = compileHLSLShader(cmdLine, preprocessor.m_preprocessed, outFilePath);
IStreamWriter* stream = NULL;
if (NULL != bin2c)
{
stream = new Bin2cStream(outFilePath, bin2c);
}
else
{
stream = new FileWriter(outFilePath);
}
if (!stream->open() )
{
fprintf(stderr, "Unable to open output file '%s'.", outFilePath);
return false;
}
if (glsl)
{
compiled = compileGLSLShader(cmdLine, preprocessor.m_preprocessed, *stream);
}
else
{
const char* profile = cmdLine.findOption('p');
if (0 == strncmp(&profile[1], "s_4", 3)
|| 0 == strncmp(&profile[1], "s_5", 3) )
{
compiled = compileHLSLShaderDx11(cmdLine, preprocessor.m_preprocessed, *stream);
}
else
{
compiled = compileHLSLShaderDx9(cmdLine, preprocessor.m_preprocessed, *stream);
}
}
stream->close();
delete stream;
}
if (compiled
@ -827,19 +1288,18 @@ int main(int _argc, const char* _argv[])
{
std::string ofp = outFilePath;
ofp += ".d";
FILE* out = fopen(ofp.c_str(), "wb");
if (NULL != out)
FileWriter stream(ofp.c_str() );
if (stream.open() )
{
Stream stream(out);
stream.write(outFilePath);
stream.write(":");
stream.write(preprocessor.m_depends.c_str() );
stream.write("\n");
stream.close();
fclose(out);
}
return EXIT_SUCCESS;
}
return EXIT_SUCCESS;
}
fprintf(stderr, "Failed to build shader.\n");