diff --git a/src/bgfx.cpp b/src/bgfx.cpp index af6479e42..c79e73070 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -37,7 +37,7 @@ namespace bgfx # define BGFX_RENDER_THREAD() #endif // BGFX_CONFIG_MULTITHREADED - void fatalStub(bgfx::Fatal::Enum _code, const char* _str) + void fatalStub(Fatal::Enum _code, const char* _str) { BX_TRACE("0x%08x: %s", _code, _str); BX_UNUSED(_code); @@ -71,7 +71,7 @@ namespace bgfx static BX_THREAD uint32_t s_threadIndex = 0; static Context s_ctx; - void fatal(bgfx::Fatal::Enum _code, const char* _format, ...) + void fatal(Fatal::Enum _code, const char* _format, ...) { char temp[8192]; @@ -198,10 +198,10 @@ namespace bgfx void TextVideoMemBlitter::init() { m_decl.begin(); - m_decl.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float); - 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.add(Attrib::Position, 3, AttribType::Float); + m_decl.add(Attrib::Color0, 4, AttribType::Uint8, true); + m_decl.add(Attrib::Color1, 4, AttribType::Uint8, true); + m_decl.add(Attrib::TexCoord0, 2, AttribType::Float); m_decl.end(); uint16_t width = 2048; @@ -209,7 +209,7 @@ namespace bgfx uint8_t bpp = 1; uint32_t pitch = width*bpp; - const bgfx::Memory* mem; + const Memory* mem; mem = alloc(pitch*height+16); @@ -228,32 +228,32 @@ 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_dx9)+1); + mem = 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); + mem = alloc(sizeof(vs_debugfont_dx11)+1); memcpy(mem->data, vs_debugfont_dx11, mem->size-1); #else - mem = bgfx::alloc(sizeof(vs_debugfont_glsl)+1); + mem = alloc(sizeof(vs_debugfont_glsl)+1); memcpy(mem->data, vs_debugfont_glsl, mem->size-1); #endif // BGFX_CONFIG_RENDERER_ mem->data[mem->size-1] = '\0'; - bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem); + VertexShaderHandle vsh = createVertexShader(mem); #if BGFX_CONFIG_RENDERER_DIRECT3D9 - mem = bgfx::alloc(sizeof(fs_debugfont_dx9)+1); + mem = 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); + mem = alloc(sizeof(fs_debugfont_dx11)+1); memcpy(mem->data, fs_debugfont_dx11, mem->size-1); #else - mem = bgfx::alloc(sizeof(fs_debugfont_glsl)+1); + mem = alloc(sizeof(fs_debugfont_glsl)+1); memcpy(mem->data, fs_debugfont_glsl, mem->size-1); #endif // BGFX_CONFIG_RENDERER_ mem->data[mem->size-1] = '\0'; - bgfx::FragmentShaderHandle fsh = bgfx::createFragmentShader(mem); + FragmentShaderHandle fsh = createFragmentShader(mem); - m_material = bgfx::createMaterial(vsh, fsh); + m_material = createMaterial(vsh, fsh); m_vb = s_ctx.createTransientVertexBuffer(numBatchVertices*m_decl.m_stride, &m_decl); m_ib = s_ctx.createTransientIndexBuffer(numBatchIndices*2); @@ -261,7 +261,7 @@ namespace bgfx void TextVideoMemBlitter::blit(const TextVideoMem& _mem) { - struct FontVertex + struct Vertex { float m_x; float m_y; @@ -307,7 +307,7 @@ namespace bgfx for (;yy < _mem.m_height;) { - FontVertex* vertex = (FontVertex*)m_vb->data; + Vertex* vertex = (Vertex*)m_vb->data; uint16_t* indices = (uint16_t*)m_ib->data; uint32_t startVertex = 0; uint32_t numIndices = 0; @@ -328,7 +328,7 @@ namespace bgfx uint32_t fg = palette[attr&0xf]; uint32_t bg = palette[(attr>>4)&0xf]; - FontVertex vert[4] = + Vertex vert[4] = { { (xx )*8.0f, (yy )*fontHeight, 0.0f, fg, bg, (ch )*8.0f*texelWidth - texelWidthHalf, utop }, { (xx+1)*8.0f, (yy )*fontHeight, 0.0f, fg, bg, (ch+1)*8.0f*texelWidth - texelWidthHalf, utop }, @@ -365,6 +365,41 @@ namespace bgfx } } + void ClearQuad::init() + { +#if BGFX_CONFIG_RENDERER_DIRECT3D11 + m_decl.begin(); + m_decl.add(Attrib::Position, 3, AttribType::Float); + m_decl.add(Attrib::Color0, 4, AttribType::Uint8, true); + m_decl.end(); + + const Memory* mem; + + mem = alloc(sizeof(vs_clear_dx11)+1); + memcpy(mem->data, vs_clear_dx11, mem->size-1); + VertexShaderHandle vsh = createVertexShader(mem); + + mem = alloc(sizeof(fs_clear_dx11)+1); + memcpy(mem->data, fs_clear_dx11, mem->size-1); + FragmentShaderHandle fsh = createFragmentShader(mem); + + m_material = createMaterial(vsh, fsh); + + m_vb = s_ctx.createTransientVertexBuffer(4*m_decl.m_stride, &m_decl); + + mem = alloc(6*sizeof(uint16_t) ); + uint16_t* indices = (uint16_t*)mem->data; + indices[0] = 0; + indices[1] = 1; + indices[2] = 2; + indices[3] = 2; + indices[4] = 3; + indices[5] = 0; + m_ib = s_ctx.createIndexBuffer(mem); + +#endif // BGFX_CONFIG_RENDERER_DIRECT3D11 + } + static const char* s_predefinedName[PredefinedUniform::Count] = { "u_viewRect", @@ -691,11 +726,18 @@ namespace bgfx memset(m_seq, 0, sizeof(m_seq) ); memset(m_seqMask, 0, sizeof(m_seqMask) ); + for (uint32_t ii = 0; ii < countof(m_rect); ++ii) + { + m_rect[ii].m_width = 1; + m_rect[ii].m_height = 1; + } + gameSemPost(); getCommandBuffer(CommandBuffer::RendererInit); m_textVideoMemBlitter.init(); + m_clearQuad.init(); m_submit->m_transientVb = createTransientVertexBuffer(BGFX_CONFIG_TRANSIENT_VERTEX_BUFFER_SIZE); m_submit->m_transientIb = createTransientIndexBuffer(BGFX_CONFIG_TRANSIENT_INDEX_BUFFER_SIZE); diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 6efd9cfe2..29d84ef51 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -47,14 +47,15 @@ extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format #define BX_NAMESPACE 1 #include -#include #include #include +#include +#include #include #include +#include #include #include -#include #if BX_PLATFORM_WINDOWS # include @@ -144,13 +145,29 @@ namespace stl = std; namespace bgfx { + struct Clear + { + uint32_t m_rgba; + float m_depth; + uint8_t m_stencil; + uint8_t m_flags; + }; + + struct Rect + { + uint16_t m_x; + uint16_t m_y; + uint16_t m_width; + uint16_t m_height; + }; + extern const uint32_t g_constantTypeSize[ConstantType::Count]; 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 fatal(Fatal::Enum _code, const char* _format, ...); 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); @@ -161,6 +178,11 @@ namespace bgfx return _a > _b ? _b : _a; } + inline uint32_t uint16_max(uint16_t _a, uint16_t _b) + { + return _a < _b ? _b : _a; + } + inline uint32_t hash(const void* _data, uint32_t _size) { HashMurmur2A murmur; @@ -313,13 +335,24 @@ namespace bgfx void setup(); void render(uint32_t _numIndices); - bgfx::TextureHandle m_texture; + TextureHandle m_texture; TransientVertexBuffer* m_vb; TransientIndexBuffer* m_ib; - bgfx::VertexDecl m_decl; - bgfx::MaterialHandle m_material; + VertexDecl m_decl; + MaterialHandle m_material; }; + struct ClearQuad + { + void init(); + void clear(const Rect& _rect, const Clear& _clear); + + TransientVertexBuffer* m_vb; + IndexBufferHandle m_ib; + VertexDecl m_decl; + MaterialHandle m_material; + }; + struct PredefinedUniform { enum Enum @@ -583,22 +616,6 @@ namespace bgfx uint8_t m_trans; }; - struct Clear - { - uint32_t m_rgba; - float m_depth; - uint8_t m_stencil; - uint8_t m_flags; - }; - - struct Rect - { - uint16_t m_x; - uint16_t m_y; - uint16_t m_width; - uint16_t m_height; - }; - BX_ALIGN_STRUCT_16(struct) Matrix4 { float val[16]; @@ -876,14 +893,14 @@ namespace bgfx m_instanceDataStride = 0; m_numInstances = 1; m_num = 1; - m_vertexBuffer.idx = bgfx::invalidHandle; - m_vertexDecl.idx = bgfx::invalidHandle; - m_indexBuffer.idx = bgfx::invalidHandle; - m_instanceDataBuffer.idx = bgfx::invalidHandle; + m_vertexBuffer.idx = invalidHandle; + m_vertexDecl.idx = invalidHandle; + m_indexBuffer.idx = invalidHandle; + m_instanceDataBuffer.idx = invalidHandle; for (uint32_t ii = 0; ii < BGFX_STATE_TEX_COUNT; ++ii) { - m_sampler[ii].m_idx = bgfx::invalidHandle; + m_sampler[ii].m_idx = invalidHandle; m_sampler[ii].m_flags = BGFX_SAMPLER_TEXTURE; } } @@ -1122,7 +1139,7 @@ namespace bgfx sampler.m_idx = _handle.idx; sampler.m_flags = BGFX_SAMPLER_TEXTURE; - if (bgfx::invalidHandle != _sampler.idx) + if (invalidHandle != _sampler.idx) { uint32_t stage = _stage; setUniform(_sampler, &stage); @@ -1136,7 +1153,7 @@ namespace bgfx sampler.m_idx = _handle.idx; sampler.m_flags = _depth ? BGFX_SAMPLER_RENDERTARGET_DEPTH : BGFX_SAMPLER_RENDERTARGET_COLOR; - if (bgfx::invalidHandle != _sampler.idx) + if (invalidHandle != _sampler.idx) { uint32_t stage = _stage; setUniform(_sampler, &stage); @@ -1607,7 +1624,7 @@ namespace bgfx { VertexDeclHandle declHandle = m_declRef.find(_decl.m_hash); - if (bgfx::invalidHandle == declHandle.idx) + if (invalidHandle == declHandle.idx) { VertexDeclHandle temp = { m_vertexDeclHandle.alloc() }; declHandle = temp; @@ -1636,7 +1653,7 @@ namespace bgfx void destroyVertexBuffer(VertexBufferHandle _handle) { VertexDeclHandle declHandle = m_declRef.release(_handle); - if (bgfx::invalidHandle != declHandle.idx) + if (invalidHandle != declHandle.idx) { CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexDecl); cmdbuf.write(declHandle); @@ -1770,7 +1787,7 @@ namespace bgfx DynamicVertexBuffer& dvb = m_dynamicVertexBuffers[_handle.idx]; VertexDeclHandle declHandle = m_declRef.release(dvb.m_handle); - if (bgfx::invalidHandle != declHandle.idx) + if (invalidHandle != declHandle.idx) { CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexDecl); cmdbuf.write(declHandle); @@ -1864,7 +1881,7 @@ namespace bgfx TransientVertexBuffer& dvb = *m_submit->m_transientVb; - if (bgfx::invalidHandle == declHandle.idx) + if (invalidHandle == declHandle.idx) { VertexDeclHandle temp = { m_vertexDeclHandle.alloc() }; declHandle = temp; @@ -1947,7 +1964,7 @@ namespace bgfx // // MaterialHandle handle = m_materialRef.find(hash); // -// if (bgfx::invalidHandle != handle.idx) +// if (invalidHandle != handle.idx) // { // return handle; // } @@ -2080,8 +2097,8 @@ namespace bgfx Rect& rect = m_rect[_id]; rect.m_x = _x; rect.m_y = _y; - rect.m_width = _width; - rect.m_height = _height; + rect.m_width = uint16_max(_width, 1); + rect.m_height = uint16_max(_height, 1); } void setViewRectMask(uint32_t _viewMask, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) @@ -2785,6 +2802,7 @@ namespace bgfx uint32_t m_debug; TextVideoMemBlitter m_textVideoMemBlitter; + ClearQuad m_clearQuad; #if BX_PLATFORM_WINDOWS struct Window diff --git a/src/charset.h b/src/charset.h index 323ab5233..dcdde8aac 100644 --- a/src/charset.h +++ b/src/charset.h @@ -531,3 +531,6 @@ static const uint8_t vga8x16[256*16] = #include "vs_debugfont_dx11.bin.h" #include "fs_debugfont_dx11.bin.h" + +#include "vs_clear_dx11.bin.h" +#include "fs_clear_dx11.bin.h" diff --git a/src/fs_clear_dx11.bin.h b/src/fs_clear_dx11.bin.h new file mode 100644 index 000000000..e07107059 --- /dev/null +++ b/src/fs_clear_dx11.bin.h @@ -0,0 +1,37 @@ +static const uint8_t fs_clear_dx11[539] = +{ + 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x44, 0x58, 0x42, 0x43, 0xda, 0x0f, 0xc3, 0x91, 0x70, 0x6f, // ......DXBC....po + 0xd4, 0x7b, 0xeb, 0xe0, 0x21, 0x07, 0x79, 0xd8, 0x54, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x14, 0x02, // .{..!.y.T....... + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, // ......4......... + 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x70, 0x00, // ..4...x...RDEFp. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, // ..............<. + 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x00, 0x91, 0x00, 0x00, 0x3c, 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, 0x4d, 0x69, // ..$...........Mi + 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, // crosoft (R) HLSL + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, // Shader Compiler + 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, // 9.29.952.3111.. + 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, // ..ISGNL......... + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, // ..8............. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, // ..........D..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, // ................ + 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, // ..SV_POSITION.CO + 0x4c, 0x4f, 0x52, 0x00, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, // LOR...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, 0x3c, 0x00, // _TARGET...SHEX<. + 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x62, 0x10, // ..P.......j...b. + 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, // ..........e.... + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, // ......6.... .... + 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, // ..F.......>...ST + 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // AT.............. + 0x00, 0x00, 0x02, 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, 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, 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, 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, // ........... +}; diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 3e95a5fd5..17f836136 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -67,6 +67,24 @@ namespace bgfx D3D11_TEXTURE_ADDRESS_CLAMP, }; + struct TextureFormatInfo + { + DXGI_FORMAT m_fmt; + uint8_t m_bpp; + }; + + static const TextureFormatInfo s_textureFormat[TextureFormat::Count] = + { + { DXGI_FORMAT_BC1_UNORM, 1 }, + { DXGI_FORMAT_BC2_UNORM, 1 }, + { DXGI_FORMAT_BC3_UNORM, 1 }, + { DXGI_FORMAT_UNKNOWN, 0 }, + { DXGI_FORMAT_R8_UNORM, 1 }, + { DXGI_FORMAT_R8G8B8A8_UNORM, 4 }, + { DXGI_FORMAT_R8G8B8A8_UNORM, 4 }, + { DXGI_FORMAT_R16G16B16A16_FLOAT, 8 }, + }; + static const D3D11_INPUT_ELEMENT_DESC s_attrib[Attrib::Count] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 }, @@ -222,16 +240,16 @@ namespace bgfx void init() { m_d3d11dll = LoadLibrary("d3d11.dll"); - BGFX_FATAL(NULL != m_d3d11dll, bgfx::Fatal::D3D11_UnableToInitialize, "Failed to load d3d11.dll."); + BGFX_FATAL(NULL != m_d3d11dll, Fatal::D3D11_UnableToInitialize, "Failed to load d3d11.dll."); m_dxgidll = LoadLibrary("dxgi.dll"); - BGFX_FATAL(NULL != m_dxgidll, bgfx::Fatal::D3D11_UnableToInitialize, "Failed to load dxgi.dll."); + BGFX_FATAL(NULL != m_dxgidll, Fatal::D3D11_UnableToInitialize, "Failed to load dxgi.dll."); PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN d3D11CreateDeviceAndSwapChain = (PFN_D3D11_CREATE_DEVICE_AND_SWAP_CHAIN)GetProcAddress(m_d3d11dll, "D3D11CreateDeviceAndSwapChain"); - BGFX_FATAL(NULL != d3D11CreateDeviceAndSwapChain, bgfx::Fatal::D3D11_UnableToInitialize, "Function D3D11CreateDeviceAndSwapChain not found."); + BGFX_FATAL(NULL != d3D11CreateDeviceAndSwapChain, Fatal::D3D11_UnableToInitialize, "Function D3D11CreateDeviceAndSwapChain not found."); CreateDXGIFactoryFn createDXGIFactory = (CreateDXGIFactoryFn)GetProcAddress(m_dxgidll, "CreateDXGIFactory"); - BGFX_FATAL(NULL != createDXGIFactory, bgfx::Fatal::D3D11_UnableToInitialize, "Function CreateDXGIFactory not found."); + BGFX_FATAL(NULL != createDXGIFactory, Fatal::D3D11_UnableToInitialize, "Function CreateDXGIFactory not found."); HRESULT hr; // IDXGIFactory* factory; @@ -276,7 +294,7 @@ namespace bgfx , &featureLevel , &m_deviceCtx ); - BGFX_FATAL(SUCCEEDED(hr), bgfx::Fatal::D3D11_UnableToInitialize, "Unable to create Direct3D11 device."); + BGFX_FATAL(SUCCEEDED(hr), Fatal::D3D11_UnableToInitialize, "Unable to create Direct3D11 device."); ID3D11Texture2D* color; DX_CHECK(m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&color) ); @@ -470,6 +488,8 @@ namespace bgfx void clear(const Rect& _rect, const Clear& _clear) { + + // DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE) ); // DX_CHECK(s_renderCtx.m_device->SetScissorRect(&rc) ); @@ -593,6 +613,8 @@ namespace bgfx m_deviceCtx->RSSetState(rs); } + + void saveScreenShot(Memory* _mem) { ID3D11Texture2D* backBuffer; @@ -845,7 +867,7 @@ namespace bgfx ID3D11DeviceContext* deviceCtx = s_renderCtx.m_deviceCtx; uint32_t width = s_renderCtx.m_scd.BufferDesc.Width; - uint32_t height = s_renderCtx.m_scd.BufferDesc.Width; + uint32_t height = s_renderCtx.m_scd.BufferDesc.Height; RenderTargetHandle rt = BGFX_INVALID_HANDLE; s_renderCtx.setRenderTarget(rt, false); @@ -868,16 +890,6 @@ namespace bgfx s_renderCtx.setDepthStencilState(state); s_renderCtx.setRasterizerState(state); -#if 0 - DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZENABLE, FALSE) ); - DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZFUNC, D3DCMP_ALWAYS) ); - 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(s_renderCtx.m_device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE) ); - DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID) ); -#endif // 0 - Material& material = s_renderCtx.m_materials[m_material.idx]; s_renderCtx.m_currentMaterial = &material; deviceCtx->VSSetShader( (ID3D11VertexShader*)material.m_vsh->m_ptr, NULL, 0); @@ -920,6 +932,93 @@ namespace bgfx deviceCtx->DrawIndexed(_numIndices, 0, 0); } + void ClearQuad::clear(const Rect& _rect, const Clear& _clear) + { + uint32_t width = s_renderCtx.m_scd.BufferDesc.Width; + uint32_t height = s_renderCtx.m_scd.BufferDesc.Height; + + if (0 == _rect.m_x + && 0 == _rect.m_y + && width == _rect.m_width + && height == _rect.m_height) + { + s_renderCtx.clear(_rect, _clear); + } + else + { + ID3D11DeviceContext* deviceCtx = s_renderCtx.m_deviceCtx; + + D3D11_VIEWPORT vp; + vp.TopLeftX = _rect.m_x; + vp.TopLeftY = _rect.m_y; + vp.Width = (float)_rect.m_width; + vp.Height = (float)_rect.m_height; + vp.MinDepth = 0.0f; + vp.MaxDepth = 1.0f; + deviceCtx->RSSetViewports(1, &vp); + + uint64_t state = 0; + state |= _clear.m_flags & BGFX_CLEAR_COLOR_BIT ? BGFX_STATE_RGB_WRITE|BGFX_STATE_ALPHA_WRITE : 0; + state |= _clear.m_flags & BGFX_CLEAR_DEPTH_BIT ? BGFX_STATE_DEPTH_WRITE : 0; + + s_renderCtx.setBlendState(state); + s_renderCtx.setDepthStencilState(state); + s_renderCtx.setRasterizerState(state); + + Material& material = s_renderCtx.m_materials[m_material.idx]; + s_renderCtx.m_currentMaterial = &material; + deviceCtx->VSSetShader( (ID3D11VertexShader*)material.m_vsh->m_ptr, NULL, 0); + deviceCtx->VSSetConstantBuffers(0, 0, NULL); + deviceCtx->PSSetShader( (ID3D11PixelShader*)material.m_fsh->m_ptr, NULL, 0); + deviceCtx->PSSetConstantBuffers(0, 0, NULL); + + VertexBuffer& vb = s_renderCtx.m_vertexBuffers[m_vb->handle.idx]; + VertexDecl& vertexDecl = s_renderCtx.m_vertexDecls[m_vb->decl.idx]; + uint32_t stride = vertexDecl.m_stride; + uint32_t offset = 0; + + { + struct Vertex + { + float m_x; + float m_y; + float m_z; + uint32_t m_abgr; + } * vertex = (Vertex*)m_vb->data; + + vertex->m_x = -1.0f; + vertex->m_y = -1.0f; + vertex->m_z = _clear.m_depth; + vertex->m_abgr = rand(); //bx::endianSwap(_clear.m_rgba); + vertex++; + vertex->m_x = 1.0f; + vertex->m_y = -1.0f; + vertex->m_z = _clear.m_depth; + vertex->m_abgr = bx::endianSwap(_clear.m_rgba); + vertex++; + vertex->m_x = 1.0f; + vertex->m_y = 1.0f; + vertex->m_z = _clear.m_depth; + vertex->m_abgr = bx::endianSwap(_clear.m_rgba); + vertex++; + vertex->m_x = -1.0f; + vertex->m_y = 1.0f; + vertex->m_z = _clear.m_depth; + vertex->m_abgr = bx::endianSwap(_clear.m_rgba); + } + + s_renderCtx.m_vertexBuffers[m_vb->handle.idx].update(0, 4*m_decl.m_stride, m_vb->data); + deviceCtx->IASetVertexBuffers(0, 1, &vb.m_ptr, &stride, &offset); + s_renderCtx.setInputLayout(vertexDecl, material); + + IndexBuffer& ib = s_renderCtx.m_indexBuffers[m_ib.idx]; + deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0); + + deviceCtx->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + deviceCtx->DrawIndexed(6, 0, 0); + } + } + void Shader::create(bool _fragment, const Memory* _mem) { m_constantBuffer = ConstantBuffer::create(1024); @@ -1072,16 +1171,97 @@ namespace bgfx if (dds.m_cubeMap) { + m_type = TextureCube; // createCubeTexture(dds.m_width, dds.m_numMips, s_textureFormat[dds.m_type].m_fmt); } else if (dds.m_depth > 1) { + m_type = Texture3D; // createVolumeTexture(dds.m_width, dds.m_height, dds.m_depth, dds.m_numMips, s_textureFormat[dds.m_type].m_fmt); } else { + m_type = Texture2D; // createTexture(dds.m_width, dds.m_height, dds.m_numMips, s_textureFormat[dds.m_type].m_fmt); } + + D3D11_TEXTURE2D_DESC desc; + desc.Width = dds.m_width; + desc.Height = dds.m_height; + desc.MipLevels = dds.m_numMips; + desc.ArraySize = 1; + desc.Format = s_textureFormat[dds.m_type].m_fmt; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + uint32_t numSrd = dds.m_numMips*(dds.m_cubeMap ? 6 : 1); + D3D11_SUBRESOURCE_DATA* srd = (D3D11_SUBRESOURCE_DATA*)alloca(numSrd*sizeof(D3D11_SUBRESOURCE_DATA) ); + + uint32_t kk = 0; + + if (decompress + || TextureFormat::Unknown < dds.m_type) + { + for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side) + { + uint32_t width = dds.m_width; + uint32_t height = dds.m_height; + uint32_t depth = dds.m_depth; + + for (uint32_t lod = 0, num = dds.m_numMips; lod < num; ++lod) + { + width = uint32_max(1, width); + height = uint32_max(1, height); + depth = uint32_max(1, depth); + + Mip mip; + if (getRawImageData(dds, side, lod, _mem, mip) ) + { + srd[kk].pSysMem = mip.m_data; + srd[kk].SysMemPitch = mip.m_width*mip.m_bpp; + srd[kk].SysMemSlicePitch = 0; + ++kk; + } + + width >>= 1; + height >>= 1; + depth >>= 1; + } + } + } + else + { + for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side) + { + for (uint32_t lod = 0, num = dds.m_numMips; lod < num; ++lod) + { + Mip mip; + if (getRawImageData(dds, 0, lod, _mem, mip) ) + { + srd[kk].pSysMem = mip.m_data; + srd[kk].SysMemPitch = mip.m_width*mip.m_bpp; + srd[kk].SysMemSlicePitch = 0; + ++kk; + } + } + } + } + + ID3D11Texture2D* texture; + DX_CHECK(s_renderCtx.m_device->CreateTexture2D(&desc, srd, &texture) ); + + D3D11_SHADER_RESOURCE_VIEW_DESC srv; + memset(&srv, 0, sizeof(srv) ); + srv.Format = s_textureFormat[dds.m_type].m_fmt; + srv.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + srv.Texture2D.MipLevels = dds.m_numMips; + DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(texture, &srv, &m_ptr) ); + + DX_RELEASE(texture, 0); } else { @@ -1380,7 +1560,7 @@ namespace bgfx } // DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_FILLMODE, m_render->m_debug&BGFX_DEBUG_WIREFRAME ? D3DFILL_WIREFRAME : D3DFILL_SOLID) ); - uint16_t materialIdx = bgfx::invalidHandle; + uint16_t materialIdx = invalidHandle; SortKey key; uint8_t view = 0xff; RenderTargetHandle rt = BGFX_INVALID_HANDLE; @@ -1414,7 +1594,7 @@ namespace bgfx currentState.m_flags = newFlags; view = key.m_view; - materialIdx = bgfx::invalidHandle; + materialIdx = invalidHandle; if (m_render->m_rt[view].idx != rt.idx) { @@ -1436,7 +1616,7 @@ namespace bgfx if (BGFX_CLEAR_NONE != clear.m_flags) { - s_renderCtx.clear(rect, clear); + m_clearQuad.clear(rect, clear); } s_renderCtx.setBlendState(BGFX_STATE_DEFAULT); @@ -1481,7 +1661,7 @@ namespace bgfx { materialIdx = key.m_material; - if (bgfx::invalidHandle == materialIdx) + if (invalidHandle == materialIdx) { s_renderCtx.m_currentMaterial = NULL; @@ -1504,7 +1684,7 @@ namespace bgfx constantsChanged = true; } - if (bgfx::invalidHandle != materialIdx) + if (invalidHandle != materialIdx) { Material& material = s_renderCtx.m_materials[materialIdx]; @@ -1641,7 +1821,7 @@ namespace bgfx || current.m_flags != sampler.m_flags || materialChanged) { - if (bgfx::invalidHandle != sampler.m_idx) + if (invalidHandle != sampler.m_idx) { switch (sampler.m_flags&BGFX_SAMPLER_TYPE_MASK) { @@ -1674,11 +1854,11 @@ namespace bgfx currentState.m_vertexBuffer = state.m_vertexBuffer; uint16_t handle = state.m_vertexBuffer.idx; - if (bgfx::invalidHandle != handle) + if (invalidHandle != handle) { const VertexBuffer& vb = s_renderCtx.m_vertexBuffers[handle]; - uint16_t decl = vb.m_decl.idx == bgfx::invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; + uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; const VertexDecl& vertexDecl = s_renderCtx.m_vertexDecls[decl]; uint32_t stride = vertexDecl.m_stride; uint32_t offset = 0; @@ -1714,7 +1894,7 @@ namespace bgfx currentState.m_indexBuffer = state.m_indexBuffer; uint16_t handle = state.m_indexBuffer.idx; - if (bgfx::invalidHandle != handle) + if (invalidHandle != handle) { const IndexBuffer& ib = s_renderCtx.m_indexBuffers[handle]; deviceCtx->IASetIndexBuffer(ib.m_ptr, DXGI_FORMAT_R16_UINT, 0); @@ -1725,13 +1905,13 @@ namespace bgfx } } - if (bgfx::invalidHandle != currentState.m_vertexBuffer.idx) + if (invalidHandle != currentState.m_vertexBuffer.idx) { uint32_t numVertices = state.m_numVertices; if (UINT32_C(0xffffffff) == numVertices) { const VertexBuffer& vb = s_renderCtx.m_vertexBuffers[currentState.m_vertexBuffer.idx]; - uint16_t decl = vb.m_decl.idx == bgfx::invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; + uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; const VertexDecl& vertexDecl = s_renderCtx.m_vertexDecls[decl]; numVertices = vb.m_size/vertexDecl.m_stride; } @@ -1741,7 +1921,7 @@ namespace bgfx uint32_t numInstances = 0; uint32_t numPrimsRendered = 0; - if (bgfx::invalidHandle != state.m_indexBuffer.idx) + if (invalidHandle != state.m_indexBuffer.idx) { if (BGFX_DRAW_WHOLE_INDEX_BUFFER == state.m_startIndex) { diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 894d8897a..a2bd43219 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -186,7 +186,7 @@ namespace bgfx m_params.BackBufferHeight = rect.bottom-rect.top; m_d3d9dll = LoadLibrary("d3d9.dll"); - BGFX_FATAL(NULL != m_d3d9dll, bgfx::Fatal::D3D9_UnableToCreateInterface, "Failed to load d3d9.dll."); + BGFX_FATAL(NULL != m_d3d9dll, Fatal::D3D9_UnableToCreateInterface, "Failed to load d3d9.dll."); m_D3DPERF_SetMarker = (D3DPERF_SetMarkerFunc)GetProcAddress(m_d3d9dll, "D3DPERF_SetMarker"); m_D3DPERF_BeginEvent = (D3DPERF_BeginEventFunc)GetProcAddress(m_d3d9dll, "D3DPERF_BeginEvent"); @@ -194,15 +194,15 @@ namespace bgfx #if BGFX_CONFIG_RENDERER_DIRECT3D9EX Direct3DCreate9ExFn direct3DCreate9Ex = (Direct3DCreate9ExFn)GetProcAddress(m_d3d9dll, "Direct3DCreate9Ex"); - BGFX_FATAL(NULL != direct3DCreate9Ex, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9Ex not found."); + BGFX_FATAL(NULL != direct3DCreate9Ex, Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9Ex not found."); direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d9); #else Direct3DCreate9Fn direct3DCreate9 = (Direct3DCreate9Fn)GetProcAddress(m_d3d9dll, "Direct3DCreate9"); - BGFX_FATAL(NULL != direct3DCreate9, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9 not found."); + BGFX_FATAL(NULL != direct3DCreate9, Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9 not found."); m_d3d9 = direct3DCreate9(D3D_SDK_VERSION); #endif // defined(D3D_DISABLE_9EX) - BGFX_FATAL(m_d3d9, bgfx::Fatal::D3D9_UnableToCreateInterface, "Unable to create Direct3D."); + BGFX_FATAL(m_d3d9, Fatal::D3D9_UnableToCreateInterface, "Unable to create Direct3D."); m_adapter = D3DADAPTER_DEFAULT; m_deviceType = D3DDEVTYPE_HAL; @@ -267,22 +267,22 @@ namespace bgfx #endif // BGFX_CONFIG_RENDERER_DIRECT3D9EX } - BGFX_FATAL(m_device, bgfx::Fatal::D3D9_UnableToCreateDevice, "Unable to create Direct3D9 device."); + BGFX_FATAL(m_device, Fatal::D3D9_UnableToCreateDevice, "Unable to create Direct3D9 device."); DX_CHECK(m_device->GetDeviceCaps(&m_caps) ); // For shit GPUs that can create DX9 device but can't do simple stuff. GTFO! - BGFX_FATAL( (D3DPTEXTURECAPS_SQUAREONLY & m_caps.TextureCaps) == 0, bgfx::Fatal::MinimumRequiredSpecs, "D3DPTEXTURECAPS_SQUAREONLY"); - BGFX_FATAL( (D3DPTEXTURECAPS_MIPMAP & m_caps.TextureCaps) == D3DPTEXTURECAPS_MIPMAP, bgfx::Fatal::MinimumRequiredSpecs, "D3DPTEXTURECAPS_MIPMAP"); - BGFX_FATAL( (D3DPTEXTURECAPS_ALPHA & m_caps.TextureCaps) == D3DPTEXTURECAPS_ALPHA, bgfx::Fatal::MinimumRequiredSpecs, "D3DPTEXTURECAPS_ALPHA"); + BGFX_FATAL( (D3DPTEXTURECAPS_SQUAREONLY & m_caps.TextureCaps) == 0, Fatal::MinimumRequiredSpecs, "D3DPTEXTURECAPS_SQUAREONLY"); + BGFX_FATAL( (D3DPTEXTURECAPS_MIPMAP & m_caps.TextureCaps) == D3DPTEXTURECAPS_MIPMAP, Fatal::MinimumRequiredSpecs, "D3DPTEXTURECAPS_MIPMAP"); + BGFX_FATAL( (D3DPTEXTURECAPS_ALPHA & m_caps.TextureCaps) == D3DPTEXTURECAPS_ALPHA, Fatal::MinimumRequiredSpecs, "D3DPTEXTURECAPS_ALPHA"); BGFX_FATAL(m_caps.VertexShaderVersion >= D3DVS_VERSION(2, 0) && m_caps.PixelShaderVersion >= D3DPS_VERSION(2, 1) - , bgfx::Fatal::MinimumRequiredSpecs + , Fatal::MinimumRequiredSpecs , "Shader Model Version (vs: %x, ps: %x)." , m_caps.VertexShaderVersion , m_caps.PixelShaderVersion ); BGFX_FATAL(m_caps.MaxTextureWidth >= 2048 && m_caps.MaxTextureHeight >= 2048 - , bgfx::Fatal::MinimumRequiredSpecs + , Fatal::MinimumRequiredSpecs , "Maximum texture size is below 2048 (w: %d, h: %d)." , m_caps.MaxTextureWidth , m_caps.MaxTextureHeight @@ -723,12 +723,12 @@ namespace bgfx IndexBuffer m_indexBuffers[BGFX_CONFIG_MAX_INDEX_BUFFERS]; VertexBuffer m_vertexBuffers[BGFX_CONFIG_MAX_VERTEX_BUFFERS]; - Shader m_vertexShaders[BGFX_CONFIG_MAX_VERTEX_SHADERS]; - Shader m_fragmentShaders[BGFX_CONFIG_MAX_FRAGMENT_SHADERS]; - Material m_materials[BGFX_CONFIG_MAX_MATERIALS]; - Texture m_textures[BGFX_CONFIG_MAX_TEXTURES]; + Shader m_vertexShaders[BGFX_CONFIG_MAX_VERTEX_SHADERS]; + Shader m_fragmentShaders[BGFX_CONFIG_MAX_FRAGMENT_SHADERS]; + Material m_materials[BGFX_CONFIG_MAX_MATERIALS]; + Texture m_textures[BGFX_CONFIG_MAX_TEXTURES]; VertexDeclaration m_vertexDecls[BGFX_CONFIG_MAX_VERTEX_DECLS]; - RenderTarget m_renderTargets[BGFX_CONFIG_MAX_RENDER_TARGETS]; + RenderTarget m_renderTargets[BGFX_CONFIG_MAX_RENDER_TARGETS]; UniformRegistry m_uniformReg; void* m_uniforms[BGFX_CONFIG_MAX_UNIFORMS]; @@ -1413,7 +1413,7 @@ namespace bgfx , NULL ) ); - BGFX_FATAL(m_rt, bgfx::Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create 1x1 render target."); + BGFX_FATAL(m_rt, Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create 1x1 render target."); DX_CHECK(s_renderCtx.m_device->CreateTexture(m_width , m_height @@ -1425,7 +1425,7 @@ namespace bgfx , NULL ) ); - BGFX_FATAL(m_depthTexture, bgfx::Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create depth texture."); + BGFX_FATAL(m_depthTexture, Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create depth texture."); DX_CHECK(m_depthTexture->GetSurfaceLevel(0, &m_depth) ); } @@ -1443,7 +1443,7 @@ namespace bgfx , NULL ) ); - BGFX_FATAL(m_rt, bgfx::Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create MSAA render target."); + BGFX_FATAL(m_rt, Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create MSAA render target."); } if (0 < colorFormat) @@ -1458,7 +1458,7 @@ namespace bgfx , NULL ) ); - BGFX_FATAL(m_colorTexture, bgfx::Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create color render target."); + BGFX_FATAL(m_colorTexture, Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create color render target."); DX_CHECK(m_colorTexture->GetSurfaceLevel(0, &m_color) ); } @@ -1475,7 +1475,7 @@ namespace bgfx , NULL ) ); - BGFX_FATAL(m_depth, bgfx::Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create depth stencil surface."); + BGFX_FATAL(m_depth, Fatal::D3D9_UnableToCreateRenderTarget, "Unable to create depth stencil surface."); } } } @@ -1540,7 +1540,7 @@ namespace bgfx ) ); #endif // BX_PLATFORM_WINDOWS } - + void ConstantBuffer::commit() { reset(); @@ -1856,7 +1856,7 @@ namespace bgfx } DX_CHECK(device->SetRenderState(D3DRS_FILLMODE, m_render->m_debug&BGFX_DEBUG_WIREFRAME ? D3DFILL_WIREFRAME : D3DFILL_SOLID) ); - uint16_t materialIdx = bgfx::invalidHandle; + uint16_t materialIdx = invalidHandle; SortKey key; uint8_t view = 0xff; RenderTargetHandle rt = BGFX_INVALID_HANDLE; @@ -1892,7 +1892,8 @@ namespace bgfx PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), "view"); view = key.m_view; - materialIdx = bgfx::invalidHandle; + + materialIdx = invalidHandle; if (m_render->m_rt[view].idx != rt.idx) { @@ -2049,7 +2050,7 @@ namespace bgfx { materialIdx = key.m_material; - if (bgfx::invalidHandle == materialIdx) + if (invalidHandle == materialIdx) { device->SetVertexShader(NULL); device->SetPixelShader(NULL); @@ -2065,7 +2066,7 @@ namespace bgfx constantsChanged = true; } - if (bgfx::invalidHandle != materialIdx) + if (invalidHandle != materialIdx) { Material& material = s_renderCtx.m_materials[materialIdx]; @@ -2197,7 +2198,7 @@ namespace bgfx || current.m_flags != sampler.m_flags || materialChanged) { - if (bgfx::invalidHandle != sampler.m_idx) + if (invalidHandle != sampler.m_idx) { switch (sampler.m_flags&BGFX_SAMPLER_TYPE_MASK) { @@ -2230,11 +2231,11 @@ namespace bgfx currentState.m_vertexBuffer = state.m_vertexBuffer; uint16_t handle = state.m_vertexBuffer.idx; - if (bgfx::invalidHandle != handle) + if (invalidHandle != handle) { const VertexBuffer& vb = s_renderCtx.m_vertexBuffers[handle]; - uint16_t decl = vb.m_decl.idx == bgfx::invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; + uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; const VertexDeclaration& vertexDecl = s_renderCtx.m_vertexDecls[decl]; DX_CHECK(device->SetStreamSource(0, vb.m_ptr, 0, vertexDecl.m_decl.m_stride) ); @@ -2269,7 +2270,7 @@ namespace bgfx currentState.m_indexBuffer = state.m_indexBuffer; uint16_t handle = state.m_indexBuffer.idx; - if (bgfx::invalidHandle != handle) + if (invalidHandle != handle) { IndexBuffer& ib = s_renderCtx.m_indexBuffers[handle]; DX_CHECK(device->SetIndices(ib.m_ptr) ); @@ -2280,13 +2281,13 @@ namespace bgfx } } - if (bgfx::invalidHandle != currentState.m_vertexBuffer.idx) + if (invalidHandle != currentState.m_vertexBuffer.idx) { uint32_t numVertices = state.m_numVertices; if (UINT32_C(0xffffffff) == numVertices) { VertexBuffer& vb = s_renderCtx.m_vertexBuffers[currentState.m_vertexBuffer.idx]; - uint16_t decl = vb.m_decl.idx == bgfx::invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; + uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; VertexDeclaration& vertexDecl = s_renderCtx.m_vertexDecls[decl]; numVertices = vb.m_size/vertexDecl.m_decl.m_stride; } @@ -2296,7 +2297,7 @@ namespace bgfx uint32_t numInstances = 0; uint32_t numPrimsRendered = 0; - if (bgfx::invalidHandle != state.m_indexBuffer.idx) + if (invalidHandle != state.m_indexBuffer.idx) { if (BGFX_DRAW_WHOLE_INDEX_BUFFER == state.m_startIndex) { diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index b5d31e432..638e0d622 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -131,7 +131,7 @@ namespace bgfx # define GL_IMPORT(_optional, _proto, _func) \ { \ _func = (_proto)eglGetProcAddress(#_func); \ - BGFX_FATAL(_optional || NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. eglGetProcAddress(\"%s\")", #_func); \ + BGFX_FATAL(_optional || NULL != _func, Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. eglGetProcAddress(\"%s\")", #_func); \ } # include "glimports.h" # undef GL_IMPORT @@ -146,22 +146,22 @@ namespace bgfx if (NULL == m_hdc) { m_opengl32dll = LoadLibrary("opengl32.dll"); - BGFX_FATAL(NULL != m_opengl32dll, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to load opengl32.dll."); + BGFX_FATAL(NULL != m_opengl32dll, Fatal::OPENGL_UnableToCreateContext, "Failed to load opengl32.dll."); wglGetProcAddress = (PFNWGLGETPROCADDRESSPROC)GetProcAddress(m_opengl32dll, "wglGetProcAddress"); - BGFX_FATAL(NULL != wglGetProcAddress, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed get wglGetProcAddress."); + BGFX_FATAL(NULL != wglGetProcAddress, Fatal::OPENGL_UnableToCreateContext, "Failed get wglGetProcAddress."); wglMakeCurrent = (PFNWGLMAKECURRENTPROC)GetProcAddress(m_opengl32dll, "wglMakeCurrent"); - BGFX_FATAL(NULL != wglMakeCurrent, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed get wglMakeCurrent."); + BGFX_FATAL(NULL != wglMakeCurrent, Fatal::OPENGL_UnableToCreateContext, "Failed get wglMakeCurrent."); wglCreateContext = (PFNWGLCREATECONTEXTPROC)GetProcAddress(m_opengl32dll, "wglCreateContext"); - BGFX_FATAL(NULL != wglCreateContext, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed get wglCreateContext."); + BGFX_FATAL(NULL != wglCreateContext, Fatal::OPENGL_UnableToCreateContext, "Failed get wglCreateContext."); wglDeleteContext = (PFNWGLDELETECONTEXTPROC)GetProcAddress(m_opengl32dll, "wglDeleteContext"); - BGFX_FATAL(NULL != wglDeleteContext, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed get wglDeleteContext."); + BGFX_FATAL(NULL != wglDeleteContext, Fatal::OPENGL_UnableToCreateContext, "Failed get wglDeleteContext."); m_hdc = GetDC(g_bgfxHwnd); - BGFX_FATAL(NULL != m_hdc, bgfx::Fatal::OPENGL_UnableToCreateContext, "GetDC failed!"); + BGFX_FATAL(NULL != m_hdc, Fatal::OPENGL_UnableToCreateContext, "GetDC failed!"); PIXELFORMATDESCRIPTOR pfd; memset(&pfd, 0, sizeof(pfd) ); @@ -175,19 +175,19 @@ namespace bgfx pfd.iLayerType = PFD_MAIN_PLANE; int pixelFormat = ChoosePixelFormat(m_hdc, &pfd); - BGFX_FATAL(0 != pixelFormat, bgfx::Fatal::OPENGL_UnableToCreateContext, "ChoosePixelFormat failed!"); + BGFX_FATAL(0 != pixelFormat, Fatal::OPENGL_UnableToCreateContext, "ChoosePixelFormat failed!"); DescribePixelFormat(m_hdc, pixelFormat, sizeof(PIXELFORMATDESCRIPTOR), &pfd); int result; result = SetPixelFormat(m_hdc, pixelFormat, &pfd); - BGFX_FATAL(0 != result, bgfx::Fatal::OPENGL_UnableToCreateContext, "SetPixelFormat failed!"); + BGFX_FATAL(0 != result, Fatal::OPENGL_UnableToCreateContext, "SetPixelFormat failed!"); m_context = wglCreateContext(m_hdc); - BGFX_FATAL(NULL != m_context, bgfx::Fatal::OPENGL_UnableToCreateContext, "wglCreateContext failed!"); + BGFX_FATAL(NULL != m_context, Fatal::OPENGL_UnableToCreateContext, "wglCreateContext failed!"); result = wglMakeCurrent(m_hdc, m_context); - BGFX_FATAL(0 != result, bgfx::Fatal::OPENGL_UnableToCreateContext, "wglMakeCurrent failed!"); + BGFX_FATAL(0 != result, Fatal::OPENGL_UnableToCreateContext, "wglMakeCurrent failed!"); # define GL_IMPORT(_optional, _proto, _func) \ { \ @@ -196,7 +196,7 @@ namespace bgfx { \ _func = (_proto)GetProcAddress(m_opengl32dll, #_func); \ } \ - BGFX_FATAL(_optional || NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. wglGetProcAddress(\"%s\")", #_func); \ + BGFX_FATAL(_optional || NULL != _func, Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. wglGetProcAddress(\"%s\")", #_func); \ } # include "glimports.h" # undef GL_IMPORT @@ -207,14 +207,14 @@ namespace bgfx { Display* display = XOpenDisplay(0); XLockDisplay(display); - BGFX_FATAL(display, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to open X display (0)."); + BGFX_FATAL(display, Fatal::OPENGL_UnableToCreateContext, "Failed to open X display (0)."); int glxMajor, glxMinor; if (!glXQueryVersion(display, &glxMajor, &glxMinor)) { - BGFX_FATAL(false, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to query GLX version"); + BGFX_FATAL(false, Fatal::OPENGL_UnableToCreateContext, "Failed to query GLX version"); } - BGFX_FATAL((glxMajor == 1 && glxMinor >= 3) || glxMajor > 1, bgfx::Fatal::OPENGL_UnableToCreateContext, "GLX version is not >=1.3 (%d.%d).", glxMajor, glxMinor); + BGFX_FATAL((glxMajor == 1 && glxMinor >= 3) || glxMajor > 1, Fatal::OPENGL_UnableToCreateContext, "GLX version is not >=1.3 (%d.%d).", glxMajor, glxMinor); const int glxAttribs[] = { @@ -269,7 +269,7 @@ namespace bgfx } XFree(configs); - BGFX_FATAL(visualInfo, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to find a suitable X11 display configuration."); + BGFX_FATAL(visualInfo, Fatal::OPENGL_UnableToCreateContext, "Failed to find a suitable X11 display configuration."); // Generate colormaps XSetWindowAttributes windowAttrs; @@ -287,7 +287,7 @@ namespace bgfx , CWBorderPixel|CWColormap , &windowAttrs ); - BGFX_FATAL(window, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create X11 window."); + BGFX_FATAL(window, Fatal::OPENGL_UnableToCreateContext, "Failed to create X11 window."); XMapRaised(display, window); XFlush(display); @@ -297,7 +297,7 @@ namespace bgfx typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*); glXCreateContextAttribsARBProc glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB"); - BGFX_FATAL(glXCreateContextAttribsARB, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to get glXCreateContextAttribsARB."); + BGFX_FATAL(glXCreateContextAttribsARB, Fatal::OPENGL_UnableToCreateContext, "Failed to get glXCreateContextAttribsARB."); const int contextArrib[] = { @@ -307,14 +307,14 @@ namespace bgfx }; m_context = glXCreateContextAttribsARB(display, bestconfig, 0, True, contextArrib); - BGFX_FATAL(m_context, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create GLX context."); + BGFX_FATAL(m_context, Fatal::OPENGL_UnableToCreateContext, "Failed to create GLX context."); glXMakeCurrent(display, window, m_context); # define GL_IMPORT(_optional, _proto, _func) \ { \ _func = (_proto)glXGetProcAddress((const GLubyte*)#_func); \ - BGFX_FATAL(_optional || NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. glXGetProcAddress %s", #_func); \ + BGFX_FATAL(_optional || NULL != _func, Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGL context. glXGetProcAddress %s", #_func); \ } # include "glimports.h" # undef GL_IMPORT @@ -368,7 +368,7 @@ namespace bgfx # define GL_IMPORT(_optional, _proto, _func) \ { \ _func = (_proto)eglGetProcAddress(#_func); \ - BGFX_FATAL(_optional || NULL != _func, bgfx::Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGLES context. eglGetProcAddress(\"%s\")", #_func); \ + BGFX_FATAL(_optional || NULL != _func, Fatal::OPENGL_UnableToCreateContext, "Failed to create OpenGLES context. eglGetProcAddress(\"%s\")", #_func); \ } # include "glimports.h" # undef GL_IMPORT @@ -1943,7 +1943,7 @@ namespace bgfx matrix_mul(viewProj[ii].val, m_render->m_view[ii].val, m_render->m_proj[ii].val); } - uint16_t materialIdx = bgfx::invalidHandle; + uint16_t materialIdx = invalidHandle; SortKey key; uint8_t view = 0xff; RenderTargetHandle rt = BGFX_INVALID_HANDLE; @@ -1980,13 +1980,13 @@ namespace bgfx GREMEDY_SETMARKER("view"); view = key.m_view; - materialIdx = bgfx::invalidHandle; + materialIdx = invalidHandle; if (m_render->m_rt[view].idx != rt.idx) { rt = m_render->m_rt[view]; - if (rt.idx == bgfx::invalidHandle) + if (rt.idx == invalidHandle) { GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, 0) ); height = m_render->m_resolution.m_height; @@ -2152,14 +2152,14 @@ namespace bgfx if (key.m_material != materialIdx) { materialIdx = key.m_material; - GLuint id = bgfx::invalidHandle == materialIdx ? 0 : s_renderCtx.m_materials[materialIdx].m_id; + GLuint id = invalidHandle == materialIdx ? 0 : s_renderCtx.m_materials[materialIdx].m_id; GL_CHECK(glUseProgram(id) ); materialChanged = constantsChanged = bindAttribs = true; } - if (bgfx::invalidHandle != materialIdx) + if (invalidHandle != materialIdx) { Material& material = s_renderCtx.m_materials[materialIdx]; @@ -2318,7 +2318,7 @@ namespace bgfx || materialChanged) { GL_CHECK(glActiveTexture(GL_TEXTURE0+stage) ); - if (bgfx::invalidHandle != sampler.m_idx) + if (invalidHandle != sampler.m_idx) { switch (sampler.m_flags&BGFX_SAMPLER_TYPE_MASK) { @@ -2358,7 +2358,7 @@ namespace bgfx currentState.m_vertexBuffer = state.m_vertexBuffer; uint16_t handle = state.m_vertexBuffer.idx; - if (bgfx::invalidHandle != handle) + if (invalidHandle != handle) { VertexBuffer& vb = s_renderCtx.m_vertexBuffers[handle]; GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, vb.m_id) ); @@ -2375,7 +2375,7 @@ namespace bgfx currentState.m_indexBuffer = state.m_indexBuffer; uint16_t handle = state.m_indexBuffer.idx; - if (bgfx::invalidHandle != handle) + if (invalidHandle != handle) { IndexBuffer& ib = s_renderCtx.m_indexBuffers[handle]; GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ib.m_id) ); @@ -2386,14 +2386,14 @@ namespace bgfx } } - if (bgfx::invalidHandle != currentState.m_vertexBuffer.idx) + if (invalidHandle != currentState.m_vertexBuffer.idx) { if (baseVertex != state.m_startVertex || bindAttribs) { baseVertex = state.m_startVertex; VertexBuffer& vb = s_renderCtx.m_vertexBuffers[state.m_vertexBuffer.idx]; - uint16_t decl = vb.m_decl.idx == bgfx::invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; + uint16_t decl = vb.m_decl.idx == invalidHandle ? state.m_vertexDecl.idx : vb.m_decl.idx; const Material& material = s_renderCtx.m_materials[materialIdx]; material.bindAttributes(s_renderCtx.m_vertexDecls[decl], state.m_startVertex); @@ -2409,7 +2409,7 @@ namespace bgfx uint32_t numInstances = 0; uint32_t numPrimsRendered = 0; - if (bgfx::invalidHandle != state.m_indexBuffer.idx) + if (invalidHandle != state.m_indexBuffer.idx) { if (BGFX_DRAW_WHOLE_INDEX_BUFFER == state.m_startIndex) { diff --git a/src/vs_clear_dx11.bin.h b/src/vs_clear_dx11.bin.h new file mode 100644 index 000000000..cc44e0393 --- /dev/null +++ b/src/vs_clear_dx11.bin.h @@ -0,0 +1,43 @@ +static const uint8_t vs_clear_dx11[635] = +{ + 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0x44, 0x58, 0x42, 0x43, 0x9f, 0x90, 0x55, 0x9a, 0x15, 0xd7, // ....t.DXBC..U... + 0x4d, 0x46, 0x12, 0x19, 0x32, 0x30, 0xa7, 0xfd, 0x7a, 0x83, 0x01, 0x00, 0x00, 0x00, 0x74, 0x02, // MF..20..z.....t. + 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xfc, 0x00, // ......4......... + 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x70, 0x00, // ..P.......RDEFp. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, // ..............<. + 0x00, 0x00, 0x00, 0x05, 0xfe, 0xff, 0x00, 0x91, 0x00, 0x00, 0x3c, 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, 0x4d, 0x69, // ..$...........Mi + 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, // crosoft (R) HLSL + 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, // Shader Compiler + 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, // 9.29.952.3111.. + 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, // ..ISGNH......... + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, // ..8............. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, // ..........A..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, // ................ + 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, // ..POSITION.COLOR + 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, // ..OSGNL......... + 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, // ..8............. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, // ..........D..... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, // ................ + 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, // ..SV_POSITION.CO + 0x4c, 0x4f, 0x52, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, 0x58, 0x80, 0x00, 0x00, 0x00, 0x50, 0x00, // LOR...SHEX....P. + 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x5f, 0x00, 0x00, 0x03, 0x72, 0x10, // .. ...j..._...r. + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, // ......_......... + 0x00, 0x00, 0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // ..g.... ........ + 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, // ..e.... ......6. + 0x00, 0x05, 0x72, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x12, 0x10, 0x00, 0x00, 0x00, // ..r ......F..... + 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x82, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, // ..6.... .......@ + 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, // .....?6.... .... + 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, // ..F.......>...ST + 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // AT.............. + 0x00, 0x00, 0x04, 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, 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, // ........... +};