From a3b0dde24b3b841ca6924788a9052bb52e8b4e22 Mon Sep 17 00:00:00 2001 From: bkaradzic <branimirkaradzic@gmail.com> Date: Sun, 25 Nov 2012 18:24:50 -0800 Subject: [PATCH] Fixes. Added vsh output/fsh input hash matching. --- 3rdparty/fcpp/cpp.h | 2 +- 3rdparty/openctm/lib/compressMG2.c | 2 +- 3rdparty/openctm/lib/openctm.c | 6 +- 3rdparty/openctm/lib/stream.c | 6 +- 3rdparty/openctm/tools/3ds.cpp | 44 +- 3rdparty/openctm/tools/common.h | 2 + 3rdparty/openctm/tools/convoptions.cpp | 10 +- 3rdparty/openctm/tools/ctm.cpp | 6 +- 3rdparty/openctm/tools/ctmconv.cpp | 155 +++-- 3rdparty/openctm/tools/dae.cpp | 14 +- 3rdparty/openctm/tools/lwo.cpp | 34 +- 3rdparty/openctm/tools/mesh.cpp | 8 +- 3rdparty/openctm/tools/meshio.cpp | 6 +- 3rdparty/openctm/tools/obj.cpp | 14 +- 3rdparty/openctm/tools/off.cpp | 12 +- 3rdparty/openctm/tools/ply.cpp | 12 +- 3rdparty/openctm/tools/stl.cpp | 12 +- 3rdparty/openctm/tools/wrl.cpp | 16 +- README.md | 111 +++- examples/01-cubes/makefile | 1 + examples/02-metaballs/makefile | 1 + examples/03-raymarch/makefile | 1 + examples/04-mesh/makefile | 1 + examples/05-instancing/makefile | 1 + examples/06-bump/bump.cpp | 2 +- examples/06-bump/makefile | 1 + examples/common/dbg.cpp | 13 +- examples/runtime/shaders/dx11/fs_bump.bin | Bin 4264 -> 4272 bytes examples/runtime/shaders/dx11/fs_cubes.bin | Bin 486 -> 494 bytes .../runtime/shaders/dx11/fs_instancing.bin | Bin 486 -> 494 bytes examples/runtime/shaders/dx11/fs_mesh.bin | Bin 2267 -> 2275 bytes .../runtime/shaders/dx11/fs_metaballs.bin | Bin 890 -> 898 bytes .../runtime/shaders/dx11/fs_raymarching.bin | Bin 10695 -> 10703 bytes examples/runtime/shaders/dx11/vs_bump.bin | Bin 2664 -> 2672 bytes examples/runtime/shaders/dx11/vs_cubes.bin | Bin 1068 -> 1076 bytes .../runtime/shaders/dx11/vs_instancing.bin | Bin 1395 -> 1403 bytes examples/runtime/shaders/dx11/vs_mesh.bin | Bin 2039 -> 2047 bytes .../runtime/shaders/dx11/vs_metaballs.bin | Bin 1282 -> 1290 bytes .../runtime/shaders/dx11/vs_raymarching.bin | Bin 1176 -> 1184 bytes examples/runtime/shaders/dx9/fs_bump.bin | Bin 2199 -> 2207 bytes examples/runtime/shaders/dx9/fs_cubes.bin | Bin 129 -> 137 bytes .../runtime/shaders/dx9/fs_instancing.bin | Bin 129 -> 137 bytes examples/runtime/shaders/dx9/fs_mesh.bin | Bin 1270 -> 1278 bytes examples/runtime/shaders/dx9/fs_metaballs.bin | Bin 473 -> 481 bytes .../runtime/shaders/dx9/fs_raymarching.bin | Bin 47422 -> 47430 bytes examples/runtime/shaders/dx9/vs_bump.bin | Bin 1051 -> 1059 bytes examples/runtime/shaders/dx9/vs_cubes.bin | Bin 311 -> 319 bytes .../runtime/shaders/dx9/vs_instancing.bin | Bin 466 -> 474 bytes examples/runtime/shaders/dx9/vs_mesh.bin | Bin 974 -> 982 bytes examples/runtime/shaders/dx9/vs_metaballs.bin | Bin 433 -> 441 bytes .../runtime/shaders/dx9/vs_raymarching.bin | Bin 347 -> 355 bytes examples/runtime/shaders/gles/fs_bump.bin | Bin 4125 -> 4133 bytes examples/runtime/shaders/gles/fs_cubes.bin | Bin 122 -> 130 bytes .../runtime/shaders/gles/fs_instancing.bin | Bin 122 -> 130 bytes examples/runtime/shaders/gles/fs_mesh.bin | Bin 1248 -> 1256 bytes .../runtime/shaders/gles/fs_metaballs.bin | Bin 358 -> 366 bytes .../runtime/shaders/gles/fs_raymarching.bin | Bin 9562 -> 9570 bytes examples/runtime/shaders/gles/vs_bump.bin | Bin 1605 -> 1613 bytes examples/runtime/shaders/gles/vs_cubes.bin | Bin 312 -> 320 bytes .../runtime/shaders/gles/vs_instancing.bin | Bin 558 -> 566 bytes examples/runtime/shaders/gles/vs_mesh.bin | Bin 1344 -> 1352 bytes .../runtime/shaders/gles/vs_metaballs.bin | Bin 485 -> 493 bytes .../runtime/shaders/gles/vs_raymarching.bin | Bin 395 -> 403 bytes examples/runtime/shaders/glsl/fs_bump.bin | Bin 4086 -> 4094 bytes examples/runtime/shaders/glsl/fs_cubes.bin | Bin 83 -> 91 bytes .../runtime/shaders/glsl/fs_instancing.bin | Bin 83 -> 91 bytes examples/runtime/shaders/glsl/fs_mesh.bin | Bin 1209 -> 1217 bytes .../runtime/shaders/glsl/fs_metaballs.bin | Bin 319 -> 327 bytes .../runtime/shaders/glsl/fs_raymarching.bin | Bin 9523 -> 9531 bytes examples/runtime/shaders/glsl/vs_bump.bin | Bin 1566 -> 1574 bytes examples/runtime/shaders/glsl/vs_cubes.bin | Bin 273 -> 281 bytes .../runtime/shaders/glsl/vs_instancing.bin | Bin 519 -> 527 bytes examples/runtime/shaders/glsl/vs_mesh.bin | Bin 1305 -> 1313 bytes .../runtime/shaders/glsl/vs_metaballs.bin | Bin 446 -> 454 bytes .../runtime/shaders/glsl/vs_raymarching.bin | Bin 356 -> 364 bytes include/bgfx.h | 13 +- premake/premake4.lua | 3 +- premake/shader.mk | 6 +- premake/shaderc.lua | 3 +- premake/{ddsdump.lua => texturec.lua} | 5 +- src/bgfx.cpp | 127 +++- src/bgfx_p.h | 211 +++--- src/config.h | 7 + src/dds.cpp | 78 +-- src/fs_clear_dx11.bin.h | 63 +- src/fs_debugfont_dx11.bin.h | 109 ++-- src/fs_debugfont_dx9.bin.h | 47 +- src/fs_debugfont_glsl.bin.h | 47 +- src/glimports.h | 6 + src/renderer_d3d11.cpp | 337 ++++++---- src/renderer_d3d11.h | 36 +- src/renderer_d3d9.cpp | 185 +++--- src/renderer_d3d9.h | 33 +- src/renderer_gl.cpp | 186 ++++-- src/renderer_gl.h | 28 +- src/renderer_null.cpp | 8 +- src/vs_clear_dx11.bin.h | 75 +-- src/vs_debugfont_dx11.bin.h | 166 ++--- src/vs_debugfont_dx9.bin.h | 45 +- src/vs_debugfont_glsl.bin.h | 62 +- tools/bin/shaderc.exe | Bin 1079296 -> 1084416 bytes tools/{ => shaderc}/shaderc.cpp | 604 +++++++----------- tools/{ddsdump.cpp => texturec/texturec.cpp} | 7 +- 103 files changed, 1610 insertions(+), 1380 deletions(-) rename premake/{ddsdump.lua => texturec.lua} (66%) rename tools/{ => shaderc}/shaderc.cpp (78%) rename tools/{ddsdump.cpp => texturec/texturec.cpp} (91%) diff --git a/3rdparty/fcpp/cpp.h b/3rdparty/fcpp/cpp.h index b60c7399..c8084af7 100644 --- a/3rdparty/fcpp/cpp.h +++ b/3rdparty/fcpp/cpp.h @@ -202,7 +202,7 @@ typedef struct sizes { */ #ifdef nomacarg -#define cput output /* cput concatenates tokens */ +#define cput generate /* cput concatenates tokens */ #else #if COMMENT_INVISIBLE #define cput(c) { if (c != TOK_SEP && c != COM_SEP) putchar(c); } diff --git a/3rdparty/openctm/lib/compressMG2.c b/3rdparty/openctm/lib/compressMG2.c index 78792834..064379a9 100644 --- a/3rdparty/openctm/lib/compressMG2.c +++ b/3rdparty/openctm/lib/compressMG2.c @@ -506,7 +506,7 @@ static void _ctmMakeNormalCoordSys(CTMfloat * aNormal, CTMfloat * aBasisAxes) x[2] = aNormal[1]; // Normalize the new X axis (note: |x[2]| = |x[0]|) - len = sqrtf(2.0 * x[0] * x[0] + x[1] * x[1]); + len = sqrtf(2.0f * x[0] * x[0] + x[1] * x[1]); if(len > 1.0e-20f) { len = 1.0f / len; diff --git a/3rdparty/openctm/lib/openctm.c b/3rdparty/openctm/lib/openctm.c index f1b9303a..03461201 100644 --- a/3rdparty/openctm/lib/openctm.c +++ b/3rdparty/openctm/lib/openctm.c @@ -913,7 +913,7 @@ CTMEXPORT void CTMCALL ctmFileComment(CTMcontext aContext, // Get length of string (if empty, do nothing) if(!aFileComment) return; - len = strlen(aFileComment); + len = (int)strlen(aFileComment); if(!len) return; @@ -1005,7 +1005,7 @@ static _CTMfloatmap * _ctmAddFloatMap(_CTMcontext * self, if(aName) { // Get length of string (if empty, do nothing) - len = strlen(aName); + len = (CTMuint)strlen(aName); if(len) { // Copy the string @@ -1024,7 +1024,7 @@ static _CTMfloatmap * _ctmAddFloatMap(_CTMcontext * self, if(aFileName) { // Get length of string (if empty, do nothing) - len = strlen(aFileName); + len = (CTMuint)strlen(aFileName); if(len) { // Copy the string diff --git a/3rdparty/openctm/lib/stream.c b/3rdparty/openctm/lib/stream.c index 5ed85b7a..5cd67cd0 100644 --- a/3rdparty/openctm/lib/stream.c +++ b/3rdparty/openctm/lib/stream.c @@ -155,7 +155,7 @@ void _ctmStreamWriteSTRING(_CTMcontext * self, const char * aValue) // Get string length if(aValue) - len = strlen(aValue); + len = (CTMuint)strlen(aValue); else len = 0; @@ -194,7 +194,7 @@ int _ctmStreamReadPackedInts(_CTMcontext * self, CTMint * aData, self->mError = CTM_OUT_OF_MEMORY; return CTM_FALSE; } - _ctmStreamRead(self, (void *) packed, packedSize); + _ctmStreamRead(self, (void *) packed, (CTMuint)packedSize); // Allocate memory for interleaved array tmp = (unsigned char *) malloc(aCount * aSize * 4); @@ -374,7 +374,7 @@ int _ctmStreamReadPackedFloats(_CTMcontext * self, CTMfloat * aData, self->mError = CTM_OUT_OF_MEMORY; return CTM_FALSE; } - _ctmStreamRead(self, (void *) packed, packedSize); + _ctmStreamRead(self, (void *) packed, (CTMuint)packedSize); // Allocate memory for interleaved array tmp = (unsigned char *) malloc(aCount * aSize * 4); diff --git a/3rdparty/openctm/tools/3ds.cpp b/3rdparty/openctm/tools/3ds.cpp index 62f0beae..10761894 100644 --- a/3rdparty/openctm/tools/3ds.cpp +++ b/3rdparty/openctm/tools/3ds.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <vector> #include <list> @@ -174,16 +174,16 @@ void Import_3DS(const char * aFileName, Mesh * aMesh) // Open the input file ifstream f(aFileName, ios::in | ios::binary); if(f.fail()) - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); // Get file size f.seekg(0, ios::end); - uint32 fileSize = f.tellg(); + uint32 fileSize = (uint32)f.tellg(); f.seekg(0, ios::beg); // Check file size (rough initial check) if(fileSize < 6) - throw runtime_error("Invalid 3DS file format."); + throw_runtime_error("Invalid 3DS file format."); uint16 chunk, count; uint32 chunkLen; @@ -192,7 +192,7 @@ void Import_3DS(const char * aFileName, Mesh * aMesh) chunk = ReadInt16(f); chunkLen = ReadInt32(f); if((chunk != CHUNK_MAIN) || (chunkLen != fileSize)) - throw runtime_error("Invalid 3DS file format."); + throw_runtime_error("Invalid 3DS file format."); // Parse chunks, and store the data in a temporary list, objList... Obj3DS * obj = 0; @@ -287,8 +287,8 @@ void Import_3DS(const char * aFileName, Mesh * aMesh) for(list<Obj3DS>::iterator o = objList.begin(); o != objList.end(); ++ o) { // Append... - uint32 idxOffset = aMesh->mIndices.size(); - uint32 vertOffset = aMesh->mVertices.size(); + uint32 idxOffset = (uint32)aMesh->mIndices.size(); + uint32 vertOffset = (uint32)aMesh->mVertices.size(); aMesh->mIndices.resize(idxOffset + (*o).mIndices.size()); aMesh->mVertices.resize(vertOffset + (*o).mVertices.size()); if(hasUVCoords) @@ -317,7 +317,7 @@ void Export_3DS(const char * aFileName, Mesh * aMesh, Options &aOptions) // First, check that the mesh fits in a 3DS file (at most 65535 triangles // and 65535 vertices are supported). if((aMesh->mIndices.size() > (3*65535)) || (aMesh->mVertices.size() > 65535)) - throw runtime_error("The mesh is too large to fit in a 3DS file."); + throw_runtime_error("The mesh is too large to fit in a 3DS file."); // What should we export? bool exportTexCoords = aMesh->HasTexCoords() && !aOptions.mNoTexCoords; @@ -327,16 +327,16 @@ void Export_3DS(const char * aFileName, Mesh * aMesh, Options &aOptions) string matName("Material0"); // Get mesh properties - uint32 triCount = aMesh->mIndices.size() / 3; - uint32 vertCount = aMesh->mVertices.size(); + uint32 triCount = (uint32)(aMesh->mIndices.size() / 3); + uint32 vertCount = (uint32)aMesh->mVertices.size(); // Calculate the material chunk size uint32 materialSize = 0; uint32 matGroupSize = 0; if(exportTexCoords && aMesh->mTexFileName.size() > 0) { - materialSize += 24 + matName.size() + 1 + aMesh->mTexFileName.size() + 1; - matGroupSize += 8 + matName.size() + 1 + 2 * triCount; + materialSize += 24 + (uint32)matName.size() + 1 + (uint32)aMesh->mTexFileName.size() + 1; + matGroupSize += 8 + (uint32)matName.size() + 1 + 2 * triCount; } // Calculate the mesh chunk size @@ -345,12 +345,12 @@ void Export_3DS(const char * aFileName, Mesh * aMesh, Options &aOptions) triMeshSize += 8 + 8 * vertCount; // Calculate the total file size - uint32 fileSize = 38 + objName.size() + 1 + materialSize + triMeshSize; + uint32 fileSize = 38 + (uint32)objName.size() + 1 + materialSize + triMeshSize; // Open the output file ofstream f(aFileName, ios::out | ios::binary); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // Write file header WriteInt16(f, CHUNK_MAIN); @@ -361,7 +361,7 @@ void Export_3DS(const char * aFileName, Mesh * aMesh, Options &aOptions) // 3D Edit chunk WriteInt16(f, CHUNK_3DEDIT); - WriteInt32(f, 16 + materialSize + objName.size() + 1 + triMeshSize); + WriteInt32(f, 16 + materialSize + (uint32)objName.size() + 1 + triMeshSize); WriteInt16(f, CHUNK_MESH_VERSION); WriteInt32(f, 6 + 4); WriteInt32(f, 0x00000003); @@ -372,19 +372,19 @@ void Export_3DS(const char * aFileName, Mesh * aMesh, Options &aOptions) WriteInt16(f, CHUNK_MAT_ENTRY); WriteInt32(f, materialSize); WriteInt16(f, CHUNK_MAT_NAME); - WriteInt32(f, 6 + matName.size() + 1); - f.write(matName.c_str(), matName.size() + 1); + WriteInt32(f, 6 + (uint32)matName.size() + 1); + f.write(matName.c_str(), (uint32)matName.size() + 1); WriteInt16(f, CHUNK_MAT_TEXMAP); - WriteInt32(f, 12 + aMesh->mTexFileName.size() + 1); + WriteInt32(f, 12 + (uint32)aMesh->mTexFileName.size() + 1); WriteInt16(f, CHUNK_MAT_MAPNAME); - WriteInt32(f, 6 + aMesh->mTexFileName.size() + 1); - f.write(aMesh->mTexFileName.c_str(), aMesh->mTexFileName.size() + 1); + WriteInt32(f, 6 + (uint32)aMesh->mTexFileName.size() + 1); + f.write(aMesh->mTexFileName.c_str(), (uint32)aMesh->mTexFileName.size() + 1); } // Object chunk WriteInt16(f, CHUNK_OBJECT); - WriteInt32(f, 6 + objName.size() + 1 + triMeshSize); - f.write(objName.c_str(), objName.size() + 1); + WriteInt32(f, 6 + (uint32)objName.size() + 1 + triMeshSize); + f.write(objName.c_str(), (uint32)objName.size() + 1); // Triangle Mesh chunk WriteInt16(f, CHUNK_TRIMESH); diff --git a/3rdparty/openctm/tools/common.h b/3rdparty/openctm/tools/common.h index 11c545b2..9a8b4eb4 100644 --- a/3rdparty/openctm/tools/common.h +++ b/3rdparty/openctm/tools/common.h @@ -30,6 +30,8 @@ #include <string> +void throw_runtime_error(std::string str); + // Convert a string to upper case. std::string UpperCase(const std::string &aString); diff --git a/3rdparty/openctm/tools/convoptions.cpp b/3rdparty/openctm/tools/convoptions.cpp index bab301b5..95ac7f35 100644 --- a/3rdparty/openctm/tools/convoptions.cpp +++ b/3rdparty/openctm/tools/convoptions.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <string> #include <sstream> #include "convoptions.h" @@ -106,7 +106,7 @@ void Options::GetFromArgs(int argc, char **argv, int aStartIdx) else if(upaxis == string("-Z")) mUpAxis = uaNZ; else - throw runtime_error("Invalid up axis (use X, Y, Z, -X, -Y or -Z)."); + throw_runtime_error("Invalid up axis (use X, Y, Z, -X, -Y or -Z)."); } else if(cmd == string("--flip")) { @@ -139,13 +139,13 @@ void Options::GetFromArgs(int argc, char **argv, int aStartIdx) else if(method == string("MG2")) mMethod = CTM_METHOD_MG2; else - throw runtime_error("Invalid method (use RAW, MG1 or MG2)."); + throw_runtime_error("Invalid method (use RAW, MG1 or MG2)."); } else if((cmd == string("--level")) && (i < (argc - 1))) { CTMint val = GetIntArg(argv[i + 1]); if( (val < 0) || (val > 9) ) - throw runtime_error("Invalid compression level (it must be in the range 0 - 9)."); + throw_runtime_error("Invalid compression level (it must be in the range 0 - 9)."); mLevel = CTMuint(val); ++ i; } @@ -185,6 +185,6 @@ void Options::GetFromArgs(int argc, char **argv, int aStartIdx) ++ i; } else - throw runtime_error(string("Invalid argument: ") + cmd); + throw_runtime_error(string("Invalid argument: ") + cmd); } } diff --git a/3rdparty/openctm/tools/ctm.cpp b/3rdparty/openctm/tools/ctm.cpp index 7ed749d5..7f1d1b5d 100644 --- a/3rdparty/openctm/tools/ctm.cpp +++ b/3rdparty/openctm/tools/ctm.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <openctm.h> #include "ctm.h" @@ -123,8 +123,8 @@ void Export_CTM(const char * aFileName, Mesh * aMesh, Options &aOptions) CTMfloat * normals = 0; if(aMesh->HasNormals() && !aOptions.mNoNormals) normals = &aMesh->mNormals[0].x; - ctm.DefineMesh((CTMfloat *) &aMesh->mVertices[0].x, aMesh->mVertices.size(), - (const CTMuint*) &aMesh->mIndices[0], aMesh->mIndices.size() / 3, + ctm.DefineMesh((CTMfloat *) &aMesh->mVertices[0].x, (CTMuint)aMesh->mVertices.size(), + (const CTMuint*) &aMesh->mIndices[0], (CTMuint)aMesh->mIndices.size() / 3, normals); // Define texture coordinates diff --git a/3rdparty/openctm/tools/ctmconv.cpp b/3rdparty/openctm/tools/ctmconv.cpp index 62993aab..07e6811e 100644 --- a/3rdparty/openctm/tools/ctmconv.cpp +++ b/3rdparty/openctm/tools/ctmconv.cpp @@ -27,7 +27,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <vector> #include <iostream> #include <list> @@ -113,7 +113,7 @@ static void PreProcessMesh(Mesh &aMesh, Options &aOptions) // Flip trianlges? if(aOptions.mFlipTriangles) { - CTMuint triCount = aMesh.mIndices.size() / 3; + CTMuint triCount = (CTMuint)(aMesh.mIndices.size() / 3); for(CTMuint i = 0; i < triCount; ++ i) { CTMuint tmp = aMesh.mIndices[i * 3]; @@ -131,6 +131,11 @@ static void PreProcessMesh(Mesh &aMesh, Options &aOptions) cout << 1000.0 * dt << " ms" << endl; } +void throw_runtime_error(std::string str) +{ + cout << "Error: " << str << endl; + abort(); +} //----------------------------------------------------------------------------- // main() @@ -141,94 +146,84 @@ int main(int argc, char ** argv) Options opt; string inFile; string outFile; - try - { - if(argc < 3) - throw runtime_error("Too few arguments."); - inFile = string(argv[1]); - outFile = string(argv[2]); - opt.GetFromArgs(argc, argv, 3); - } - catch(exception &e) - { - cout << "Error: " << e.what() << endl << endl; - cout << "Usage: " << argv[0] << " infile outfile [options]" << endl << endl; - cout << "Options:" << endl; - cout << endl << " Data manipulation (all formats)" << endl; - cout << " --scale arg Scale the mesh by a scalar factor." << endl; - cout << " --upaxis arg Set up axis (X, Y, Z, -X, -Y, -Z). If != Z, the mesh will" << endl; - cout << " be flipped." << endl; - cout << " --flip Flip triangle orientation." << endl; - cout << " --calc-normals If the source file does not contain any normals, calculate" << endl; - cout << " them." << endl; - cout << " --no-normals Do not export normals." << endl; - cout << " --no-texcoords Do not export texture coordinates." << endl; - cout << " --no-colors Do not export vertex colors." << endl; - cout << endl << " OpenCTM output" << endl; - cout << " --method arg Select compression method (RAW, MG1, MG2)" << endl; - cout << " --level arg Set the compression level (0 - 9)" << endl; - cout << endl << " OpenCTM MG2 method" << endl; - cout << " --vprec arg Set vertex precision" << endl; - cout << " --vprecrel arg Set vertex precision, relative method" << endl; - cout << " --nprec arg Set normal precision" << endl; - cout << " --tprec arg Set texture map precision" << endl; - cout << " --cprec arg Set color precision" << endl; - cout << endl << " Miscellaneous" << endl; - cout << " --comment arg Set the file comment (default is to use the comment" << endl; - cout << " from the input file, if any)." << endl; - cout << " --texfile arg Set the texture file name reference for the texture" << endl; - cout << " (default is to use the texture file name reference" << endl; - cout << " from the input file, if any)." << endl; - // Show supported formats - cout << endl << "Supported file formats:" << endl << endl; - list<string> formatList; - SupportedFormats(formatList); - for(list<string>::iterator i = formatList.begin(); i != formatList.end(); ++ i) - cout << " " << (*i) << endl; - cout << endl; + if(argc < 3) + { + cout << "Error: Too few arguments." << endl << endl; + cout << "Usage: " << argv[0] << " infile outfile [options]" << endl << endl; + cout << "Options:" << endl; + cout << endl << " Data manipulation (all formats)" << endl; + cout << " --scale arg Scale the mesh by a scalar factor." << endl; + cout << " --upaxis arg Set up axis (X, Y, Z, -X, -Y, -Z). If != Z, the mesh will" << endl; + cout << " be flipped." << endl; + cout << " --flip Flip triangle orientation." << endl; + cout << " --calc-normals If the source file does not contain any normals, calculate" << endl; + cout << " them." << endl; + cout << " --no-normals Do not export normals." << endl; + cout << " --no-texcoords Do not export texture coordinates." << endl; + cout << " --no-colors Do not export vertex colors." << endl; + cout << endl << " OpenCTM output" << endl; + cout << " --method arg Select compression method (RAW, MG1, MG2)" << endl; + cout << " --level arg Set the compression level (0 - 9)" << endl; + cout << endl << " OpenCTM MG2 method" << endl; + cout << " --vprec arg Set vertex precision" << endl; + cout << " --vprecrel arg Set vertex precision, relative method" << endl; + cout << " --nprec arg Set normal precision" << endl; + cout << " --tprec arg Set texture map precision" << endl; + cout << " --cprec arg Set color precision" << endl; + cout << endl << " Miscellaneous" << endl; + cout << " --comment arg Set the file comment (default is to use the comment" << endl; + cout << " from the input file, if any)." << endl; + cout << " --texfile arg Set the texture file name reference for the texture" << endl; + cout << " (default is to use the texture file name reference" << endl; + cout << " from the input file, if any)." << endl; - return 0; + // Show supported formats + cout << endl << "Supported file formats:" << endl << endl; + list<string> formatList; + SupportedFormats(formatList); + for(list<string>::iterator i = formatList.begin(); i != formatList.end(); ++ i) + cout << " " << (*i) << endl; + cout << endl; + + return 0; } - try - { - // Define mesh - Mesh mesh; + inFile = string(argv[1]); + outFile = string(argv[2]); + opt.GetFromArgs(argc, argv, 3); - // Create a timer instance - SysTimer timer; - double dt; + // Define mesh + Mesh mesh; - // Load input file - cout << "Loading " << inFile << "... " << flush; - timer.Push(); - ImportMesh(inFile.c_str(), &mesh); - dt = timer.PopDelta(); - cout << 1000.0 * dt << " ms" << endl; + // Create a timer instance + SysTimer timer; + double dt; - // Manipulate the mesh - PreProcessMesh(mesh, opt); + // Load input file + cout << "Loading " << inFile << "... " << flush; + timer.Push(); + ImportMesh(inFile.c_str(), &mesh); + dt = timer.PopDelta(); + cout << 1000.0 * dt << " ms" << endl; - // Override comment? - if(opt.mComment.size() > 0) - mesh.mComment = opt.mComment; + // Manipulate the mesh + PreProcessMesh(mesh, opt); - // Override texture file name? - if(opt.mTexFileName.size() > 0) - mesh.mTexFileName = opt.mTexFileName; + // Override comment? + if(opt.mComment.size() > 0) + mesh.mComment = opt.mComment; - // Save output file - cout << "Saving " << outFile << "... " << flush; - timer.Push(); - ExportMesh(outFile.c_str(), &mesh, opt); - dt = timer.PopDelta(); - cout << 1000.0 * dt << " ms" << endl; - } - catch(exception &e) - { - cout << "Error: " << e.what() << endl; - } + // Override texture file name? + if(opt.mTexFileName.size() > 0) + mesh.mTexFileName = opt.mTexFileName; + + // Save output file + cout << "Saving " << outFile << "... " << flush; + timer.Push(); + ExportMesh(outFile.c_str(), &mesh, opt); + dt = timer.PopDelta(); + cout << 1000.0 * dt << " ms" << endl; return 0; } diff --git a/3rdparty/openctm/tools/dae.cpp b/3rdparty/openctm/tools/dae.cpp index d4c4521d..5d18c473 100644 --- a/3rdparty/openctm/tools/dae.cpp +++ b/3rdparty/openctm/tools/dae.cpp @@ -26,7 +26,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <sstream> #include <vector> @@ -454,7 +454,7 @@ void Import_DAE(const char * aFileName, Mesh * aMesh) aMesh->mTexCoords.resize(texcoordOffset ); for(size_t i = 0; i < indexVector.size(); ++i) - aMesh->mIndices[indicesOff + i] = indexVector[i]; + aMesh->mIndices[indicesOff + i] = (unsigned int)indexVector[i]; for(size_t i = 0; i < vertVector.size(); ++i) aMesh->mVertices[vertexOff + i] = vertVector[i]; @@ -469,7 +469,7 @@ void Import_DAE(const char * aFileName, Mesh * aMesh) } } else - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); } /// Dump a float array to an XML text node. @@ -563,7 +563,7 @@ void Export_DAE(const char * aFileName, Mesh * aMesh, Options &aOptions) source_position->LinkEndChild(positions_array); positions_array->SetAttribute("id", "Mesh-1-positions-array"); positions_array->SetAttribute("count", int(aMesh->mVertices.size() * 3)); - FloatArrayToXML(positions_array, &aMesh->mVertices[0].x, aMesh->mVertices.size() * 3); + FloatArrayToXML(positions_array, &aMesh->mVertices[0].x, (unsigned int)aMesh->mVertices.size() * 3); TiXmlElement * positions_technique = new TiXmlElement("technique_common"); source_position->LinkEndChild(positions_technique); TiXmlElement * positions_technique_accessor = new TiXmlElement("accessor"); @@ -596,7 +596,7 @@ void Export_DAE(const char * aFileName, Mesh * aMesh, Options &aOptions) source_normal->LinkEndChild(normals_array); normals_array->SetAttribute("id", "Mesh-1-normals-array"); normals_array->SetAttribute("count", int(aMesh->mVertices.size() * 3)); - FloatArrayToXML(normals_array, &aMesh->mNormals[0].x, aMesh->mNormals.size() * 3); + FloatArrayToXML(normals_array, &aMesh->mNormals[0].x, (unsigned int)aMesh->mNormals.size() * 3); TiXmlElement * normals_technique = new TiXmlElement("technique_common"); source_normal->LinkEndChild(normals_technique); TiXmlElement * normals_technique_accessor = new TiXmlElement("accessor"); @@ -630,7 +630,7 @@ void Export_DAE(const char * aFileName, Mesh * aMesh, Options &aOptions) source_map1->LinkEndChild(map1_array); map1_array->SetAttribute("id", "Mesh-1-map1-array"); map1_array->SetAttribute("count", int(aMesh->mVertices.size() * 3)); - FloatArrayToXML(map1_array, &aMesh->mTexCoords[0].u, aMesh->mTexCoords.size() * 2); + FloatArrayToXML(map1_array, &aMesh->mTexCoords[0].u, (unsigned int)aMesh->mTexCoords.size() * 2); TiXmlElement * map1_technique = new TiXmlElement("technique_common"); source_map1->LinkEndChild(map1_technique); TiXmlElement * map1_technique_accessor = new TiXmlElement("accessor"); @@ -721,5 +721,5 @@ void Export_DAE(const char * aFileName, Mesh * aMesh, Options &aOptions) // Save the XML document to a file xmlDoc.SaveFile(aFileName); if(xmlDoc.Error()) - throw runtime_error(string(xmlDoc.ErrorDesc())); + throw_runtime_error(string(xmlDoc.ErrorDesc())); } diff --git a/3rdparty/openctm/tools/lwo.cpp b/3rdparty/openctm/tools/lwo.cpp index b61d06bc..9b1544ee 100644 --- a/3rdparty/openctm/tools/lwo.cpp +++ b/3rdparty/openctm/tools/lwo.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <cstring> #include <string> @@ -216,14 +216,14 @@ static void WriteVEC12(ostream &aStream, Vector3 aValue) /// Write a string to a stream (no zero termination). static void WriteString(ostream &aStream, const char * aString) { - int len = strlen(aString); + int len = (int)strlen(aString); aStream.write(aString, len); } /// Write a zero terminated string to a stream. static void WriteStringZ(ostream &aStream, const char * aString) { - int len = strlen(aString) + 1; + int len = (int)strlen(aString) + 1; aStream.write(aString, len); if(len & 1) { @@ -262,8 +262,8 @@ static uint32 CalcPOLSSize(Mesh * aMesh) /// account, but exclude the name string (at least two bytes)... static uint32 CalcVMAPSize(Mesh * aMesh, uint32 aDimension) { - uint32 size = 6 + aMesh->mVertices.size() * (2 + 4 * aDimension); - uint32 maxIdx = aMesh->mVertices.size() - 1; + uint32 size = (uint32)(6 + aMesh->mVertices.size() * (2 + 4 * aDimension)); + uint32 maxIdx = (uint32)(aMesh->mVertices.size() - 1); if(maxIdx >= 0x0000ff00) size += (maxIdx - 0x0000feff) * 2; return size; @@ -280,14 +280,14 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) // Open the input file ifstream f(aFileName, ios::in | ios::binary); if(f.fail()) - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); // File header if(ReadString(f, 4) != string("FORM")) - throw runtime_error("Not a valid LWO file (missing FORM chunk)."); + throw_runtime_error("Not a valid LWO file (missing FORM chunk)."); uint32 fileSize = ReadU4(f); if(ReadString(f, 4) != string("LWO2")) - throw runtime_error("Not a valid LWO file (not LWO2 format)."); + throw_runtime_error("Not a valid LWO file (not LWO2 format)."); // Start with an empty mesh aMesh->Clear(); @@ -333,7 +333,7 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) // Check point count uint32 newPoints = chunkSize / 12; if((newPoints * 12) != chunkSize) - throw runtime_error("Not a valid LWO file (invalid PNTS chunk)."); + throw_runtime_error("Not a valid LWO file (invalid PNTS chunk)."); // Read points (relative to current pivot point) aMesh->mVertices.resize(pointCount + newPoints); @@ -347,7 +347,7 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) { // POLS before PNTS? if(!havePoints) - throw runtime_error("Not a valid LWO file (POLS chunk before PNTS chunk)."); + throw_runtime_error("Not a valid LWO file (POLS chunk before PNTS chunk)."); // Check that we have a FACE or PTCH descriptor. string type = ReadString(f, 4); @@ -424,7 +424,7 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) if((type == string("RGB ")) || (type == string("RGBA"))) { // Resize the mesh colors array - uint32 oldSize = aMesh->mColors.size(); + uint32 oldSize = (uint32)aMesh->mColors.size(); aMesh->mColors.resize(pointCount); for(uint32 i = oldSize; i < pointCount; ++ i) aMesh->mColors[i] = Vector4(1.0f, 1.0f, 1.0f, 1.0f); @@ -456,7 +456,7 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) else if((type == string("TXUV"))) { // Resize the mesh UV array - uint32 oldSize = aMesh->mTexCoords.size(); + uint32 oldSize = (uint32)aMesh->mTexCoords.size(); aMesh->mTexCoords.resize(pointCount); for(uint32 i = oldSize; i < pointCount; ++ i) aMesh->mTexCoords[i] = Vector2(0.0f, 0.0f); @@ -491,7 +491,7 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) // Post-adjustment: color array (if any) if((aMesh->mColors.size() > 0) && (aMesh->mColors.size() < pointCount)) { - uint32 oldSize = aMesh->mColors.size(); + uint32 oldSize = (uint32)aMesh->mColors.size(); aMesh->mColors.resize(pointCount); for(uint32 i = oldSize; i < pointCount; ++ i) aMesh->mColors[i] = Vector4(1.0f, 1.0f, 1.0f, 1.0f); @@ -500,7 +500,7 @@ void Import_LWO(const char * aFileName, Mesh * aMesh) // Post-adjustment: texture coordinate array (if any) if((aMesh->mTexCoords.size() > 0) && (aMesh->mTexCoords.size() < pointCount)) { - uint32 oldSize = aMesh->mTexCoords.size(); + uint32 oldSize = (uint32)aMesh->mTexCoords.size(); aMesh->mTexCoords.resize(pointCount); for(uint32 i = oldSize; i < pointCount; ++ i) aMesh->mTexCoords[i] = Vector2(0.0f, 0.0f); @@ -515,7 +515,7 @@ void Export_LWO(const char * aFileName, Mesh * aMesh, Options &aOptions) { // Check if we can support this mesh (too many vertices?) if(aMesh->mVertices.size() > 0x00ffffff) - throw runtime_error("Too large mesh (not supported by the LWO file format)."); + throw_runtime_error("Too large mesh (not supported by the LWO file format)."); // What should we export? bool exportComment = (aMesh->mComment.size() > 0); @@ -523,7 +523,7 @@ void Export_LWO(const char * aFileName, Mesh * aMesh, Options &aOptions) bool exportColors = aMesh->HasColors() && !aOptions.mNoColors; // Calculate the sizes of the individual chunks - uint32 textSize = aMesh->mComment.size() + 1; + uint32 textSize = (uint32)aMesh->mComment.size() + 1; if(textSize & 1) ++ textSize; uint32 tagsSize = 8; uint32 layrSize = 24; @@ -548,7 +548,7 @@ void Export_LWO(const char * aFileName, Mesh * aMesh, Options &aOptions) // Open the output file ofstream f(aFileName, ios::out | ios::binary); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // File header WriteString(f, "FORM"); diff --git a/3rdparty/openctm/tools/mesh.cpp b/3rdparty/openctm/tools/mesh.cpp index 623b9912..c6a8947f 100644 --- a/3rdparty/openctm/tools/mesh.cpp +++ b/3rdparty/openctm/tools/mesh.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <openctm.h> #include <cmath> #include "mesh.h" @@ -73,8 +73,8 @@ void Mesh::Clear() /// Automatic detection of the optimal normal calculation method Mesh::NormalCalcAlgo Mesh::DetectNormalCalculationMethod() { - unsigned int triCount = mIndices.size() / 3; - unsigned int vertexCount = mVertices.size(); + unsigned int triCount = (unsigned int)(mIndices.size() / 3); + unsigned int vertexCount = (unsigned int)(mVertices.size() ); // Calculate the mean edge length double meanEdgeLen = 0; @@ -169,7 +169,7 @@ void Mesh::CalculateNormals(NormalCalcAlgo aAlgo) mNormals[i] = Vector3(0.0f, 0.0f, 0.0f); // Calculate sum of the flat normals of the neighbouring triangles - unsigned int triCount = mIndices.size() / 3; + unsigned int triCount = (unsigned int)(mIndices.size() / 3); for(unsigned int i = 0; i < triCount; ++ i) { // Calculate the weighted flat normal for this triangle diff --git a/3rdparty/openctm/tools/meshio.cpp b/3rdparty/openctm/tools/meshio.cpp index 52e84412..270641be 100644 --- a/3rdparty/openctm/tools/meshio.cpp +++ b/3rdparty/openctm/tools/meshio.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <string> #include <list> #include "mesh.h" @@ -68,7 +68,7 @@ void ImportMesh(const char * aFileName, Mesh * aMesh) else if(fileExt == string(".WRL")) Import_WRL(aFileName, aMesh); else - throw runtime_error("Unknown input file extension."); + throw_runtime_error("Unknown input file extension."); } /// Export a mesh to a file. @@ -94,7 +94,7 @@ void ExportMesh(const char * aFileName, Mesh * aMesh, Options &aOptions) else if(fileExt == string(".WRL")) Export_WRL(aFileName, aMesh, aOptions); else - throw runtime_error("Unknown output file extension."); + throw_runtime_error("Unknown output file extension."); } /// Return a list of supported formats. diff --git a/3rdparty/openctm/tools/obj.cpp b/3rdparty/openctm/tools/obj.cpp index 5ed49aa5..75e7012e 100644 --- a/3rdparty/openctm/tools/obj.cpp +++ b/3rdparty/openctm/tools/obj.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <iomanip> #include <string> @@ -108,9 +108,9 @@ class OBJFace { if(value > 0) value --; else if(value < 0) - throw runtime_error("Negative vertex references in OBJ files are not supported."); + throw_runtime_error("Negative vertex references in OBJ files are not supported."); else - throw runtime_error("Invalid index (zero) in OBJ file."); + throw_runtime_error("Invalid index (zero) in OBJ file."); } n.Set(j, value); } @@ -150,7 +150,7 @@ void Import_OBJ(const char * aFileName, Mesh * aMesh) // Open the input file ifstream inFile(aFileName, ios::in); if(inFile.fail()) - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); // Mesh description - parsed from the OBJ file list<Vector3> vertices; @@ -201,7 +201,7 @@ void Import_OBJ(const char * aFileName, Mesh * aMesh) int triCount = 0; for(list<OBJFace>::iterator i = faces.begin(); i != faces.end(); ++ i) { - int nodeCount = (*i).mNodes.size(); + int nodeCount = (int)((*i).mNodes.size()); if(nodeCount >= 3) triCount += (nodeCount - 2); } @@ -269,7 +269,7 @@ void Export_OBJ(const char * aFileName, Mesh * aMesh, Options &aOptions) // Open the output file ofstream f(aFileName, ios::out); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // What should we export? bool exportTexCoords = aMesh->HasTexCoords() && !aOptions.mNoTexCoords; @@ -312,7 +312,7 @@ void Export_OBJ(const char * aFileName, Mesh * aMesh, Options &aOptions) } // Write faces - unsigned int triCount = aMesh->mIndices.size() / 3; + unsigned int triCount = (unsigned int)(aMesh->mIndices.size() / 3); f << "s 1" << endl; // Put all faces in the same smoothing group for(unsigned int i = 0; i < triCount; ++ i) { diff --git a/3rdparty/openctm/tools/off.cpp b/3rdparty/openctm/tools/off.cpp index 6a40934d..ac427a72 100644 --- a/3rdparty/openctm/tools/off.cpp +++ b/3rdparty/openctm/tools/off.cpp @@ -32,7 +32,7 @@ // http://people.sc.fsu.edu/~burkardt/data/off/off.html //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <iomanip> #include <string> @@ -99,7 +99,7 @@ void Import_OFF(const char * aFileName, Mesh * aMesh) // Open the input file ifstream f(aFileName, ios::in); if(f.fail()) - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); // Some state variables that we need... unsigned int numVertices; @@ -110,16 +110,16 @@ void Import_OFF(const char * aFileName, Mesh * aMesh) // Read header ReadNextLine(f, line, comment); if(line != string("OFF")) - throw runtime_error("Not a valid OFF format file (missing OFF signature)."); + throw_runtime_error("Not a valid OFF format file (missing OFF signature)."); ReadNextLine(f, line, comment); sstr.clear(); sstr.str(line); sstr >> numVertices; sstr >> numFaces; if(numVertices < 1) - throw runtime_error("Not a valid OFF format file (bad vertex count)."); + throw_runtime_error("Not a valid OFF format file (bad vertex count)."); if(numFaces < 1) - throw runtime_error("Not a valid OFF format file (bad face count)."); + throw_runtime_error("Not a valid OFF format file (bad face count)."); // Read vertices aMesh->mVertices.resize(numVertices); @@ -199,7 +199,7 @@ void Export_OFF(const char * aFileName, Mesh * aMesh, Options &aOptions) // Open the output file ofstream f(aFileName, ios::out); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // Mesh information unsigned int numVertices = (unsigned int) aMesh->mVertices.size(); diff --git a/3rdparty/openctm/tools/ply.cpp b/3rdparty/openctm/tools/ply.cpp index 2bacaae4..fcbe18d2 100644 --- a/3rdparty/openctm/tools/ply.cpp +++ b/3rdparty/openctm/tools/ply.cpp @@ -26,7 +26,7 @@ //----------------------------------------------------------------------------- #include <iostream> -#include <stdexcept> +#include "common.h" #include <string> #include <fstream> #include <iomanip> @@ -169,9 +169,9 @@ void Import_PLY(const char * aFileName, Mesh * aMesh) // Open the PLY file p_ply ply = ply_open(aFileName, NULL); if(!ply) - throw runtime_error("Unable to open PLY file."); + throw_runtime_error("Unable to open PLY file."); if(!ply_read_header(ply)) - throw runtime_error("Invalid PLY file."); + throw_runtime_error("Invalid PLY file."); // Get the file comment (if any) bool firstComment = true; @@ -212,7 +212,7 @@ void Import_PLY(const char * aFileName, Mesh * aMesh) // Sanity check if((faceCount < 1) || (vertexCount < 1)) - throw runtime_error("Empty PLY mesh - invalid file format?"); + throw_runtime_error("Empty PLY mesh - invalid file format?"); // Prepare the mesh aMesh->mIndices.resize(faceCount * 3); @@ -223,7 +223,7 @@ void Import_PLY(const char * aFileName, Mesh * aMesh) // Read the PLY file if(!ply_read(ply)) - throw runtime_error("Unable to load PLY file."); + throw_runtime_error("Unable to load PLY file."); // Close the PLY file ply_close(ply); @@ -243,7 +243,7 @@ void Export_PLY(const char * aFileName, Mesh * aMesh, Options &aOptions) // Open the output file ofstream f(aFileName, ios::out | ios::binary); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // Set floating point precision f << setprecision(8); diff --git a/3rdparty/openctm/tools/stl.cpp b/3rdparty/openctm/tools/stl.cpp index 70a6a720..cf07a607 100644 --- a/3rdparty/openctm/tools/stl.cpp +++ b/3rdparty/openctm/tools/stl.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <string> #include <vector> @@ -115,14 +115,14 @@ void Import_STL(const char * aFileName, Mesh * aMesh) // Open the input file ifstream f(aFileName, ios::in | ios::binary); if(f.fail()) - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); // Get the file size f.seekg(0, ios::end); uint32 fileSize = (uint32) f.tellg(); f.seekg(0, ios::beg); if(fileSize < 84) - throw runtime_error("Invalid format - not a valid STL file."); + throw_runtime_error("Invalid format - not a valid STL file."); // Read header (80 character comment + triangle count) char comment[81]; @@ -131,7 +131,7 @@ void Import_STL(const char * aFileName, Mesh * aMesh) aMesh->mComment = string(comment); uint32 triangleCount = ReadInt32(f); if(fileSize != (84 + triangleCount * 50)) - throw runtime_error("Invalid format - not a valid STL file."); + throw_runtime_error("Invalid format - not a valid STL file."); if(triangleCount > 0) { @@ -192,7 +192,7 @@ void Export_STL(const char * aFileName, Mesh * aMesh, Options &aOptions) // Open the output file ofstream f(aFileName, ios::out | ios::binary); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // Write header (80-character comment + triangle count) char comment[80]; @@ -204,7 +204,7 @@ void Export_STL(const char * aFileName, Mesh * aMesh, Options &aOptions) comment[i] = 0; } f.write(comment, 80); - uint32 triangleCount = aMesh->mIndices.size() / 3; + uint32 triangleCount = (CTMuint)(aMesh->mIndices.size() / 3); WriteInt32(f, triangleCount); // Write the triangle data diff --git a/3rdparty/openctm/tools/wrl.cpp b/3rdparty/openctm/tools/wrl.cpp index e39286f3..00bdcb54 100644 --- a/3rdparty/openctm/tools/wrl.cpp +++ b/3rdparty/openctm/tools/wrl.cpp @@ -25,7 +25,7 @@ // distribution. //----------------------------------------------------------------------------- -#include <stdexcept> +#include "common.h" #include <fstream> #include <iomanip> #include <string> @@ -55,14 +55,14 @@ class VRMLReader { char GetNextChar() { if(!mStream) - throw runtime_error("VRML input stream undefined."); + throw_runtime_error("VRML input stream undefined."); if(mBufPos >= mBufActual) { mBufPos = 0; if(!mStream->eof()) { mStream->read(mBuffer, mBufSize); - mBufActual = mStream->gcount(); + mBufActual = (int)(mStream->gcount()); } else mBufActual = 0; @@ -172,7 +172,7 @@ class VRMLReader { // Read the header string header = GetNextLine(); if(header.substr(0, 10) != string("#VRML V2.0")) - throw runtime_error("Not a valid VRML 2.0 file."); + throw_runtime_error("Not a valid VRML 2.0 file."); // Read the rest of the file while(!mEndOfFile) @@ -201,7 +201,7 @@ class VRMLReader { void Import_WRL(const char * aFileName, Mesh * aMesh) { // FIXME: The import functionality has not yet been fully implemented - throw runtime_error("VRML import is not yet supported."); + throw_runtime_error("VRML import is not yet supported."); // Clear the mesh aMesh->Clear(); @@ -209,7 +209,7 @@ void Import_WRL(const char * aFileName, Mesh * aMesh) // Open the input file ifstream f(aFileName, ios::in); if(f.fail()) - throw runtime_error("Could not open input file."); + throw_runtime_error("Could not open input file."); // Initialize the reader object VRMLReader reader; @@ -228,7 +228,7 @@ void Export_WRL(const char * aFileName, Mesh * aMesh, Options &aOptions) // Open the output file ofstream f(aFileName, ios::out); if(f.fail()) - throw runtime_error("Could not open output file."); + throw_runtime_error("Could not open output file."); // Set floating point precision f << setprecision(8); @@ -284,7 +284,7 @@ void Export_WRL(const char * aFileName, Mesh * aMesh, Options &aOptions) // Write faces f << "\t\t\t\tcoordIndex [" << endl; - unsigned int triCount = aMesh->mIndices.size() / 3; + unsigned int triCount = (unsigned int)(aMesh->mIndices.size() / 3); for(unsigned int i = 0; i < triCount; ++ i) { f << "\t\t\t\t\t" << diff --git a/README.md b/README.md index 7197d81a..7047658b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ bgfx ==== +What is it? +----------- + Cross-platform rendering library. Supported rendering backends: @@ -65,7 +68,7 @@ directory link to directory without spaces in the path. ### Building for Native Client (Pepper 22) on Windows -Download Native Client SDK from +Download Native Client SDK from: [https://developers.google.com/native-client/sdk/download](https://developers.google.com/native-client/sdk/download) setx NACL <path to Native Client SDK directory>\toolchain\win_x86_newlib @@ -84,7 +87,7 @@ Other platforms: make -R <configuration> -Configuration is <platform>-<debug/release><32/64>. For example: +Configuration is `<platform>-<debug/release><32/64>`. For example: linux-release32, nacl-debug64, android-release32, etc. @@ -112,6 +115,69 @@ Geometry instancing. ### 06-bump Loading textures. +Internals +--------- + +bgfx is using sort-based draw call bucketing. This means that submition order +doesn't necessarily matches the rendering order. On the high level this allows +submitting draw calls for all passes at one place, but on the low-level they +will be sorted and ordered correctly. This sometimes creates undesired results +usually for GUI rendering, where draw order should usually match submit order. +bgfx provides way to enable sequential rendering for these cases (see +`bgfx::setViewSeq`). + +Internally All low-level rendering draw calls are issued inside single function +`Context::rendererSubmit`. This function exist inside each renderer backend +implementation. + +More detailed description of sort-based draw call bucketing can be found at: +[Order your graphics draw calls around!](http://realtimecollisiondetection.net/blog/?p=86) + +Customization +------------- + +By default each platform has sane default values. For example on Windows default +renderer is DirectX9, and on Linux it is OpenGL 2.1. On Windows platform all +rendering backends are available. For OpenGL ES on desktop you can find more +information at: +[OpenGL ES 2.0 and EGL on desktop](http://www.g-truc.net/post-0457.html) + +All configuration settings are located inside [src/config.h](src/config.h). + +Every `BGFX_CONFIG_*` setting can be changed by passing defines thru compiler +switches. For example setting preprocessor define `BGFX_CONFIG_RENDERER_OPENGL=1` +on Windows will change backend renderer to OpenGL 2.1. on Windows. Since +rendering APIs are platform specific, this obviously won't work nor make sense +in all cases. Certain platforms have only single choice, for example the Native +Client works only with OpenGL ES 2.0 renderer, using anything other than that +will result in build errors. + +Tools +----- + +### Shader Compiler (shaderc) + +bgfx cross-platform shader language is based on GLSL syntax. It's uses ANSI C +preprocessor to transform GLSL like language syntax into HLSL. This technique +has certain drawbacks, but overall it's simple and allows quick authoring of +cross-platform shaders. + +### Texture Compiler (texturec) + +### Geometry Compiler (geometryc) + +Todo +---- + + - Multiple render targets. + - BlendFuncSeparate and BlendEquationSeparate. + - Copy from texture to texture. + - Occlusion queries. + - OSX and iOS platforms. + - DX11: MSAA. + - GL: MSAA. + - GL: ARB_vertex_array_object + OES_vertex_array_object. + Notice ------ @@ -127,8 +193,45 @@ http://www.stuckingeometry.com Project page https://github.com/bkaradzic/bgfx -License -------- +3rd Party Libraries +------------------- + +All required 3rd party libraries are included in bgfx repository in [3rdparty/](3rdparty/) +directory. + +### edtaa3 (MIT) + +Contour Rendering by Distance Fields + +https://github.com/OpenGLInsights/OpenGLInsightsCode/tree/master/Chapter%2012%202D%20Shape%20Rendering%20by%20Distance%20Fields + +### fcpp (BSD) + +Frexx C preprocessor + +https://github.com/bagder/fcpp + +### glsl-optimizer (MIT) + +GLSL optimizer based on Mesa's GLSL compiler. Used in Unity for mobile shader +optimization. + +https://github.com/aras-p/glsl-optimizer + +### OpenCTM (Zlib) + +OpenCTM � the Open Compressed Triangle Mesh file format � is a +file format, a software library and a tool set for compression of 3D triangle +meshes. + +http://openctm.sourceforge.net/ + +### stb_image (Public Domain) + +http://nothings.org/stb_image.c + +License (BSD 2-clause) +---------------------- Copyright 2010-2012 Branimir Karadzic. All rights reserved. diff --git a/examples/01-cubes/makefile b/examples/01-cubes/makefile index 3d8f5374..3bb2f87f 100644 --- a/examples/01-cubes/makefile +++ b/examples/01-cubes/makefile @@ -5,6 +5,7 @@ BGFX_DIR=../.. RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/02-metaballs/makefile b/examples/02-metaballs/makefile index 3d8f5374..3bb2f87f 100644 --- a/examples/02-metaballs/makefile +++ b/examples/02-metaballs/makefile @@ -5,6 +5,7 @@ BGFX_DIR=../.. RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/03-raymarch/makefile b/examples/03-raymarch/makefile index 3d8f5374..3bb2f87f 100644 --- a/examples/03-raymarch/makefile +++ b/examples/03-raymarch/makefile @@ -5,6 +5,7 @@ BGFX_DIR=../.. RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/04-mesh/makefile b/examples/04-mesh/makefile index 3d8f5374..3bb2f87f 100644 --- a/examples/04-mesh/makefile +++ b/examples/04-mesh/makefile @@ -5,6 +5,7 @@ BGFX_DIR=../.. RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/05-instancing/makefile b/examples/05-instancing/makefile index 3d8f5374..3bb2f87f 100644 --- a/examples/05-instancing/makefile +++ b/examples/05-instancing/makefile @@ -5,6 +5,7 @@ BGFX_DIR=../.. RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/06-bump/bump.cpp b/examples/06-bump/bump.cpp index c7ee52e2..4464f1e2 100644 --- a/examples/06-bump/bump.cpp +++ b/examples/06-bump/bump.cpp @@ -429,7 +429,7 @@ int _main_(int _argc, char** _argv) } } - uint16_t numInstances = (data - idb->data)/instanceStride; + uint16_t numInstances = (uint16_t)( (data - idb->data)/instanceStride); // Set vertex and fragment shaders. bgfx::setProgram(program); diff --git a/examples/06-bump/makefile b/examples/06-bump/makefile index 3d8f5374..3bb2f87f 100644 --- a/examples/06-bump/makefile +++ b/examples/06-bump/makefile @@ -5,6 +5,7 @@ BGFX_DIR=../.. RUNTIME_DIR=$(BGFX_DIR)/examples/runtime +BUILD_DIR=../../.build include $(BGFX_DIR)/premake/shader.mk diff --git a/examples/common/dbg.cpp b/examples/common/dbg.cpp index dbd7eba4..3d8be1ee 100644 --- a/examples/common/dbg.cpp +++ b/examples/common/dbg.cpp @@ -11,6 +11,7 @@ #include <ctype.h> // isprint #include "dbg.h" +#include <bx/string.h> #if BX_COMPILER_MSVC # define snprintf _snprintf @@ -36,9 +37,15 @@ void dbgOutput(const char* _out) void dbgPrintfVargs(const char* _format, va_list _argList) { char temp[8192]; - vsnprintf(temp, sizeof(temp), _format, _argList); - temp[sizeof(temp)-1] = '\0'; - dbgOutput(temp); + char* out = temp; + int32_t len = bx::vsnprintf(out, sizeof(temp), _format, _argList); + if (sizeof(temp) < len) + { + out = (char*)alloca(len+1); + len = bx::vsnprintf(out, len, _format, _argList); + } + out[len] = '\0'; + dbgOutput(out); } void dbgPrintf(const char* _format, ...) diff --git a/examples/runtime/shaders/dx11/fs_bump.bin b/examples/runtime/shaders/dx11/fs_bump.bin index 7ffd8b16178a15b74022a5022fe8d2e9e2f81070..453e9aed7ab9b42c83f229e089074b0360bbaf73 100644 GIT binary patch delta 421 zcmZ3XxIvM_E!cx$GLN*_1a|?whAGQ=X2mZmIU68<V~<1h#&8qndIl(92GWc`%+Aih zuo@-^q(S0LQ1Q)Z;vhL@AOR8wsR03y7z+>sjRA{;%me|DI4cl?%nuHW5AYB64Ds~$ zlVI@k5At>NVF+>bb9eO%VF+=JaQ62Pa+$2evQQLcXp#T}vylLhfU=7w-(aa`WZfLX zI-L<ny<u}_lm)4q#x4N%fB?`ACk6qqgWQCGVv_?nq*X!Am?i=dHDX}kDgvqinFtaC z$*D;K<t9(yux4c5e1?OWk&$Wg1x{&3#>sCup95{V!j%lM#f=GK2Fw<aS0T16;8UJl Z&a(ojSb-OZVvvO}#fyO!x$vhj0szemJD~so delta 391 zcmdm>xI%Fvhr7T>cHSV5cSbwkMoD!{Y>3*qG2Vo^o{<3pn1K|C&CbriumngmL4+AV z;vhCqm|-nc3`Bv%K^UZd3rGM8Kw>OF3^NB=oE6An1}X>+ix2P*_6+g#_mf}<agA{H z_YZPm@beGyb@X8farAR{^$VG-#j;QoWLS~_19Opp0N79v+i3CwmTE@E%`vRg8G+On zHg`rwmdQ38(vBe2)7S;T-mn0=pojse94MwH38ANnKuj@WVBmtufy7{HSSHWlux4c4 ze1(IVQ5NI}kYOMIB-x#SBuLCn2&iH57tZHEyYFx%gY0(Tk!EC`9K&-OD5Sv)7V6=H R2q{lK&DQ`l(uY5V5db+;It>5- diff --git a/examples/runtime/shaders/dx11/fs_cubes.bin b/examples/runtime/shaders/dx11/fs_cubes.bin index 96fcba2669f25e91350d7b12616dc8aa08c7f22e..edb799f9263fc5676f7f727516c8ed0cb8da1f95 100644 GIT binary patch delta 16 XcmaFH{EnH!E!cx$N%wot4bK<>Hd+S4 delta 8 PcmaFI{ET@c$1_F%5vc=v diff --git a/examples/runtime/shaders/dx11/fs_instancing.bin b/examples/runtime/shaders/dx11/fs_instancing.bin index 96fcba2669f25e91350d7b12616dc8aa08c7f22e..edb799f9263fc5676f7f727516c8ed0cb8da1f95 100644 GIT binary patch delta 16 XcmaFH{EnH!E!cx$N%wot4bK<>Hd+S4 delta 8 PcmaFI{ET@c$1_F%5vc=v diff --git a/examples/runtime/shaders/dx11/fs_mesh.bin b/examples/runtime/shaders/dx11/fs_mesh.bin index 36d0e7e52a86f181cd9fe2987d3cdbb5eebf5ea2..f4a8c6257e731d0432030a9a85d9c560f037379f 100644 GIT binary patch delta 257 zcmcaD_*js`E!cx$>Ri{~6VwDWpDKK;<m8XwmCsn8aW*VvqnQd*Jp&Xl18GJe=4WSM zm;@69(jajrAZ7=O&jivSH6Q>I2Vs~vNDT;p#8`kBBpw_VAK)MC8RF^h$KdSm;~&J} z=O5(j=)(}=8sY5kALPQYdh$)Cm7E~;ZbAYKER(yL^<_ak0iXd*AQCDAG99FXY4UYu leNhn4h=G9<rb0^qD6?6b<vSxI^JZbTZbnAN&GXr97y;_yCdB{% delta 243 zcmaDXcw2BHhnhgy^=$o^lgBgszRKvB$*k|(Xs5zd&&U7)%s>jnW@l$$=mFA95Mc(8 zIEW1rp9&QNQ6O;;28quB2|xizj0K4Kf#Sho@d5t9o*|z8eheY55zhYpK`sn_{z1Nu zJ`B$OKK?-rt0zBXS~>X|v%ut8%o?&Fdjx<+Hi1YWa1#;$+X1F0-)Ghr1(|Ndz`zMp cp(OxRv00hrJ0m0GW@)x=Mn;y+%h_!h0c!arzyJUM diff --git a/examples/runtime/shaders/dx11/fs_metaballs.bin b/examples/runtime/shaders/dx11/fs_metaballs.bin index 3b8209216b4e809a27590a97e35353316afb8bf4..cbd93d7ad0003b5cd9e944f1410bf45e58c92d0c 100644 GIT binary patch delta 155 zcmeyx*2K=?7VN>mtn<}=f~0^^T1rONf<yM-RXm;B?kOIasJX<A0ScIbG$Ro6^D{6c zLD?WFkT??%v$HcW1c${3_y>E2c>4P>IQ#qf2Qh@WMmYQX2f0iZX7u9yBp?7bB1wRO kxoC10qc$f<qnnTb1JmSrjQWgBlg}}hGcs;=V=`d`01-?cj{pDw delta 169 zcmZo-|HY=sz`*byh#>@s!N8Eh>=NPRtoxmR^0o<&R<B8)BQBx)BYL9Y5;sPO0tRLv z4PvviGccq=#XuBDoC%2e`5733!{P({gFQn${rwn1TqB(Q{exT>oc(?LgC<Kedhr$s q2!M@95@2BdG`WaTn-gT9n-EZR@-jw!M#jn47|R)%Hv2J|FaiMh<{$<D diff --git a/examples/runtime/shaders/dx11/fs_raymarching.bin b/examples/runtime/shaders/dx11/fs_raymarching.bin index 1f56054b778b33dc9313b9df49f2b9a746eeeb83..ee9f53def406ac7801191192804cb7906711bfa9 100644 GIT binary patch delta 16 XcmX>ed_I`NE!cyBvH8=(4aYSBIV=Yq delta 8 PcmX>fd^~s~$8k*n6QKj< diff --git a/examples/runtime/shaders/dx11/vs_bump.bin b/examples/runtime/shaders/dx11/vs_bump.bin index 0e8bc9a0a538d9bf39fe0b01a7c4641e76fe98c8..942b71635574e3e89a1d8cfad5bcb50630a90088 100644 GIT binary patch delta 593 zcmY*VJxc>Y5S`szk~;}x4HrL16BP>un-m%mgtNF9)Jycjwc3c560FiF{sLkDK(Mhe zjRcESmfHCf?8HJOjUZOeyWC0~n48&oZ{Ez@yE}C4DBLEUD@|Rmsh?TuKHMxtosGd@ z`s>ZVuMLHG(N%ey4;lx1-Yzv8VZBvv1o~5YMM^BiQLtxiqC4G`Zoo<3pd3MnJvXY$ z1VhbYM<e(UfuWveM?H)V^{brIPpRH|rL1D?m?>?}(Q9(>Pl+UAm0R1SI3tRRiiGZ2 zB_Z^)wZPvG>v6I|lm`P7{Q@)lN0}Yrtnyq4i+(qIA{NaP`}$H5B5Gz2U-3TLa%%fL z(S{y2iqfOW{#BV@qpNt{guzW6SSHyL>gfIBX_c9|NQ!0+oCacI@j&FJ*$CtJG0UFk tOCSmyHIA1aM;P$J7@nN?4`10DBgB7dOkk4_3tL|6oW+*e)B4*v`vtXZMZW+5 delta 624 zcmZWmJxc>Y5S{x<?t<Vc5z-k=XCnmBAR?Y7C-LJ>l1s1<tOAx2Y%C;dWvkoR*eR(Z zXtWb-tVREYWeV+`m)!-yg=J>n%zN{(gX~xK(p~U3#N5kRY4PXo=IrG7xlwtD2Zr$} zR?M!rx2A+^&2|iu$6^CN?GoLxH6={I;REj}3<fwZ@FxK30JHgOoxixl4{L;|-rV1b z>(!(hM>$F=yK8Y=D^nELwu3E7f@r-GCF0%cHQIT9Sfs@~_z;F)WFKM&+#9eG*K3o{ z9#L~b+HhRv6p1_?OZglVA9leY@om4h=7}8WV(`$EJl1lN53K1Zt@Av;<bqf)^QdZt z7ZOJ-r7>4>kvFU>mb_fal0uv}6bC^U43#)G$D~nR90M5rH)qr67t(u%=(=T(RorQA z*c8{^WC#BO6=hEY$nw!+VKq7q<|>#9QzQT5pbKyihmKx#$g4wanYU0+g5(Gj&oE$L HWe$G<ogPKE diff --git a/examples/runtime/shaders/dx11/vs_cubes.bin b/examples/runtime/shaders/dx11/vs_cubes.bin index 2fd2d2db35a2516fae1c4db4a55b15616fa79a87..985db473f88c828ae7d23e4412f583d259aa3a1b 100644 GIT binary patch delta 125 zcmZ3(v4w*pEZBo#N%wot3Hk!HW}m*@EZF^jQa-2T$}PTYHrl^o)Z*u7V6bCA0A?VQ z5s2B@85o@Xef)zM0{nwLLp=TcCWkUr@qQ8z0IQ8>U|=qqe22-Jk#VvFvo?@)VO9r{ OIn36K43k$dw*Uahq#pwS delta 117 zcmdnOv4&$JhrYlsx%jEeF8?}kJ7(SI6$}PC8{OY9YO%93FgP+G05g!u2*mvS3=9GO z!JZ+W{(cP3{yzRelVh2xc#8xCz-r?e7??jze!^tU$S_%fSsO_DFslQ}5@u^g#>pF) FTL3?p8|eT5 diff --git a/examples/runtime/shaders/dx11/vs_instancing.bin b/examples/runtime/shaders/dx11/vs_instancing.bin index a4b7c4252c9216bfa5c7c63c28b74177efb5797d..e61505d8c9c96e8a7def0489cbaefc792ce424a5 100644 GIT binary patch delta 128 zcmey&^_z<$EZBo#N%wot30eZP7XMJy`}TM3gdbc9Wwz=a8?D|jO7ZhEFl=K$0A?VQ z5s2B@Cp$1z@j3hZ_y;ir_y>E2c>4QIKEc$)`$<3mtUR89fw^dMICD88<K*+q(m?Vx Rvoet6XSvSEF!?!44*;aBBDw$o delta 142 zcmey(^_goThn9ff%ARxo4AtMwe6N1r_jNSmMyEH7Qta#u3_BSRfEmbS1Y&;v$sSBq zd;$K!o*|z8ehkk3KK?<IFEBOn76}M|mB%wMFn^jH&s;7G;=0KRFo5(LF)(m`Vt}Y% X1F4++nOT{UVX`>Obw<X??^${PWp^M< diff --git a/examples/runtime/shaders/dx11/vs_mesh.bin b/examples/runtime/shaders/dx11/vs_mesh.bin index a23d53402f72afb6cc51af35eb83f1f491415f99..0dbc2af85c3196ea672ceb0b468245af43329cf1 100644 GIT binary patch delta 466 zcmey)|DT^DEZBo#>Ri{~6Z`~n?^aoyuVE=RjnQ4dw&RQM#yABgM*GS2Oyc~0{z1Nu zJ`4f=!JZ+W{(h5}GU?VcKmjw5W&~n>Af5yj15qGxCLm_#U|^UDq(N#x03;5=FmaF? z5CDm>05M2BI4mA!7lX6EkADyY)CD1~5zhYpK`sodCkHb7GJcvopIMo)X!2oZdq&2| z%q)i)873cRsRy#%S>u7^a@O^lAamWA1i)@FV_;xyQV;;Uh0y^h!O&oD!N9;#!~m3^ z{F}|%6yzEs1_rJopehjCtw{k$GBEG~@iHy}Fx!n8Lc?@2OwMMLt_PU`0x%ssKsFmt z4CHT+{U87~8BHC`WMp+fr5qp^fWiZ&7iKOfob7<Y864smQUYYl05Q;ylRMe-00CJ; Ap#T5? delta 416 zcmey*|DAs#ho69N#?|w0wr&0PXX%I79i`=+8`Bh+)EyZRfEmbS1Y&k}28ICtV9yXw ze?JC4{~%vSpUG>Pbn8KKAOKg#!NAZ1<THUqA>tr5J5YQoR18Fc)Ppccd=5we3P55k zK+F%s!C~=mD??l(oc;ZST%dL{IQ#qf2QjRk9Lem<STuP#vohnS$)}m^85t&Xvm9n* zoP3_8o{?p;KWjWtWIgM8S&%#3m;}J?vS47~C}M!H!&n6v7$^6$iEDyYbSMDTF);7| zF&j_?Sd0Ur(uje93#5y2vOT+m0W(ArsE(sZ0ipn8JXk}M0#F#@1(;QgliS&>c|o#Z hV}LrCC!c4N7cpaCU~K~OKwf5a01^xh_LJ+_8v$m6K5GB~ diff --git a/examples/runtime/shaders/dx11/vs_metaballs.bin b/examples/runtime/shaders/dx11/vs_metaballs.bin index 31f7a3177424753e2d9df364fe1d2f5afe4d67f0..aa218c8fb5324e3fe43e72a1fea1d3a22b728c43 100644 GIT binary patch delta 273 zcmZqT>f+)E3-(}O*7<5b!B)WF*2A4y%oV%h+3&J*Urbim==+9|m7kx1A#Ac8lelgy z0|GDunM^>;&d$K#?C;|r#Ng*2<m>3e5a1u|8RF^hH@S&P-wmc7q?!?kfkrVTLD@ix z0d5Kh14D3FJWMat#1PjAXMg`7m&xCm)EGZamSYyzED{g^Tbs_n!175!0AvQ(;8dVl zAU?<v5W8q{9J4$l)8sm4Z6LXdSsh4TV%8QkV_;x~sdJM9>Yx0JIT$GC$09$uk);s; D2+uM@ delta 279 zcmeC;YT}y6VJlGHapK^^15fqeZ#55V-}v|c#?Uv6p6u)l43P{7zzk$E0x?KD0U^u) z5@!Npetrgq0RLdm5Kn(U20#BGUq>GXXMZ36pvhfK`febdAOJUogMlFxA_Nx)n*!to zhsDDU3UQ5a_V*8Rfg1InNlmgyKme>I9%vef4Kf<U{xsQ+S(>*<0U`o494L~;EYHX= uxs6#HNN!?Q2a>m#wI@rm1TZpA&SH@lG-F_3{RGqjvf51!NKbBKX#oJ-S~21P diff --git a/examples/runtime/shaders/dx11/vs_raymarching.bin b/examples/runtime/shaders/dx11/vs_raymarching.bin index 7b7d5ab420901d8a37ba43e3077c05dc59df9712..0e3c8e2a5acb3a43f51c8facb494df5be786f07b 100644 GIT binary patch delta 148 zcmbQixqy=+EZBpAvH8=(3Hk!Ye(uj?4AyN6V_CrTS0n%8M*BC6PW=1~3}Flizzk$E z0x>%~14BGQm;oft1jNihhO@tqe-J}}f3RnWr@!CiT&6|5p9BQJih){~izdr32QxBG WE@0LMl5?2Vf#eZpYet4iEHeN#UL70& delta 120 zcmZ3$IfHW|hrU2bTrcmzVA*Kvf1H19u5L))=>CRLik+Q-A(8<Bn1M`2Am-<v?8_v@ z7vLZ48RF^h$KdSm;~zA+lxY!fk$?bLc{~FH^QXxw%)yKdlPj3Df#ecqbs%|$*_x4Y IG6%~H0N=G6BLDyZ diff --git a/examples/runtime/shaders/dx9/fs_bump.bin b/examples/runtime/shaders/dx9/fs_bump.bin index 6cfb60d0f554b7888134dbc7ff7087f9ce07bbc7..ed302f554ec6b8b0b98f58fbe03e5d6f0951eed0 100644 GIT binary patch delta 240 zcmaLQAr8Vo5CzabGrMgCrUp~d10Xm9hTyAE90R)v7icmG$Q}U04G4<V5(Ec8aREdP zvr7#IG0C6(ledSmD~n~bf=;UGX-_i&0+6>gz?o$lv$xEU^zK1Hkn4rkBwBH|AUs=} zPyoVkCVY1?#V*rsf;h{9o2h;402ez!A4mtTiM5iWiC5{$DDo)!DC*YjtQ%aDx}V>4 Q<KKU}xxTWy>F50M0i#_t`2YX_ delta 258 zcmaKmu?@m75Jms_>^L3D1QaPL*nt(Os1OxnV8jBJPJ%K6P%#Bcg%nXRfG41#<?N)P zp*ZP({d@PXYc9>LKGVX10^s8uFbo8mbfwx%+Nox+^t2&JYr365ii8wufDNotqo;Dk z7q1jscqIqD)JF?gF1}Yks87d{H@cHD6IRL)W`U*Ut9CuOYjT%P>2kSC4)&zkwpy3$ T=MUMt&!225@9Ie`cmMhV?%z1c diff --git a/examples/runtime/shaders/dx9/fs_cubes.bin b/examples/runtime/shaders/dx9/fs_cubes.bin index fb14d875cb3699252b5ed2e7c6364394253918a3..d4f476822dad1ebffe91a0e61b8f34dab16c828d 100644 GIT binary patch delta 15 WcmZo<>}2F{3-(}G(*53ZLL&epvjuJd delta 7 OcmeBVY-F6s(FgztnF1#O diff --git a/examples/runtime/shaders/dx9/fs_instancing.bin b/examples/runtime/shaders/dx9/fs_instancing.bin index fb14d875cb3699252b5ed2e7c6364394253918a3..d4f476822dad1ebffe91a0e61b8f34dab16c828d 100644 GIT binary patch delta 15 WcmZo<>}2F{3-(}G(*53ZLL&epvjuJd delta 7 OcmeBVY-F6s(FgztnF1#O diff --git a/examples/runtime/shaders/dx9/fs_mesh.bin b/examples/runtime/shaders/dx9/fs_mesh.bin index 2600a8d0c59b13495c95f16dea9015b2df060a85..f15a9d3aec774b054ed6f25e2fd722e4b89c7af0 100644 GIT binary patch delta 135 zcmeyy`Hz#sE!cx$>Ri{~8$21+xfmE47#P?m$TKi7F$39*P&O+AV*?YM%`~}yQIe5q za~I=sMoR{UClfdr7=WrdfXbgt0AY5Zb`YO|;eP`wP!4Dem<^I+VPF6vpxVh<%*Pp- JCmXRG0RVLU8}$GH delta 125 zcmeyz`HgcUhbN;WD+6N#0|Wa6c?Je1RtBa9Mkt$^fuVs3%H{&HnSpFZpc)1S7NGd5 z1uQ@YP+tSX=1Gjp83maco=o6iU;ygk07^fZz%<#5S(+Ebf+z%vPA+0T&d4~~isc9Z DA1W4u diff --git a/examples/runtime/shaders/dx9/fs_metaballs.bin b/examples/runtime/shaders/dx9/fs_metaballs.bin index 880484781c364263c3307f2ee71adf7c8d0437e4..f33293a39b2217c612451bce1e038d70711b4915 100644 GIT binary patch delta 99 zcmcb~{E(T$E!cyBS?8<$ga$<}28IR(2L1{13=B-H42%to4D1s)7#Nrt!0aaz7$+{2 nW@MbWS6h{VfnfqaP!$sc6HrGel+6NUuY$5U8W<+?GM)hd<q8sb delta 91 zcmaFJe3N-1M}s0O17iaN1N#Jd1_mZB28ISk2L1^g3=GT+VDTpt7$&ZiW@MOnR9lsi ffnfqaP!$sc6Hrwsl+6NUuY$5U8W<;wGM)hd4lfW+ diff --git a/examples/runtime/shaders/dx9/fs_raymarching.bin b/examples/runtime/shaders/dx9/fs_raymarching.bin index 94f0f6f467a216832bf33b3d7f044e82a7a064e8..277fbcf17ddc98f03a635412a5447613544ff15c 100644 GIT binary patch delta 18 acmdn@iRsuUCJwh?4+h5OPY*ZP?F0Z$R0vc6 delta 10 RcmX^1iD};_ri~nSI{_b21swnY diff --git a/examples/runtime/shaders/dx9/vs_bump.bin b/examples/runtime/shaders/dx9/vs_bump.bin index 88382b8a95fea25d5c186e4cb96aeefd765ddb8c..bef532399fca298026c94be94a1631c975330da7 100644 GIT binary patch delta 204 zcmX|*Ee--P5Junhhpm91z#x#E13`i(!6Lavxj{(<0=W{wQMf|IDlULrI_w7bzBe;p z<{sJ*j)y&Yx>~09%tC~DT7%*GIc-%4O;ItaY)1B#E%xU<Cc3|u=qrmB&_u~Md5O<w u^H?~f7`h1E#eu86k-V|bown*EfOVL9J!}ox6+32a)o(N_>j#xn-veLZW-4d^ delta 196 zcmX|)yAi@b3<X!x8DGK>5mN#+5Kspt(1Pf|9)|=3ganjA3l}(|iQ_c(knNM+=b7($ z%-=2Gup17bHrC6jLtN-f96Ho>Wot%TdDA%kJ$Q!|X@2OP=^-DH>8h{2B1M@U=39c) idR?ZYz0Z-3PX<%8r5D$tQ?XS?YpjM2j-|#!t-ue911Q7* diff --git a/examples/runtime/shaders/dx9/vs_cubes.bin b/examples/runtime/shaders/dx9/vs_cubes.bin index 01d66e86cb0ff7c1699de80e5283a23ba724dfc2..8678ce349b8fc6df7ea301291ddc873aa9544eaa 100644 GIT binary patch delta 84 zcmdnaw4aG1EZBo#N%wot37dGi7#JED82Bg1GcYhQOx&-n%E%BpfrWtqi1>jLPZlsT bFiZf_4KOh#kl18?MtM%4=!F0O85kG<bK(?b delta 76 zcmdnbw4G@p$0l9|28IR(2L1{13=B+M6OU`FGBAWrU}0bYB7UI6lLbHp6M%FBOpFO6 SHd&leo|BQ`$%Oy^f${)vdJ!A| diff --git a/examples/runtime/shaders/dx9/vs_instancing.bin b/examples/runtime/shaders/dx9/vs_instancing.bin index 84bd5828b9f645768daa8f7e292bf5c375a620d8..6e3d001d4529de4bf992fd839a89aea748ea44a7 100644 GIT binary patch delta 64 zcmcb_e2bYQEZBo#N%wot2`hQI7#JED82Bg1GcYhQOx%{t$T(SwalRx2!;=ZD3=GVS S4Ezs(>;^U<|Nnmm1_l63lo9;^ delta 56 zcmcb`e2IA?$4XuX28IR(2L1{13=B+M6Za)EGE7!toG;19@MHoj0|PT71OEdCh9?bd KK>q*#K*a!wZVt8p diff --git a/examples/runtime/shaders/dx9/vs_mesh.bin b/examples/runtime/shaders/dx9/vs_mesh.bin index 22ae1514464344638cc4bb5efae779afb7d8a1c0..aa9460b92a6b52989ac3a33d048798060b911d2a 100644 GIT binary patch delta 162 zcmX@devO?YEZBo#>Ri{~8&VnlnHd-w7#R2`$TKi7F#y?&NNk|^1CTfuL>$Zpsb^wf z2eVlj7#o=3Y^DYl2KLEY7*!b=C*NY6&d4yih{+wu-o+#j5@E7uWSK0*Y|O|s*^fD0 c5~PoT;R(<_1|~)Zjt5)}{}=xM&%nR{0Q@N+_5c6? delta 180 zcmXYqF$w}P6hvo!B3X8et*u1C6YK#jEv@th;vKB^2to?m*xK29hApiZ@g8vkfnPk{ z4D&x>3a{qO1Ar0eZ!5r@n3b!ai(i29p|Xuux%6G-R_xKoH@8Im@=nI9?blv8lyx|! m4$tHPUC_o)4oO|x(c;Dpbn)aa%kl|Ism~tG+#)}6*2W+1ry|n; diff --git a/examples/runtime/shaders/dx9/vs_metaballs.bin b/examples/runtime/shaders/dx9/vs_metaballs.bin index 8c80df245e869c4ea8af3e66f18d2ef209a20555..0f9e0f12737b312ee0a85be4dde8109ad1023104 100644 GIT binary patch delta 138 zcmdnUypx$DEZBpAS?8<$ggcB}6Yq-0GB7YSFfs5?kY`|E0<jqw_#c4STtGG>l+DV( z2vo!VfR%xP87L1Ff3kpyA#?%@0|OB81NDIT3=@EK15AtwBsMva(VmfM@<c{qUXWQp M`3e93GcYg!0HP@!0{{R3 delta 144 zcmdnVypee##~n!q28IR(2L1{13=B-nKsF<k%{B3_xGO6IBT#_-0Z5VyD9OaY|A3W& z0jQ22DE?#t14HNp76t|&;s+W6;xkMD(hV>%CXm?VNJe`_kST0H9wWmlunI<?i6GN} LDkl8@57Y+$#pWJ# diff --git a/examples/runtime/shaders/dx9/vs_raymarching.bin b/examples/runtime/shaders/dx9/vs_raymarching.bin index ade8b1481ab3f74a17bc378fc8be11b822c2e628..8b91c357f95955f2eddd326a01268d3d0493bcb7 100644 GIT binary patch delta 96 zcmcc3^q7ewEZBpAvH8=(37dGi7#JED82Bg1GcYhQOx*9R%E%BpfrWtqi1>jLPZlsT lFiZf_4KOh#kl18(MtM=7=melF6B7gT1EA=H|Nj{n7yy8k7dHR^ delta 88 zcmaFNbem}+$0l9|28IR(2L1{13=B+M6OTKqGBAWrU}0bYB7UI6lLbHp6M%FBOpFO6 dHd&uhUX+pH$pl8AHYNt<2SCvY|NjHk0svXJ6aD}I diff --git a/examples/runtime/shaders/gles/fs_bump.bin b/examples/runtime/shaders/gles/fs_bump.bin index 16a53b6a8737f1cd072f51906e3d206c3e0da74e..ebd2f0632ac90432822fec3cadd2d4ca9d28ebdd 100644 GIT binary patch delta 35 rcmbQMuvCG=E!cx$GLN*_go7N$3T5%-1^LAj|0+#9XunyD@iQL)&8Q5f delta 21 dcmZ3gFjrwB$H9r8?I&K5pLmjcvk~KGJ^*UZ32*=a diff --git a/examples/runtime/shaders/gles/fs_cubes.bin b/examples/runtime/shaders/gles/fs_cubes.bin index d381232543295e3d1d2a278dbd5deaa926d2b867..55250fc553c08deb3f287627ab1aed2b0f3e2ea7 100644 GIT binary patch delta 14 Vcmb<wV&rfO_F!1j{oZpz6#yb%1y}$8 delta 6 NcmZo-teVJC1po&;0ucZJ diff --git a/examples/runtime/shaders/gles/fs_instancing.bin b/examples/runtime/shaders/gles/fs_instancing.bin index d381232543295e3d1d2a278dbd5deaa926d2b867..55250fc553c08deb3f287627ab1aed2b0f3e2ea7 100644 GIT binary patch delta 14 Vcmb<wV&rfO_F!1j{oZpz6#yb%1y}$8 delta 6 NcmZo-teVJC1po&;0ucZJ diff --git a/examples/runtime/shaders/gles/fs_mesh.bin b/examples/runtime/shaders/gles/fs_mesh.bin index 601f8ef58a8cff2ecf4ee1c5b4a68e24e7fa68d7..9b50e8857493d2531a00f6502d70a924d9bda165 100644 GIT binary patch delta 36 scmaFB`GS+fE!cx$>Ri{~6T&98$WKgG<T6nxi%-ta$uBb4xWIu00RL(Yd;kCd delta 20 ccmaFC`G9jGN7%%9yc25`C&tNdTy4t&09WV--~a#s diff --git a/examples/runtime/shaders/gles/fs_metaballs.bin b/examples/runtime/shaders/gles/fs_metaballs.bin index 8814e5be9e268c4d0fdf5147a2c43681a0cdde14..03a036aeb469e325a819aabb9371d7f8c419dda2 100644 GIT binary patch delta 43 ycmaFH^p1(cE!cyBS?8<$1c!;?ydsH3m6>_z3T3IuCJJTo$@w|?MFtxaSs4L9wGMUw delta 26 hcmaFI^o(gDhXc2XLRoxreolUof%QZi$&EQoi~xG22zCGf diff --git a/examples/runtime/shaders/gles/fs_raymarching.bin b/examples/runtime/shaders/gles/fs_raymarching.bin index d7c70816dab2fa70a747b406b335f5ba14f2da73..6add4db1f3a9c92f87a1b5022dcf4f34e703af2c 100644 GIT binary patch delta 16 XcmccR^~j6EE!cyBvH8=(4N<B9IgAFt delta 8 PcmaFlb<1lbN0cf66JZ01 diff --git a/examples/runtime/shaders/gles/vs_bump.bin b/examples/runtime/shaders/gles/vs_bump.bin index d80c17288c23fb082ca8a7c91825f4fa5046da91..7c05a1329be2ee70d62228e05aad09907ab07454 100644 GIT binary patch delta 45 zcmV+|0Mh@(49yG(R#Qj-lMEXckZzI83X!ZJk#0Vb)~5(?Z*ysMX>V?mY5^OwpaG=> DeiRWD delta 60 zcmX@hbChQyN8ZE*b`u*EIE)p_;>!#2iznV$Ie7sihh$<&Nl|7}X-TR=S!%MeLSj5n PF0&*vKX3Cg#^o#k&Y>4| diff --git a/examples/runtime/shaders/gles/vs_cubes.bin b/examples/runtime/shaders/gles/vs_cubes.bin index 8852fe2555825607a55673ca9d8b00adf301e624..c5309d25f2a0db05af5b219af673043da1c388bb 100644 GIT binary patch delta 45 zcmdnNbbyH?EZBo#N%wot3FQ+f@QEjuloVwqm6oI`l%*z{C?v)w=jY@X8BClr2LOnJ B5r_Z) delta 16 YcmX@Ww1a6PNBP8AJQItgCoY=>05${$vj6}9 diff --git a/examples/runtime/shaders/gles/vs_instancing.bin b/examples/runtime/shaders/gles/vs_instancing.bin index 694886a13b312fc059038cbbfa55931fa2a9d0f1..cfd14213e4908e21a6e2c6a066a9c7692f3091f8 100644 GIT binary patch delta 36 scmZ3-vW<l!EZBo#N%wot39opJ6%ykM@{2P|GV}8$-j?1h$SBJQ0Q|8HMF0Q* delta 42 xcmdnSvW{gU$E(S_j69NwB_&0fNu?#J3T3Iu#tMn?1^LC9C7Jnoo5dOB838}C4qE^K diff --git a/examples/runtime/shaders/gles/vs_mesh.bin b/examples/runtime/shaders/gles/vs_mesh.bin index e68de896fa9705b2aca5df426520f8901ce51c81..aaa781831a8244df2ccecc5cc2c02fcd610dd2b1 100644 GIT binary patch delta 42 zcmV+_0M-A%3djlwR#Qj-m7PWVkdBeO9+8?Nk&X<J^Ba-#5e9B=a&2L3vkU<=1bOoi A!~g&Q delta 35 rcmX@Xb%1LkM<17oLRoxreolUo!Ng4}6Q{{d{3|)}k@RLUMk5vg@7xV1 diff --git a/examples/runtime/shaders/gles/vs_metaballs.bin b/examples/runtime/shaders/gles/vs_metaballs.bin index 4889e741dca40076218d3f11464069199416df42..5fc6059e9f97bea1e356a79ae6ecfc87b522b3e8 100644 GIT binary patch delta 61 zcmaFL{Fa#`EZBpAS?8<$gp!HfJfdZZMU|O(=?Z13$tDVA@yYo)`9%g3kIPQnpvGmQ MkO&pn_=uSi0IFLSEC2ui delta 34 qcmaFM{FHejM+ujSLRoxreolUo!Nh#YiI*iO?oyk$hHv8=Mn(YSmJL|| diff --git a/examples/runtime/shaders/gles/vs_raymarching.bin b/examples/runtime/shaders/gles/vs_raymarching.bin index a3d1ac1480ae0472b3d369b06aaa6ba25d9bc329..61b8a8f7c5e2a9108219b31b9dd628b0eb1c7494 100644 GIT binary patch delta 24 gcmeBXp3KY<7VN>m*!=0?gtZfo@l9MHIq}MN0Bw#6eE<Le delta 39 vcmbQt+|4|ZW9`HXJd%keB}JJ@r6s8fWvR)=3W@Or`Nf$fnfZAWZ|wvCCHN1| diff --git a/examples/runtime/shaders/glsl/fs_bump.bin b/examples/runtime/shaders/glsl/fs_bump.bin index f3ccd023ae459daecaf07ca442fdef8e6c4dbf3c..204fa926593a2e6bbe788c991ffe126a6eabf641 100644 GIT binary patch delta 52 zcmew+|4&}jE!cx$GLN*Fa#?Coab|v=f}xQC*F=5MiAoh5#tLQe<puf06R#;voMpe6 Inej6p0KTgcg8%>k delta 39 vcmew-|4p7-xh%D)I5R&_!O&!)aR0<J_7m62a~La>#g`Z47jNcZ{Kf|WF&+-l diff --git a/examples/runtime/shaders/glsl/fs_cubes.bin b/examples/runtime/shaders/glsl/fs_cubes.bin index 59695bd22859a918a6c77d24b81db8c2088c15c6..5453e14515f617b5ce8b38530511592bf3a1b9ef 100644 GIT binary patch delta 25 gcmWHJ7Iq8vU|7=q-cz|OwWv5VKTpBXXd<@<0CArPng9R* delta 17 YcmazJ=2k9CEh^5;&r>ionJDZ505Hl0Q~&?~ diff --git a/examples/runtime/shaders/glsl/fs_instancing.bin b/examples/runtime/shaders/glsl/fs_instancing.bin index 59695bd22859a918a6c77d24b81db8c2088c15c6..5453e14515f617b5ce8b38530511592bf3a1b9ef 100644 GIT binary patch delta 25 gcmWHJ7Iq8vU|7=q-cz|OwWv5VKTpBXXd<@<0CArPng9R* delta 17 YcmazJ=2k9CEh^5;&r>ionJDZ505Hl0Q~&?~ diff --git a/examples/runtime/shaders/glsl/fs_mesh.bin b/examples/runtime/shaders/glsl/fs_mesh.bin index eaf53d6b3b8975babb7dc53bd9c23c7c86588fb0..3d29b1cc21385b30e1ddd1726babc8b86fe5787e 100644 GIT binary patch delta 48 zcmdnVd5}}sE!cx$>Ri{~%4MlV#hLke3Wi1#xm6~{%1^XW<T6nxi%-ta$uBb4Sn0q5 E0GOZ<N&o-= delta 32 ocmX@exs#Jyxh%D)I5R&_!O&!)u*$@8-icv~6V2r}w%D=&0I|~whyVZp diff --git a/examples/runtime/shaders/glsl/fs_metaballs.bin b/examples/runtime/shaders/glsl/fs_metaballs.bin index d5e35e888f8e578a47171bba756a56b5d7c498e7..5af416d78a61a63521ce57cefe14e627d0757c97 100644 GIT binary patch delta 56 zcmdnbbeu`YE!cyBS?8<0a#?Coab|v=f}xQC7gt$gQDtUcx<XlMvav#0d|rN0Zeou0 LL|(~_woHrw0fZ6V delta 46 zcmX@kw4aGrxh%D)I5R&_!O+BjYod;%NMccCW?s5NS!%MeLRoxXeo<~>&PFFzMgU&? B4*UQB diff --git a/examples/runtime/shaders/glsl/fs_raymarching.bin b/examples/runtime/shaders/glsl/fs_raymarching.bin index 3484bdc1470963f14b7a7c565ad6a1e035f2bcf7..907a2b86026b9feb0f7b216c81c9b1520d336739 100644 GIT binary patch delta 28 jcmdn&wcAVBE!cyBvH8<O<+9YG;>`R!1w*5a+#0F?oAU|- delta 20 bcmdn(wb_eXxh%D)I5R&_!O&!*u!brCP&Nk5 diff --git a/examples/runtime/shaders/glsl/vs_bump.bin b/examples/runtime/shaders/glsl/vs_bump.bin index 2de04a441b5bd508e1fd5318ad092803b5d61a26..72324e94a535111b102f89145dcbcb485380b17b 100644 GIT binary patch delta 78 zcmbQovy4YLEZBo#GLN*Fa#?Coab|v=f}znwZW|6`g|hhag8br%%}Nv9?Ix~YJ~^L} iOFXfpq$o3~v?NubEH&9!Au&ELzbH2`XLC8@auxvIXd0;i delta 50 zcmV-20L}lV44w=NBX(tSb7^mGATczN6FiZ5K9N}<kxvSd&lQo(l98_!lRyCklU@M| Ivw;Dn1i-Wrod5s; diff --git a/examples/runtime/shaders/glsl/vs_cubes.bin b/examples/runtime/shaders/glsl/vs_cubes.bin index ebd20cfe7b5c2002e1186f5e72059d5641674868..05467fda84375be9c5ff80b383513be08ed4ced8 100644 GIT binary patch delta 36 scmbQpG?Pg<EZBo#N%wnC<+9YG;>`R!1w*5W+^!Qd`6fC`PAs1V0OWBDz5oCK delta 29 kcmbQqG?9s0xh%D)I5R&_!O&!)uq(5PLgGXxm5KGU0D~L}DgXcg diff --git a/examples/runtime/shaders/glsl/vs_instancing.bin b/examples/runtime/shaders/glsl/vs_instancing.bin index a425235d6d43bce90cd74ec254bf5a7da7d2a23c..9bdd64066c15cfae3aa965d2dbb218e748ea69e1 100644 GIT binary patch delta 58 zcmZo?>1PoR3-(}G(*533xh%D)I5R&_!O&<T_l}8o_{0-SN{TX*N=s4|%2Ja}6cXc; O^K<fx3^u-yX9NIg>J@4L delta 36 rcmeBYX=mY9E=w&c&dkqKFf^Gcyo1w3Au&EVKPSIv;%>Q(pJW*U*GCMS diff --git a/examples/runtime/shaders/glsl/vs_mesh.bin b/examples/runtime/shaders/glsl/vs_mesh.bin index d1772ea5c7914760981f8239c53a67205256a1be..2fa0af63d133f33da8d426f812a12247509095a6 100644 GIT binary patch delta 57 zcmV-90LK5B3ZV)UR#Qj-m7PWVBX(tSb7^mGATctL3tW+v9+7h*3N#>gUt@1<Z*nk^ Pu@jNq3X!uJvF9=bPT3Vr delta 67 zcmZ3;HIs{5xh%D)I5R&_!O&!)a157;LRoxreolUo!NhKriTQHki6tdPnMtK3sS0JO X$;Jwa@p<`0xrsRwcgk*jZ^Qxs04W#> diff --git a/examples/runtime/shaders/glsl/vs_metaballs.bin b/examples/runtime/shaders/glsl/vs_metaballs.bin index 4c0cff6f7cee16f7a95764098c03d920afe5daca..6e1bb69332b3a08620766c1c094f97c5f7a61864 100644 GIT binary patch delta 62 zcmdnTe2iH*EZBpAS?8<0a#?Coab|v=f}znwZYNG-g|hg({G!~%iS|+xI|Vrk@{2P| RfYKA&H73^bY~0Jp2mpOD6(#@x delta 62 zcmX@cypNe%xh%D)I5R&_!O&!)u+zjG9=@`~qRPy?bcM3iWMhT0iHnscRtQd9B06ya R3r9hIab^in@y5f<i~y)-7EAyD diff --git a/examples/runtime/shaders/glsl/vs_raymarching.bin b/examples/runtime/shaders/glsl/vs_raymarching.bin index 38bd73618d4219a12b2b472bb0cbd27743152289..063bf2ef8f100b2ef455922cf082e3b93c1930b3 100644 GIT binary patch delta 57 zcmaFD^oB_|EZBpAvH8<O<+9YG;>`R!1w*5W+|?83^NA;xloVwqm6oI`l%*z{C?v)w N=jY@X8BAQg698!f7196z delta 28 kcmaFE^n{69xh%D)I5R&_!O&!)aP`EMJQEwGCvM#i0GFi;9RL6T diff --git a/include/bgfx.h b/include/bgfx.h index d91ffce5..9d15cc7a 100644 --- a/include/bgfx.h +++ b/include/bgfx.h @@ -230,6 +230,7 @@ namespace bgfx enum Enum { MinimumRequiredSpecs = 1, + InvalidShader, D3D9_UnableToCreateInterface, D3D9_UnableToCreateDevice, D3D9_UnableToCreateRenderTarget, @@ -304,7 +305,10 @@ namespace bgfx ARGB8, ABGR16, R5G6B5, - + RGBA4, + RGB5A1, + RGB10A2, + Count }; }; @@ -453,7 +457,7 @@ namespace bgfx /// /// BGFX_DEBUG_IFH - Infinitely fast hardware. When this flag is set /// all rendering calls will be skipped. It's useful when profiling - /// to quickly assess bottleneck between CPU and GPU. + /// to quickly assess bottleneck between CPU and GPU. /// /// BGFX_DEBUG_STATS - Display internal statistics. /// @@ -545,6 +549,11 @@ namespace bgfx void destroyFragmentShader(FragmentShaderHandle _handle); /// Create program with vertex and fragment shaders. + /// + /// @param _vsh vertex shader. + /// @param _fsh fragment shader. + /// @returns Program handle if vertex shader output and fragment shader + /// input are matching, otherwise returns invalid program handle. ProgramHandle createProgram(VertexShaderHandle _vsh, FragmentShaderHandle _fsh); /// Destroy program. diff --git a/premake/premake4.lua b/premake/premake4.lua index da87919d..d3695679 100644 --- a/premake/premake4.lua +++ b/premake/premake4.lua @@ -264,9 +264,10 @@ function copyLib() end dofile "bgfx.lua" -dofile "ddsdump.lua" dofile "makedisttex.lua" dofile "shaderc.lua" +dofile "texturec.lua" +dofile "geometryc.lua" dofile "openctm.lua" dofile "example-00-helloworld.lua" dofile "example-01-cubes.lua" diff --git a/premake/shader.mk b/premake/shader.mk index 31c6e7db..b7988dc5 100644 --- a/premake/shader.mk +++ b/premake/shader.mk @@ -35,8 +35,8 @@ FS_FLAGS=--platform android SHADER_PATH=shaders/gles else ifeq ($(TARGET), 4) -VS_FLAGS=--platform linux -p 140 -FS_FLAGS=--platform linux -p 140 +VS_FLAGS=--platform linux -p 120 +FS_FLAGS=--platform linux -p 120 SHADER_PATH=shaders/glsl endif endif @@ -45,7 +45,7 @@ endif endif BUILD_OUTPUT_DIR=$(addprefix ./, $(RUNTIME_DIR)/$(SHADER_PATH)) -BUILD_INTERMEDIATE_DIR=$(addprefix $(BGFX_DIR)/.build/, $(SHADER_PATH)) +BUILD_INTERMEDIATE_DIR=$(addprefix $(BUILD_DIR)/, $(SHADER_PATH)) VS_SOURCES=$(wildcard vs_*.sc) VS_DEPS=$(addprefix $(BUILD_INTERMEDIATE_DIR)/,$(addsuffix .bin.d, $(basename $(VS_SOURCES)))) diff --git a/premake/shaderc.lua b/premake/shaderc.lua index 98b6242b..3f7453db 100644 --- a/premake/shaderc.lua +++ b/premake/shaderc.lua @@ -46,7 +46,8 @@ project "shaderc" } files { - BGFX_DIR .. "tools/shaderc.cpp", + BGFX_DIR .. "tools/shaderc/**.cpp", + BGFX_DIR .. "tools/shaderc/**.h", FCPP_DIR .. "**.h", FCPP_DIR .. "cpp1.c", FCPP_DIR .. "cpp2.c", diff --git a/premake/ddsdump.lua b/premake/texturec.lua similarity index 66% rename from premake/ddsdump.lua rename to premake/texturec.lua index 9c9917b4..d655e6f7 100644 --- a/premake/ddsdump.lua +++ b/premake/texturec.lua @@ -1,4 +1,4 @@ -project "ddsdump" +project "texturec" uuid "838801ee-7bc3-11e1-9f19-eae7d36e7d26" kind "ConsoleApp" @@ -10,7 +10,8 @@ project "ddsdump" files { BGFX_DIR .. "src/dds.*", - BGFX_DIR .. "tools/ddsdump.cpp", + BGFX_DIR .. "tools/texturec/**.cpp", + BGFX_DIR .. "tools/texturec/**.h", } links { diff --git a/src/bgfx.cpp b/src/bgfx.cpp index e205d4b8..4e48dd10 100644 --- a/src/bgfx.cpp +++ b/src/bgfx.cpp @@ -30,11 +30,11 @@ namespace bgfx #define BGFX_MAIN_THREAD_MAGIC 0x78666762 #if BGFX_CONFIG_MULTITHREADED -# define BGFX_MAIN_THREAD() BX_CHECK(BGFX_MAIN_THREAD_MAGIC == s_threadIndex, "Must be called from main thread.") -# define BGFX_RENDER_THREAD() BX_CHECK(BGFX_MAIN_THREAD_MAGIC != s_threadIndex, "Must be called from render thread.") +# define BGFX_CHECK_MAIN_THREAD() BX_CHECK(BGFX_MAIN_THREAD_MAGIC == s_threadIndex, "Must be called from main thread.") +# define BGFX_CHECK_RENDER_THREAD() BX_CHECK(BGFX_MAIN_THREAD_MAGIC != s_threadIndex, "Must be called from render thread.") #else -# define BGFX_MAIN_THREAD() -# define BGFX_RENDER_THREAD() +# define BGFX_CHECK_MAIN_THREAD() +# define BGFX_CHECK_RENDER_THREAD() #endif // BGFX_CONFIG_MULTITHREADED void fatalStub(Fatal::Enum _code, const char* _str) @@ -197,6 +197,7 @@ namespace bgfx void TextVideoMemBlitter::init() { + BGFX_CHECK_MAIN_THREAD(); m_decl.begin(); m_decl.add(Attrib::Position, 3, AttribType::Float); m_decl.add(Attrib::Color0, 4, AttribType::Uint8, true); @@ -250,6 +251,7 @@ namespace bgfx void TextVideoMemBlitter::blit(const TextVideoMem& _mem) { + BGFX_CHECK_RENDER_THREAD(); struct Vertex { float m_x; @@ -360,6 +362,7 @@ namespace bgfx void ClearQuad::init() { + BGFX_CHECK_MAIN_THREAD(); #if BGFX_CONFIG_RENDERER_DIRECT3D11 m_decl.begin(); m_decl.add(Attrib::Position, 3, AttribType::Float); @@ -544,25 +547,31 @@ namespace bgfx void shutdown() { - BGFX_MAIN_THREAD(); + BGFX_CHECK_MAIN_THREAD(); s_ctx.shutdown(); + + s_threadIndex = 0; + g_fatal = fatalStub; + g_realloc = reallocStub; + g_free = freeStub; + g_cache = cacheStub; } void reset(uint32_t _width, uint32_t _height, uint32_t _flags) { - BGFX_MAIN_THREAD(); + BGFX_CHECK_MAIN_THREAD(); s_ctx.reset(_width, _height, _flags); } void frame() { - BGFX_MAIN_THREAD(); + BGFX_CHECK_MAIN_THREAD(); s_ctx.frame(); } bool renderFrame() { - BGFX_RENDER_THREAD(); + BGFX_CHECK_RENDER_THREAD(); return s_ctx.renderFrame(); } @@ -618,7 +627,7 @@ namespace bgfx void VertexDecl::end() { - m_hash = hash(m_attributes, sizeof(m_attributes) ); + m_hash = hashMurmur2A(m_attributes, sizeof(m_attributes) ); } void VertexDecl::add(Attrib::Enum _attrib, uint8_t _num, AttribType::Enum _type, bool _normalized) @@ -668,7 +677,7 @@ namespace bgfx #if BGFX_CONFIG_DEBUG BX_TRACE("vertexdecl %08x (%08x), stride %d" , _decl.m_hash - , hash(_decl.m_attributes, sizeof(_decl.m_attributes) ) + , hashMurmur2A(_decl.m_attributes, sizeof(_decl.m_attributes) ) , _decl.m_stride ); @@ -842,16 +851,19 @@ namespace bgfx void setDebug(uint32_t _debug) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_debug = _debug; } void dbgTextClear(uint8_t _attr, bool _small) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.dbgTextClear(_attr, _small); } void dbgTextPrintf(uint16_t _x, uint16_t _y, uint8_t _attr, const char* _format, ...) { + BGFX_CHECK_MAIN_THREAD(); va_list argList; va_start(argList, _format); s_ctx.dbgTextPrintfVargs(_x, _y, _attr, _format, argList); @@ -860,11 +872,13 @@ namespace bgfx IndexBufferHandle createIndexBuffer(const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.createIndexBuffer(_mem); } void destroyIndexBuffer(IndexBufferHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyIndexBuffer(_handle); } @@ -875,126 +889,148 @@ namespace bgfx void destroyVertexBuffer(VertexBufferHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyVertexBuffer(_handle); } DynamicIndexBufferHandle createDynamicIndexBuffer(uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.createDynamicIndexBuffer(_num); } DynamicIndexBufferHandle createDynamicIndexBuffer(const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); return s_ctx.createDynamicIndexBuffer(_mem); } void updateDynamicIndexBuffer(DynamicIndexBufferHandle _handle, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); s_ctx.updateDynamicIndexBuffer(_handle, _mem); } void destroyDynamicIndexBuffer(DynamicIndexBufferHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyDynamicIndexBuffer(_handle); } DynamicVertexBufferHandle createDynamicVertexBuffer(uint16_t _num, const VertexDecl& _decl) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.createDynamicVertexBuffer(_num, _decl); } DynamicVertexBufferHandle createDynamicVertexBuffer(const Memory* _mem, const VertexDecl& _decl) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); return s_ctx.createDynamicVertexBuffer(_mem, _decl); } void updateDynamicVertexBuffer(DynamicVertexBufferHandle _handle, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); s_ctx.updateDynamicVertexBuffer(_handle, _mem); } void destroyDynamicVertexBuffer(DynamicVertexBufferHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyDynamicVertexBuffer(_handle); } bool checkAvailTransientIndexBuffer(uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.m_submit->checkAvailTransientIndexBuffer(_num); } void allocTransientIndexBuffer(TransientIndexBuffer* _tib, uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _tib, "_tib can't be NULL"); return s_ctx.allocTransientIndexBuffer(_tib, _num); } bool checkAvailTransientVertexBuffer(uint16_t _num, const VertexDecl& _decl) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.m_submit->checkAvailTransientVertexBuffer(_num, _decl.m_stride); } void allocTransientVertexBuffer(TransientVertexBuffer* _tvb, uint16_t _num, const VertexDecl& _decl) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _tvb, "_tvb can't be NULL"); return s_ctx.allocTransientVertexBuffer(_tvb, _num, _decl); } const InstanceDataBuffer* allocInstanceDataBuffer(uint16_t _num, uint16_t _stride) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.allocInstanceDataBuffer(_num, _stride); } VertexShaderHandle createVertexShader(const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); return s_ctx.createVertexShader(_mem); } void destroyVertexShader(VertexShaderHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyVertexShader(_handle); } FragmentShaderHandle createFragmentShader(const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); return s_ctx.createFragmentShader(_mem); } void destroyFragmentShader(FragmentShaderHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyFragmentShader(_handle); } ProgramHandle createProgram(VertexShaderHandle _vsh, FragmentShaderHandle _fsh) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.createProgram(_vsh, _fsh); } void destroyProgram(ProgramHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyProgram(_handle); } TextureHandle createTexture(const Memory* _mem, uint32_t _flags, TextureInfo* _info) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); return s_ctx.createTexture(_mem, _flags, _info); } TextureHandle createTexture2D(uint16_t _width, uint16_t _height, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); uint32_t size = sizeof(uint32_t)+sizeof(TextureCreate); const bgfx::Memory* mem = alloc(size); - StreamWrite stream(mem->data, mem->size); - uint32_t magic = BGFX_MAGIC; - stream.write(magic); + bx::StaticMemoryBlockWriter writer(mem->data, mem->size); + uint32_t magic = BGFX_CHUNK_MAGIC_TEX; + bx::write(&writer, magic); TextureCreate tc; tc.m_flags = _flags; @@ -1002,22 +1038,23 @@ namespace bgfx tc.m_height = _height; tc.m_depth = 0; tc.m_numMips = _numMips; - tc.m_type = uint8_t(_format); + tc.m_format = uint8_t(_format); tc.m_cubeMap = false; tc.m_mem = _mem; - stream.write(tc); + bx::write(&writer, tc); return s_ctx.createTexture(mem, _flags, NULL); } TextureHandle createTexture3D(uint16_t _width, uint16_t _height, uint16_t _depth, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); uint32_t size = sizeof(uint32_t)+sizeof(TextureCreate); const bgfx::Memory* mem = alloc(size); - StreamWrite stream(mem->data, mem->size); - uint32_t magic = BGFX_MAGIC; - stream.write(magic); + bx::StaticMemoryBlockWriter writer(mem->data, mem->size); + uint32_t magic = BGFX_CHUNK_MAGIC_TEX; + bx::write(&writer, magic); TextureCreate tc; tc.m_flags = _flags; @@ -1025,22 +1062,23 @@ namespace bgfx tc.m_height = _height; tc.m_depth = _depth; tc.m_numMips = _numMips; - tc.m_type = uint8_t(_format); + tc.m_format = uint8_t(_format); tc.m_cubeMap = false; tc.m_mem = _mem; - stream.write(tc); + bx::write(&writer, tc); return s_ctx.createTexture(mem, _flags, NULL); } TextureHandle createTextureCube(uint16_t _sides, uint16_t _width, uint8_t _numMips, TextureFormat::Enum _format, uint32_t _flags, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); uint32_t size = sizeof(uint32_t)+sizeof(TextureCreate); const bgfx::Memory* mem = alloc(size); - StreamWrite stream(mem->data, mem->size); - uint32_t magic = BGFX_MAGIC; - stream.write(magic); + bx::StaticMemoryBlockWriter writer(mem->data, mem->size); + uint32_t magic = BGFX_CHUNK_MAGIC_TEX; + bx::write(&writer, magic); TextureCreate tc; tc.m_flags = _flags; @@ -1048,21 +1086,23 @@ namespace bgfx tc.m_sides = _sides; tc.m_depth = 0; tc.m_numMips = _numMips; - tc.m_type = uint8_t(_format); + tc.m_format = uint8_t(_format); tc.m_cubeMap = true; tc.m_mem = _mem; - stream.write(tc); + bx::write(&writer, tc); return s_ctx.createTexture(mem, _flags, NULL); } void destroyTexture(TextureHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyTexture(_handle); } void updateTexture2D(TextureHandle _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); if (_width == 0 || _height == 0) @@ -1077,6 +1117,7 @@ namespace bgfx void updateTexture3D(TextureHandle _handle, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _z, uint16_t _width, uint16_t _height, uint16_t _depth, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); if (_width == 0 || _height == 0 @@ -1092,6 +1133,7 @@ namespace bgfx void updateTextureCube(TextureHandle _handle, uint8_t _side, uint8_t _mip, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height, const Memory* _mem) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _mem, "_mem can't be NULL"); if (_width == 0 || _height == 0) @@ -1106,126 +1148,151 @@ namespace bgfx RenderTargetHandle createRenderTarget(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.createRenderTarget(_width, _height, _flags, _textureFlags); } void destroyRenderTarget(RenderTargetHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyRenderTarget(_handle); } UniformHandle createUniform(const char* _name, UniformType::Enum _type, uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.createUniform(_name, _type, _num); } void destroyUniform(UniformHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.destroyUniform(_handle); } void setViewRect(uint8_t _id, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewRect(_id, _x, _y, _width, _height); } void setViewRectMask(uint32_t _viewMask, uint16_t _x, uint16_t _y, uint16_t _width, uint16_t _height) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewRectMask(_viewMask, _x, _y, _width, _height); } void setViewClear(uint8_t _id, uint8_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewClear(_id, _flags, _rgba, _depth, _stencil); } void setViewClearMask(uint32_t _viewMask, uint8_t _flags, uint32_t _rgba, float _depth, uint8_t _stencil) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewClearMask(_viewMask, _flags, _rgba, _depth, _stencil); } void setViewSeq(uint8_t _id, bool _enabled) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewSeq(_id, _enabled); } void setViewSeqMask(uint32_t _viewMask, bool _enabled) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewSeqMask(_viewMask, _enabled); } void setViewRenderTarget(uint8_t _id, RenderTargetHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewRenderTarget(_id, _handle); } void setViewRenderTargetMask(uint32_t _mask, RenderTargetHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setViewRenderTargetMask(_mask, _handle); } void setViewTransform(uint8_t _id, const void* _view, const void* _proj, uint8_t _other) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setViewTransform(_id, _view, _proj, _other); } void setViewTransformMask(uint32_t _viewMask, const void* _view, const void* _proj, uint8_t _other) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setViewTransformMask(_viewMask, _view, _proj, _other); } void setState(uint64_t _state) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setState(_state); } void setStencil(uint32_t _fstencil, uint32_t _bstencil) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setStencil(_fstencil, _bstencil); } uint32_t setTransform(const void* _mtx, uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); return s_ctx.m_submit->setTransform(_mtx, _num); } void setTransform(uint32_t _cache, uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setTransform(_cache, _num); } void setUniform(UniformHandle _handle, const void* _value, uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setUniform(_handle, _value, _num); } void setUniform(ProgramHandle _program, UniformHandle _handle, const void* _value) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.setUniform(_program, _handle, _value); } void setIndexBuffer(IndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setIndexBuffer(_handle, _firstIndex, _numIndices); } void setIndexBuffer(IndexBufferHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setIndexBuffer(_handle, BGFX_DRAW_WHOLE_INDEX_BUFFER, 0); } void setIndexBuffer(DynamicIndexBufferHandle _handle, uint32_t _firstIndex, uint32_t _numIndices) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setIndexBuffer(s_ctx.m_dynamicIndexBuffers[_handle.idx].m_handle, _firstIndex, _numIndices); } void setIndexBuffer(DynamicIndexBufferHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setIndexBuffer(s_ctx.m_dynamicIndexBuffers[_handle.idx].m_handle, BGFX_DRAW_WHOLE_INDEX_BUFFER, 0); } void setIndexBuffer(const TransientIndexBuffer* _tib, uint32_t _numIndices) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _tib, "_tib can't be NULL"); uint32_t numIndices = uint32_min(_numIndices, _tib->size/2); s_ctx.m_submit->setIndexBuffer(_tib, numIndices); @@ -1233,52 +1300,62 @@ namespace bgfx void setVertexBuffer(VertexBufferHandle _handle, uint32_t _numVertices) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setVertexBuffer(_handle, _numVertices); } void setVertexBuffer(DynamicVertexBufferHandle _handle, uint32_t _numVertices) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setVertexBuffer(s_ctx.m_dynamicVertexBuffers[_handle.idx], _numVertices); } void setVertexBuffer(const TransientVertexBuffer* _tvb, uint32_t _numVertices) { + BGFX_CHECK_MAIN_THREAD(); BX_CHECK(NULL != _tvb, "_tvb can't be NULL"); s_ctx.m_submit->setVertexBuffer(_tvb, _numVertices); } void setInstanceDataBuffer(const InstanceDataBuffer* _idb, uint16_t _num) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setInstanceDataBuffer(_idb, _num); } void setProgram(ProgramHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setProgram(_handle); } void setTexture(uint8_t _stage, UniformHandle _sampler, TextureHandle _handle) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setTexture(_stage, _sampler, _handle); } void setTexture(uint8_t _stage, UniformHandle _sampler, RenderTargetHandle _handle, bool _depth) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->setTexture(_stage, _sampler, _handle, _depth); } void submit(uint8_t _id, int32_t _depth) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->submit(_id, _depth); } void submitMask(uint32_t _viewMask, int32_t _depth) { + BGFX_CHECK_MAIN_THREAD(); s_ctx.m_submit->submitMask(_viewMask, _depth); } void saveScreenShot(const char* _filePath) { + BGFX_CHECK_MAIN_THREAD(); uint32_t len = (uint32_t)strlen(_filePath)+1; const Memory* mem = alloc(len); memcpy(mem->data, _filePath, mem->size); diff --git a/src/bgfx_p.h b/src/bgfx_p.h index 2d7a9098..a463df24 100644 --- a/src/bgfx_p.h +++ b/src/bgfx_p.h @@ -27,6 +27,14 @@ extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format dbgPrintf(BX_FILE_LINE_LITERAL "BGFX " _format "\n", ##__VA_ARGS__); \ } while(0) +# define BX_WARN(_condition, _format, ...) \ + do { \ + if (!(_condition) ) \ + { \ + BX_TRACE(BX_FILE_LINE_LITERAL "WARN " _format, ##__VA_ARGS__); \ + } \ + } while(0) + # define BX_CHECK(_condition, _format, ...) \ do { \ if (!(_condition) ) \ @@ -56,6 +64,7 @@ extern void dbgPrintfData(const void* _data, uint32_t _size, const char* _format #include <bx/radixsort.h> #include <bx/ringbuffer.h> #include <bx/uint32_t.h> +#include <bx/readerwriter.h> #if BX_PLATFORM_WINDOWS # include <windows.h> @@ -67,18 +76,11 @@ extern HWND g_bgfxHwnd; # include <pthread.h> #endif // BX_PLATFORM_* -#ifndef MAKEFOURCC -# define MAKEFOURCC(_a, _b, _c, _d) (0 \ - | ( (uint32_t)(_a) \ - | ( (uint32_t)(_b) << 8) \ - | ( (uint32_t)(_c) << 16) \ - | ( (uint32_t)(_d) << 24) \ - ) ) -#endif // MAKEFOURCC - #include "dds.h" -#define BGFX_MAGIC MAKEFOURCC('B','G','F','X') +#define BGFX_CHUNK_MAGIC_FSH BX_MAKEFOURCC('F', 'S', 'H', 0x0) +#define BGFX_CHUNK_MAGIC_TEX BX_MAKEFOURCC('T', 'E', 'X', 0x0) +#define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', 0x0) #if BGFX_CONFIG_USE_TINYSTL @@ -174,7 +176,7 @@ namespace bgfx }; uint16_t m_depth; uint8_t m_numMips; - uint8_t m_type; + uint8_t m_format; bool m_cubeMap; const Memory* m_mem; }; @@ -201,14 +203,6 @@ namespace bgfx return _a < _b ? _b : _a; } - inline uint32_t hash(const void* _data, uint32_t _size) - { - HashMurmur2A murmur; - murmur.begin(); - murmur.add(_data, (int)_size); - return murmur.end(); - } - inline uint32_t gcd(uint32_t _a, uint32_t _b) { do @@ -413,113 +407,6 @@ namespace bgfx const char* getPredefinedUniformName(PredefinedUniform::Enum _enum); PredefinedUniform::Enum nameToPredefinedUniformEnum(const char* _name); - class StreamRead - { - public: - StreamRead(const void* _data, uint32_t _size) - : m_data( (uint8_t*)_data) - , m_size(_size) - , m_pos(0) - { - } - - ~StreamRead() - { - } - - void skip(uint32_t _size) - { - BX_CHECK(m_size-m_pos >= _size, "Available %d, requested %d.", m_size-m_pos, _size); - m_pos += _size; - } - - void read(void* _data, uint32_t _size) - { - BX_CHECK(m_size-m_pos >= _size, "Available %d, requested %d.", m_size-m_pos, _size); - memcpy(_data, &m_data[m_pos], _size); - m_pos += _size; - } - - template<typename Ty> - void read(Ty& _value) - { - read(&_value, sizeof(Ty) ); - } - - const uint8_t* getDataPtr() const - { - return &m_data[m_pos]; - } - - uint32_t getPos() const - { - return m_pos; - } - - void align(uint16_t _align) - { - m_pos = strideAlign(m_pos, _align); - } - - uint32_t remaining() const - { - return m_size-m_pos; - } - - private: - const uint8_t* m_data; - uint32_t m_size; - uint32_t m_pos; - }; - - class StreamWrite - { - public: - StreamWrite(void* _data, uint32_t _size) - : m_data( (uint8_t*)_data) - , m_size(_size) - , m_pos(0) - { - } - - ~StreamWrite() - { - } - - void write(void* _data, uint32_t _size) - { - BX_CHECK(m_size-m_pos >= _size, "Write out of bounds. Available %d, requested %d.", m_size-m_pos, _size); - memcpy(&m_data[m_pos], _data, _size); - m_pos += _size; - } - - template<typename Ty> - void write(Ty& _value) - { - write(&_value, sizeof(Ty) ); - } - - uint8_t* getDataPtr() const - { - return &m_data[m_pos]; - } - - uint32_t getPos() const - { - return m_pos; - } - - void align(uint16_t _align) - { - m_pos = strideAlign(m_pos, _align); - } - - private: - uint8_t* m_data; - uint32_t m_size; - uint32_t m_pos; - }; - struct CommandBuffer { CommandBuffer() @@ -1929,8 +1816,24 @@ namespace bgfx VertexShaderHandle createVertexShader(const Memory* _mem) { + bx::MemoryReader reader(_mem->data, _mem->size); + + uint32_t magic; + bx::read(&reader, magic); + + if (BGFX_CHUNK_MAGIC_VSH != magic) + { + BX_WARN(false, "Invalid vertex shader signature! 0x%08x", magic); + VertexShaderHandle invalid = BGFX_INVALID_HANDLE; + return invalid; + } + VertexShaderHandle handle = { m_vertexShaderHandle.alloc() }; - m_vertexShaderRef[handle.idx] = 1; + + VertexShaderRef& vsr = m_vertexShaderRef[handle.idx]; + vsr.m_refCount = 1; + bx::read(&reader, vsr.m_outputHash); + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateVertexShader); cmdbuf.write(handle); cmdbuf.write(_mem); @@ -1944,12 +1847,14 @@ namespace bgfx void vertexShaderIncRef(VertexShaderHandle _handle) { - ++m_vertexShaderRef[_handle.idx]; + VertexShaderRef& vsr = m_vertexShaderRef[_handle.idx]; + ++vsr.m_refCount; } void vertexShaderDecRef(VertexShaderHandle _handle) { - int32_t refs = --m_vertexShaderRef[_handle.idx]; + VertexShaderRef& vsr = m_vertexShaderRef[_handle.idx]; + int32_t refs = --vsr.m_refCount; if (0 == refs) { CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyVertexShader); @@ -1960,8 +1865,24 @@ namespace bgfx FragmentShaderHandle createFragmentShader(const Memory* _mem) { + bx::MemoryReader reader(_mem->data, _mem->size); + + uint32_t magic; + bx::read(&reader, magic); + + if (BGFX_CHUNK_MAGIC_FSH != magic) + { + BX_WARN(false, "Invalid fragment shader signature! 0x%08x", magic); + FragmentShaderHandle invalid = BGFX_INVALID_HANDLE; + return invalid; + } + FragmentShaderHandle handle = { m_fragmentShaderHandle.alloc() }; - m_fragmentShaderRef[handle.idx] = 1; + + FragmentShaderRef& fsr = m_fragmentShaderRef[handle.idx]; + fsr.m_refCount = 1; + bx::read(&reader, fsr.m_inputHash); + CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::CreateFragmentShader); cmdbuf.write(handle); cmdbuf.write(_mem); @@ -1975,12 +1896,14 @@ namespace bgfx void fragmentShaderIncRef(FragmentShaderHandle _handle) { - ++m_fragmentShaderRef[_handle.idx]; + FragmentShaderRef& fsr = m_fragmentShaderRef[_handle.idx]; + ++fsr.m_refCount; } void fragmentShaderDecRef(FragmentShaderHandle _handle) { - int32_t refs = --m_fragmentShaderRef[_handle.idx]; + FragmentShaderRef& fsr = m_fragmentShaderRef[_handle.idx]; + int32_t refs = --fsr.m_refCount; if (0 == refs) { CommandBuffer& cmdbuf = getCommandBuffer(CommandBuffer::DestroyFragmentShader); @@ -1991,6 +1914,15 @@ namespace bgfx ProgramHandle createProgram(VertexShaderHandle _vsh, FragmentShaderHandle _fsh) { + const VertexShaderRef& vsr = m_vertexShaderRef[_vsh.idx]; + const FragmentShaderRef& fsr = m_fragmentShaderRef[_fsh.idx]; + if (vsr.m_outputHash != fsr.m_inputHash) + { + BX_WARN(vsr.m_outputHash == fsr.m_inputHash, "Vertex shader output doesn't match fragment shader input."); + ProgramHandle invalid = BGFX_INVALID_HANDLE; + return invalid; + } + ProgramHandle handle; handle.idx = m_programHandle.alloc(); @@ -2859,8 +2791,19 @@ namespace bgfx HandleAlloc m_renderTargetHandle; HandleAlloc m_uniformHandle; - int32_t m_vertexShaderRef[BGFX_CONFIG_MAX_VERTEX_SHADERS]; - int32_t m_fragmentShaderRef[BGFX_CONFIG_MAX_FRAGMENT_SHADERS]; + struct VertexShaderRef + { + int32_t m_refCount; + uint32_t m_outputHash; + } m_vertexShaderRef[BGFX_CONFIG_MAX_VERTEX_SHADERS]; + + struct FragmentShaderRef + { + int32_t m_refCount; + uint32_t m_inputHash; + + } m_fragmentShaderRef[BGFX_CONFIG_MAX_FRAGMENT_SHADERS]; + struct ProgramRef { VertexShaderHandle m_vsh; diff --git a/src/config.h b/src/config.h index 8a632f36..5ff0769c 100644 --- a/src/config.h +++ b/src/config.h @@ -85,14 +85,21 @@ # define BGFX_CONFIG_DEBUG_PERFHUD 0 #endif // BGFX_CONFIG_DEBUG_NVPERFHUD +/// DX9 PIX markers #ifndef BGFX_CONFIG_DEBUG_PIX # define BGFX_CONFIG_DEBUG_PIX 0 #endif // BGFX_CONFIG_DEBUG_PIX +/// AMD gDEBugger markers #ifndef BGFX_CONFIG_DEBUG_GREMEDY # define BGFX_CONFIG_DEBUG_GREMEDY 0 #endif // BGFX_CONFIG_DEBUG_GREMEDY +/// DX11 object names +#ifndef BGFX_CONFIG_DEBUG_OBJECT_NAME +# define BGFX_CONFIG_DEBUG_OBJECT_NAME BGFX_CONFIG_DEBUG +#endif // BGFX_CONFIG_DEBUG_OBJECT_NAME + #ifndef BGFX_CONFIG_MULTITHREADED # define BGFX_CONFIG_MULTITHREADED ( (BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360|BX_PLATFORM_NACL)&(!BGFX_CONFIG_RENDERER_NULL) ) #endif // BGFX_CONFIG_MULTITHREADED diff --git a/src/dds.cpp b/src/dds.cpp index dd6a7b7a..316c621b 100644 --- a/src/dds.cpp +++ b/src/dds.cpp @@ -9,15 +9,15 @@ namespace bgfx { -#define DDS_MAGIC MAKEFOURCC('D','D','S',' ') +#define DDS_MAGIC BX_MAKEFOURCC('D','D','S',' ') #define DDS_HEADER_SIZE 124 #define DDS_IMAGE_DATA_OFFSET (DDS_HEADER_SIZE + 4) -#define DDS_DXT1 MAKEFOURCC('D', 'X', 'T', '1') -#define DDS_DXT2 MAKEFOURCC('D', 'X', 'T', '2') -#define DDS_DXT3 MAKEFOURCC('D', 'X', 'T', '3') -#define DDS_DXT4 MAKEFOURCC('D', 'X', 'T', '4') -#define DDS_DXT5 MAKEFOURCC('D', 'X', 'T', '5') +#define DDS_DXT1 BX_MAKEFOURCC('D', 'X', 'T', '1') +#define DDS_DXT2 BX_MAKEFOURCC('D', 'X', 'T', '2') +#define DDS_DXT3 BX_MAKEFOURCC('D', 'X', 'T', '3') +#define DDS_DXT4 BX_MAKEFOURCC('D', 'X', 'T', '4') +#define DDS_DXT5 BX_MAKEFOURCC('D', 'X', 'T', '5') #define D3DFMT_A16B16G16R16F 113 @@ -58,10 +58,10 @@ namespace bgfx bool isDds(const Memory* _mem) { - StreamRead stream(_mem->data, _mem->size); + bx::MemoryReader reader(_mem->data, _mem->size); uint32_t magic; - stream.read(magic); + bx::read(&reader, magic); return DDS_MAGIC == magic; } @@ -294,11 +294,11 @@ void Mip::decode(uint8_t* _dst) uint32_t width = m_width; uint32_t height = m_height; - if (m_bpp == 1 - || m_bpp == 4 - || m_bpp == 8) + if (m_bpp == 8 + || m_bpp == 32 + || m_bpp == 64) { - uint32_t pitch = m_width*m_bpp; + uint32_t pitch = m_width*m_bpp/8; memcpy(_dst, src, pitch*height); } else @@ -322,10 +322,10 @@ void Mip::decode(uint8_t* _dst) bool parseDds(Dds& _dds, const Memory* _mem) { - StreamRead stream(_mem->data, _mem->size); + bx::MemoryReader reader(_mem->data, _mem->size); uint32_t magic; - stream.read(magic); + bx::read(&reader, magic); if (DDS_MAGIC != magic) { @@ -333,7 +333,7 @@ bool parseDds(Dds& _dds, const Memory* _mem) } uint32_t headerSize; - stream.read(headerSize); + bx::read(&reader, headerSize); if (headerSize < DDS_HEADER_SIZE) { @@ -341,7 +341,7 @@ bool parseDds(Dds& _dds, const Memory* _mem) } uint32_t flags; - stream.read(flags); + bx::read(&reader, flags); if ( (flags & (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT) ) != (DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT) ) { @@ -349,47 +349,46 @@ bool parseDds(Dds& _dds, const Memory* _mem) } uint32_t height; - stream.read(height); + bx::read(&reader, height); uint32_t width; - stream.read(width); + bx::read(&reader, width); uint32_t pitch; - stream.read(pitch); + bx::read(&reader, pitch); uint32_t depth; - stream.read(depth); + bx::read(&reader, depth); uint32_t mips; - stream.read(mips); + bx::read(&reader, mips); - stream.skip(44); // reserved - - stream.skip(4); // pixel format size + bx::skip(&reader, 44); // reserved + bx::skip(&reader, 4); // pixel format size uint32_t pixelFlags; - stream.read(pixelFlags); + bx::read(&reader, pixelFlags); uint32_t fourcc; - stream.read(fourcc); + bx::read(&reader, fourcc); uint32_t rgbCount; - stream.read(rgbCount); + bx::read(&reader, rgbCount); uint32_t rbitmask; - stream.read(rbitmask); + bx::read(&reader, rbitmask); uint32_t gbitmask; - stream.read(gbitmask); + bx::read(&reader, gbitmask); uint32_t bbitmask; - stream.read(bbitmask); + bx::read(&reader, bbitmask); uint32_t abitmask; - stream.read(abitmask); + bx::read(&reader, abitmask); uint32_t caps[4]; - stream.read(caps); + bx::read(&reader, caps); if ( (caps[0] & DDSCAPS_TEXTURE) == 0) { @@ -406,9 +405,9 @@ bool parseDds(Dds& _dds, const Memory* _mem) } } - stream.skip(4); // reserved + bx::skip(&reader, 4); // reserved - uint8_t bpp = 1; + uint8_t bpp = 0; uint8_t blockSize = 1; TextureFormat::Enum type = TextureFormat::Unknown; bool hasAlpha = pixelFlags & DDPF_ALPHAPIXELS; @@ -420,24 +419,27 @@ bool parseDds(Dds& _dds, const Memory* _mem) case DDS_DXT1: type = TextureFormat::Dxt1; blockSize = 8; + bpp = 4; break; case DDS_DXT2: case DDS_DXT3: type = TextureFormat::Dxt3; blockSize = 16; + bpp = 4; break; case DDS_DXT4: case DDS_DXT5: type = TextureFormat::Dxt5; blockSize = 16; + bpp = 4; break; case D3DFMT_A16B16G16R16F: type = TextureFormat::ABGR16; blockSize = 8; - bpp = 8; + bpp = 64; break; } } @@ -448,20 +450,20 @@ bool parseDds(Dds& _dds, const Memory* _mem) case DDPF_RGB: type = TextureFormat::XRGB8; blockSize = 3; - bpp = 3; + bpp = 24; break; case DDPF_RGB|DDPF_ALPHAPIXELS: type = TextureFormat::ARGB8; blockSize = 4; - bpp = 4; + bpp = 32; break; case DDPF_INDEXED: case DDPF_LUMINANCE: case DDPF_ALPHA: type = TextureFormat::L8; - bpp = 1; + bpp = 8; break; // type = TextureFormat::A8; diff --git a/src/fs_clear_dx11.bin.h b/src/fs_clear_dx11.bin.h index 47959dbf..4423a3c8 100644 --- a/src/fs_clear_dx11.bin.h +++ b/src/fs_clear_dx11.bin.h @@ -1,38 +1,39 @@ -static const uint8_t fs_clear_dx11[554] = +static const uint8_t fs_clear_dx11[562] = { - 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ - 0x00, 0x00, 0x00, 0x14, 0x02, 0x44, 0x58, 0x42, 0x43, 0xda, 0x0f, 0xc3, 0x91, 0x70, 0x6f, 0xd4, // .....DXBC....po. - 0x7b, 0xeb, 0xe0, 0x21, 0x07, 0x79, 0xd8, 0x54, 0xd4, 0x01, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, // {..!.y.T........ - 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, // .....4.......... - 0x00, 0x34, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x70, 0x00, 0x00, // .4...x...RDEFp.. - 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, 0x31, // .........<...RD1 - 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, // 1<....... ...(.. - 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x69, 0x63, // .$...........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, 0xab, 0xab, // 9.29.952.3111... - 0xab, 0x49, 0x53, 0x47, 0x4e, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // .ISGNL.......... - 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .8.............. - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........D...... - 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, 0x4c, // .SV_POSITION.COL - 0x4f, 0x52, 0x00, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // OR...OSGN,...... - 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, 0x5f, // .............SV_ - 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, 0x58, 0x3c, 0x00, 0x00, // TARGET...SHEX<.. - 0x00, 0x50, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x62, 0x10, 0x00, // .P.......j...b.. - 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, // .........e.... . - 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, // .....6.... ..... - 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, // .F.......>...STA - 0x54, 0x94, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // T............... - 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, // ................ + 0x46, 0x53, 0x48, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // FSH....I........ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x02, 0x44, 0x58, 0x42, // .............DXB + 0x43, 0xda, 0x0f, 0xc3, 0x91, 0x70, 0x6f, 0xd4, 0x7b, 0xeb, 0xe0, 0x21, 0x07, 0x79, 0xd8, 0x54, // C....po.{..!.y.T + 0xd4, 0x01, 0x00, 0x00, 0x00, 0x14, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, // .............4.. + 0x00, 0xac, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x78, 0x01, 0x00, // .........4...x.. + 0x00, 0x52, 0x44, 0x45, 0x46, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .RDEFp.......... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x00, 0x91, 0x00, // .....<.......... + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, // .<...RD11<...... + 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, // . ...(...$...... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // .....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, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x4c, 0x00, 0x00, // .3111....ISGNL.. + 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........8...... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, // ................ + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .D.............. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, // .........SV_POSI + 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0xab, 0xab, 0x4f, 0x53, 0x47, // TION.COLOR...OSG + 0x4e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, // N,........... .. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x0f, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xab, // .....SV_TARGET.. + 0xab, 0x53, 0x48, 0x45, 0x58, 0x3c, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, // .SHEX<...P...... + 0x00, 0x6a, 0x08, 0x00, 0x01, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, // .j...b.......... + 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, // .e.... ......6.. + 0x05, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, // .. ......F...... + 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, // .>...STAT....... + 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, 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, 0x01, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, // .. }; diff --git a/src/fs_debugfont_dx11.bin.h b/src/fs_debugfont_dx11.bin.h index aa93167a..fcc54a45 100644 --- a/src/fs_debugfont_dx11.bin.h +++ b/src/fs_debugfont_dx11.bin.h @@ -1,61 +1,62 @@ -static const uint8_t fs_debugfont_dx11[922] = +static const uint8_t fs_debugfont_dx11[930] = { - 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ - 0x00, 0x00, 0x00, 0x84, 0x03, 0x44, 0x58, 0x42, 0x43, 0x7f, 0x04, 0x32, 0xab, 0xf6, 0xa8, 0x90, // .....DXBC..2.... - 0xe5, 0x2c, 0xd4, 0x3b, 0xd7, 0xa9, 0x89, 0x79, 0xfd, 0x01, 0x00, 0x00, 0x00, 0x84, 0x03, 0x00, // .,.;...y........ - 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, // .....4.......... - 0x00, 0xd0, 0x01, 0x00, 0x00, 0xe8, 0x02, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0xd4, 0x00, 0x00, // .........RDEF... - 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, 0xa0, 0x00, 0x00, 0x00, 0x52, 0x44, 0x31, // .............RD1 - 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, // 1<....... ...(.. - 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, 0x8e, 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, 0x0d, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x74, // .............u_t - 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x00, 0x75, // exColorSampler.u - 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // _texColorTexture - 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, // .Microsoft (R) H - 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, // LSL Shader Compi - 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, // ler 9.29.952.311 - 0x31, 0x00, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x84, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, // 1....ISGN....... - 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // .....h.......... - 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, // .............t.. - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // ................ - 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .....t.......... - 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x7a, 0x00, 0x00, // .............z.. - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // ................ - 0x00, 0x03, 0x03, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, // .....SV_POSITION - 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, // .COLOR.TEXCOORD. - 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // .OSGN,.......... - 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, 0x5f, 0x54, 0x41, 0x52, 0x47, // .........SV_TARG - 0x45, 0x54, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, 0x58, 0x10, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00, // ET...SHEX....P.. - 0x00, 0x44, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x5a, 0x00, 0x00, 0x03, 0x00, 0x60, 0x10, // .D...j...Z....`. - 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, 0x04, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, // .....X....p..... - 0x00, 0x55, 0x55, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, // .UU..b.......... - 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, // .b...........b.. - 0x03, 0x32, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, // .2.......e.... . - 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, // .....h.......E.. - 0x8b, 0xc2, 0x00, 0x00, 0x80, 0x43, 0x55, 0x15, 0x00, 0x12, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, // .....CU......... - 0x00, 0x46, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x46, 0x7e, 0x10, 0x00, 0x00, 0x00, 0x00, // .F.......F~..... - 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, 0x00, 0x00, 0x46, 0x1e, 0x10, // .....F.......F.. - 0x80, 0x41, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x10, // .A.......2...... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, // .............F.. - 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, // .....F.......1.. - 0x07, 0x12, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3a, 0x00, 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, 0x10, 0x00, 0x00, 0x00, 0x00, // .....6.... ..... - 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, // .F.......>...STA - 0x54, 0x94, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // T............... - 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, // ................ + 0x46, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, // FSH..."f........ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x03, 0x44, 0x58, 0x42, // .............DXB + 0x43, 0x7f, 0x04, 0x32, 0xab, 0xf6, 0xa8, 0x90, 0xe5, 0x2c, 0xd4, 0x3b, 0xd7, 0xa9, 0x89, 0x79, // C..2.....,.;...y + 0xfd, 0x01, 0x00, 0x00, 0x00, 0x84, 0x03, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, // .............4.. + 0x00, 0x10, 0x01, 0x00, 0x00, 0x9c, 0x01, 0x00, 0x00, 0xd0, 0x01, 0x00, 0x00, 0xe8, 0x02, 0x00, // ................ + 0x00, 0x52, 0x44, 0x45, 0x46, 0xd4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .RDEF........... + 0x00, 0x02, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xff, 0xff, 0x00, 0x91, 0x00, // .....<.......... + 0x00, 0xa0, 0x00, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, // .....RD11<...... + 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 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, 0x8e, 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, 0x0d, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x53, // .....u_texColorS + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x00, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // ampler.u_texColo + 0x72, 0x54, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, // rTexture.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, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, // .952.3111....ISG + 0x4e, 0x84, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, // N............h.. + 0x00, 0x00, 0x00, 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, // .....t.......... + 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x74, 0x00, 0x00, // .............t.. + 0x00, 0x01, 0x00, 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, // .....z.......... + 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x53, 0x56, 0x5f, // .............SV_ + 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, // POSITION.COLOR.T + 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x00, 0x00, // EXCOORD..OSGN,.. + 0x00, 0x01, 0x00, 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, 0x5f, 0x54, 0x41, 0x52, 0x47, 0x45, 0x54, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, // .SV_TARGET...SHE + 0x58, 0x10, 0x01, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, // X....P...D...j.. + 0x01, 0x5a, 0x00, 0x00, 0x03, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, // .Z....`......X.. + 0x04, 0x00, 0x70, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x62, 0x10, 0x00, // ..p......UU..b.. + 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0xf2, 0x10, 0x10, // .........b...... + 0x00, 0x02, 0x00, 0x00, 0x00, 0x62, 0x10, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, // .....b...2...... + 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, // .e.... ......h.. + 0x02, 0x02, 0x00, 0x00, 0x00, 0x45, 0x00, 0x00, 0x8b, 0xc2, 0x00, 0x00, 0x80, 0x43, 0x55, 0x15, // .....E.......CU. + 0x00, 0x12, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, // .........F...... + 0x00, 0x46, 0x7e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, // .F~.......`..... + 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, // .............F.. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x80, 0x41, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, // .....F...A...... + 0x00, 0x32, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x10, // .2.............. + 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, // .....F.......F.. + 0x00, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x07, 0x12, 0x00, 0x10, 0x00, 0x01, 0x00, 0x00, // .....1.......... + 0x00, 0x3a, 0x00, 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, // ;............6.. + 0x05, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, // .. ......F...... + 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, // .>...STAT....... + 0x00, 0x02, 0x00, 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, 0x02, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, // .. }; diff --git a/src/fs_debugfont_dx9.bin.h b/src/fs_debugfont_dx9.bin.h index d8e642e1..1da618f1 100644 --- a/src/fs_debugfont_dx9.bin.h +++ b/src/fs_debugfont_dx9.bin.h @@ -1,25 +1,26 @@ -static const uint8_t fs_debugfont_dx9[345] = +static const uint8_t fs_debugfont_dx9[353] = { - 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, // ......... + 0x46, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x00, 0x00, 0x54, 0x01, 0x01, 0x02, 0xff, 0xff, // FSH..."f..T..... + 0xfe, 0xff, 0x22, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, 0x00, 0x00, 0x53, 0x00, 0x00, 0x00, // ..".CTAB....S... + 0x01, 0x02, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, // ................ + 0x4c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, // L...0........... + 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, // <.......u_texCol + 0x6f, 0x72, 0x00, 0xab, 0x04, 0x00, 0x0c, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, // or.............. + 0x00, 0x00, 0x00, 0x00, 0x70, 0x73, 0x5f, 0x32, 0x5f, 0x61, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, // ....ps_2_a.Micro + 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, // soft (R) HLSL Sh + 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, // ader Compiler 9. + 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0x51, 0x00, 0x00, 0x05, // 29.952.3111.Q... + 0x00, 0x00, 0x0f, 0xa0, 0x81, 0x80, 0x80, 0xbb, 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, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0xb0, // ....B........... + 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, 0x01, 0x00, 0x0f, 0x80, 0x01, 0x00, 0x00, 0x80, // ....X........... + 0x00, 0x00, 0x55, 0xa0, 0x00, 0x00, 0xaa, 0xa0, 0x41, 0x00, 0x00, 0x01, 0x01, 0x00, 0x0f, 0x80, // ..U.....A....... + 0x01, 0x00, 0x00, 0x02, 0x00, 0x08, 0x0f, 0x80, 0x00, 0x00, 0xe4, 0x80, 0xff, 0xff, 0x00, 0x00, // ................ + 0x00, // . }; diff --git a/src/fs_debugfont_glsl.bin.h b/src/fs_debugfont_glsl.bin.h index 933d4b9a..32c6cb1b 100644 --- a/src/fs_debugfont_glsl.bin.h +++ b/src/fs_debugfont_glsl.bin.h @@ -1,25 +1,26 @@ -static const uint8_t fs_debugfont_glsl[352] = +static const uint8_t fs_debugfont_glsl[360] = { - 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x70, 0x72, 0x65, // #ifdef GL_ES.pre - 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // cision highp flo - 0x61, 0x74, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x4c, // at;.#endif // GL - 0x5f, 0x45, 0x53, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, // _ES..uniform sam - 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, // pler2D u_texColo - 0x72, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // r;.varying vec2 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, // v_texcoord0;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ying vec4 v_colo - 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, // r1;.varying vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, // v_color0;.void - 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, // main ().{. vec4 - 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, // tmpvar_1;. tmp - 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, 0x5f, 0x63, // var_1 = mix (v_c - 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2c, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2c, // olor1, v_color0, - 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x74, 0x65, // texture2D (u_te - 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // xColor, v_texcoo - 0x72, 0x64, 0x30, 0x29, 0x2e, 0x78, 0x78, 0x78, 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, // rd0).xxxx);. if - 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3c, 0x20, // ((tmpvar_1.w < - 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x32, 0x31, 0x35, 0x37, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, // 0.00392157)) {. - 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, 0x72, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, // discard;. }; - 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, // . gl_FragColor - 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // = tmpvar_1;.}... + 0x46, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, // FSH..."f#ifdef G + 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, // L_ES.precision h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, // ighp float;.#end + 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x0a, 0x75, 0x6e, 0x69, // if // GL_ES..uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x32, 0x44, 0x20, 0x75, // form sampler2D u + 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // _texColor;.varyi + 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec2 v_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd0;.varying vec + 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color1;.vary + 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color + 0x30, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, // 0;.void main (). + 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, // {. vec4 tmpvar_ + 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x20, 0x3d, 0x20, // 1;. tmpvar_1 = + 0x6d, 0x69, 0x78, 0x20, 0x28, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x2c, 0x20, 0x76, // mix (v_color1, v + 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x2c, 0x20, 0x74, 0x65, 0x78, 0x74, 0x75, 0x72, 0x65, // _color0, texture + 0x32, 0x44, 0x20, 0x28, 0x75, 0x5f, 0x74, 0x65, 0x78, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x2c, 0x20, // 2D (u_texColor, + 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x29, 0x2e, 0x78, 0x78, 0x78, // v_texcoord0).xxx + 0x78, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x69, 0x66, 0x20, 0x28, 0x28, 0x74, 0x6d, 0x70, 0x76, 0x61, // x);. if ((tmpva + 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3c, 0x20, 0x30, 0x2e, 0x30, 0x30, 0x33, 0x39, 0x32, 0x31, // r_1.w < 0.003921 + 0x35, 0x37, 0x29, 0x29, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x73, 0x63, 0x61, // 57)) {. disca + 0x72, 0x64, 0x3b, 0x0a, 0x20, 0x20, 0x7d, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x46, 0x72, // rd;. };. gl_Fr + 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, 0x3d, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // agColor = tmpvar + 0x5f, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // _1;.}... }; diff --git a/src/glimports.h b/src/glimports.h index d9620941..7dd5616b 100644 --- a/src/glimports.h +++ b/src/glimports.h @@ -30,6 +30,7 @@ GL_IMPORT(false, PFNGLGETINTEGERVPROC, glGetIntegerv); GL_IMPORT(false, PFNGLGETSTRINGPROC, glGetString); GL_IMPORT(false, PFNGLDRAWARRAYSPROC, glDrawArrays); GL_IMPORT(false, PFNGLBLENDFUNCPROC, glBlendFunc); +GL_IMPORT(false, PFNGLBLENDEQUATIONPROC, glBlendEquation); GL_IMPORT(false, PFNGLPOINTSIZEPROC, glPointSize); GL_IMPORT(false, PFNGLCULLFACEPROC, glCullFace); GL_IMPORT(false, PFNGLCLEARPROC, glClear); @@ -46,7 +47,9 @@ GL_IMPORT(false, PFNGLSTENCILOPPROC, glStencilOp); GL_IMPORT(false, PFNGLACTIVETEXTUREPROC, glActiveTexture); GL_IMPORT(false, PFNGLCOMPRESSEDTEXIMAGE2DPROC, glCompressedTexImage2D); +GL_IMPORT(false, PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC, glCompressedTexSubImage2D); GL_IMPORT(false, PFNGLCOMPRESSEDTEXIMAGE3DPROC, glCompressedTexImage3D); +GL_IMPORT(false, PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC, glCompressedTexSubImage3D); GL_IMPORT(false, PFNGLBINDBUFFERPROC, glBindBuffer); GL_IMPORT(false, PFNGLDELETEBUFFERSPROC, glDeleteBuffers); GL_IMPORT(false, PFNGLGENBUFFERSPROC, glGenBuffers); @@ -131,6 +134,9 @@ GL_IMPORT(true, PFNGLSTENCILFUNCSEPARATEPROC, glStencilFuncSeparate) GL_IMPORT(true, PFNGLSTENCILMASKSEPARATEPROC, glStencilMaskSeparate); GL_IMPORT(true, PFNGLSTENCILOPSEPARATEPROC, glStencilOpSeparate); +GL_IMPORT(true, PFNGLBLENDFUNCSEPARATEPROC, glBlendFuncSeparate); +GL_IMPORT(true, PFNGLBLENDEQUATIONSEPARATEPROC, glBlendEquationSeparate); + #if BGFX_CONFIG_DEBUG_GREMEDY GL_IMPORT(true, PFNGLSTRINGMARKERGREMEDYPROC, glStringMarkerGREMEDY); GL_IMPORT(true, PFNGLFRAMETERMINATORGREMEDYPROC, glFrameTerminatorGREMEDY); diff --git a/src/renderer_d3d11.cpp b/src/renderer_d3d11.cpp index 615e917d..b194b33d 100644 --- a/src/renderer_d3d11.cpp +++ b/src/renderer_d3d11.cpp @@ -111,17 +111,27 @@ namespace bgfx uint8_t m_bpp; }; +#ifndef DXGI_FORMAT_B4G4R4A4_UNORM +// Win8 only BS +// https://blogs.msdn.com/b/chuckw/archive/2012/11/14/directx-11-1-and-windows-7.aspx?Redirected=true +// http://msdn.microsoft.com/en-us/library/windows/desktop/bb173059%28v=vs.85%29.aspx +# define DXGI_FORMAT_B4G4R4A4_UNORM DXGI_FORMAT(115) +#endif // DXGI_FORMAT_B4G4R4A4_UNORM + 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_B8G8R8A8_UNORM, 4 }, - { DXGI_FORMAT_B8G8R8A8_UNORM, 4 }, - { DXGI_FORMAT_R16G16B16A16_FLOAT, 8 }, - { DXGI_FORMAT_B5G6R5_UNORM, 2 }, + { DXGI_FORMAT_BC1_UNORM, 4 }, + { DXGI_FORMAT_BC2_UNORM, 4 }, + { DXGI_FORMAT_BC3_UNORM, 4 }, + { DXGI_FORMAT_UNKNOWN, 0 }, + { DXGI_FORMAT_R8_UNORM, 8 }, + { DXGI_FORMAT_B8G8R8A8_UNORM, 32 }, + { DXGI_FORMAT_B8G8R8A8_UNORM, 32 }, + { DXGI_FORMAT_R16G16B16A16_FLOAT, 64 }, + { DXGI_FORMAT_B5G6R5_UNORM, 16 }, + { DXGI_FORMAT_B4G4R4A4_UNORM, 16 }, + { DXGI_FORMAT_B5G5R5A1_UNORM, 16 }, + { DXGI_FORMAT_R10G10B10A2_UNORM, 32 }, }; static const D3D11_INPUT_ELEMENT_DESC s_attrib[Attrib::Count] = @@ -205,6 +215,11 @@ namespace bgfx struct TextureStage { TextureStage() + { + clear(); + } + + void clear() { memset(m_srv, 0, sizeof(m_srv) ); memset(m_sampler, 0, sizeof(m_sampler) ); @@ -214,6 +229,23 @@ namespace bgfx ID3D11SamplerState* m_sampler[BGFX_STATE_TEX_COUNT]; }; + static const GUID WKPDID_D3DDebugObjectName = { 0x429b8c22, 0x9188, 0x4b0c, { 0x87, 0x42, 0xac, 0xb0, 0xbf, 0x85, 0xc2, 0x00 } }; + + template <typename Ty> + static BX_NO_INLINE void setDebugObjectName(Ty* _interface, const char* _format, ...) + { +#if BGFX_CONFIG_DEBUG_OBJECT_NAME + char temp[2048]; + va_list argList; + va_start(argList, _format); + int size = uint32_min(sizeof(temp)-1, vsnprintf(temp, sizeof(temp), _format, argList) ); + va_end(argList); + temp[size] = '\0'; + + _interface->SetPrivateData(WKPDID_D3DDebugObjectName, size, temp); +#endif // BGFX_CONFIG_DEBUG_OBJECT_NAME + } + struct RendererContext { RendererContext() @@ -372,6 +404,9 @@ namespace bgfx DX_RELEASE(depthStencil, 0); m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil); + + m_currentColor = m_backBufferColor; + m_currentDepthStencil = m_backBufferDepthStencil; } void flip() @@ -460,37 +495,40 @@ namespace bgfx if (_rt.idx == invalidHandle) { m_deviceCtx->OMSetRenderTargets(1, &m_backBufferColor, m_backBufferDepthStencil); + + m_currentColor = m_backBufferColor; + m_currentDepthStencil = m_backBufferDepthStencil; } else { + invalidateTextureStage(); + RenderTarget& renderTarget = m_renderTargets[_rt.idx]; - m_deviceCtx->OMSetRenderTargets(1, &renderTarget.m_rtv, m_backBufferDepthStencil); + m_deviceCtx->OMSetRenderTargets(1, &renderTarget.m_rtv, renderTarget.m_dsv); + + m_currentColor = renderTarget.m_rtv; + m_currentDepthStencil = renderTarget.m_dsv; } } void clear(const Clear& _clear) { -// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, TRUE) ); -// DX_CHECK(s_renderCtx.m_device->SetScissorRect(&rc) ); - - if (BGFX_CLEAR_COLOR_BIT & _clear.m_flags) + if (NULL != m_currentColor + && BGFX_CLEAR_COLOR_BIT & _clear.m_flags) { uint32_t rgba = _clear.m_rgba; float frgba[4] = { (rgba>>24)/255.0f, ( (rgba>>16)&0xff)/255.0f, ( (rgba>>8)&0xff)/255.0f, (rgba&0xff)/255.0f }; -// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_COLORWRITEENABLE, D3DCOLORWRITEENABLE_RED|D3DCOLORWRITEENABLE_GREEN|D3DCOLORWRITEENABLE_BLUE|D3DCOLORWRITEENABLE_ALPHA) ); - m_deviceCtx->ClearRenderTargetView(m_backBufferColor, frgba); + m_deviceCtx->ClearRenderTargetView(m_currentColor, frgba); } - if ( (BGFX_CLEAR_DEPTH_BIT|BGFX_CLEAR_STENCIL_BIT) & _clear.m_flags) + if (NULL != m_currentDepthStencil + && (BGFX_CLEAR_DEPTH_BIT|BGFX_CLEAR_STENCIL_BIT) & _clear.m_flags) { DWORD flags = 0; flags |= (_clear.m_flags & BGFX_CLEAR_DEPTH_BIT) ? D3D11_CLEAR_DEPTH : 0; flags |= (_clear.m_flags & BGFX_CLEAR_STENCIL_BIT) ? D3D11_CLEAR_STENCIL : 0; -// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_ZWRITEENABLE, TRUE) ); - m_deviceCtx->ClearDepthStencilView(m_backBufferDepthStencil, flags, _clear.m_depth, _clear.m_stencil); + m_deviceCtx->ClearDepthStencilView(m_currentDepthStencil, flags, _clear.m_depth, _clear.m_stencil); } - -// DX_CHECK(s_renderCtx.m_device->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE) ); } void setInputLayout(const VertexDecl& _vertexDecl, const Program& _program, uint8_t _numInstanceData) @@ -513,7 +551,6 @@ namespace bgfx decl.m_attributes[ii] = attr == 0 ? 0xff : attr == 0xff ? 0 : attr; } - D3D11_INPUT_ELEMENT_DESC* elem = fillVertexDecl(vertexElements, Attrib::Count, decl); ptrdiff_t num = elem-vertexElements; @@ -638,7 +675,7 @@ namespace bgfx DX_CHECK(m_device->CreateDepthStencilState(&desc, &dss) ); - m_depthStencilStateCache.add(_state, dss); + m_depthStencilStateCache.add(hash, dss); } m_deviceCtx->OMSetDepthStencilState(dss, ref); @@ -661,12 +698,19 @@ namespace bgfx ID3D11RasterizerState* rs = m_rasterizerStateCache.find(_state); if (NULL == rs) { - D3D11_RASTERIZER_DESC desc; - memset(&desc, 0, sizeof(desc) ); - desc.FillMode = _wireframe ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID; - uint32_t cull = (_state&BGFX_STATE_CULL_MASK)>>BGFX_STATE_CULL_SHIFT; + + D3D11_RASTERIZER_DESC desc; + desc.FillMode = _wireframe ? D3D11_FILL_WIREFRAME : D3D11_FILL_SOLID; desc.CullMode = s_cullMode[cull]; + desc.FrontCounterClockwise = false; + desc.DepthBias = 0; + desc.DepthBiasClamp = 0.0f; + desc.SlopeScaledDepthBias = 0.0f; + desc.DepthClipEnable = false; + desc.ScissorEnable = false; + desc.MultisampleEnable = false; + desc.AntialiasedLineEnable = false; DX_CHECK(m_device->CreateRasterizerState(&desc, &rs) ); @@ -682,6 +726,12 @@ namespace bgfx m_deviceCtx->PSSetSamplers(0, BGFX_STATE_TEX_COUNT, m_textureStage.m_sampler); } + void invalidateTextureStage() + { + m_textureStage.clear(); + commitTextureStage(); + } + void saveScreenShot(Memory* _mem) { ID3D11Texture2D* backBuffer; @@ -704,7 +754,7 @@ namespace bgfx { if (backBufferDesc.SampleDesc.Count == 1) { - m_deviceCtx->CopyResource(texture, backBuffer); + m_deviceCtx->CopyResource(texture, backBuffer); } else { @@ -715,8 +765,8 @@ namespace bgfx if (SUCCEEDED(hr) ) { m_deviceCtx->ResolveSubresource(resolve, 0, backBuffer, 0, desc.Format); - m_deviceCtx->CopyResource(texture, resolve); - DX_RELEASE(resolve, 0); + m_deviceCtx->CopyResource(texture, resolve); + DX_RELEASE(resolve, 0); } } @@ -737,6 +787,8 @@ namespace bgfx ID3D11DeviceContext* m_deviceCtx; ID3D11RenderTargetView* m_backBufferColor; ID3D11DepthStencilView* m_backBufferDepthStencil; + ID3D11RenderTargetView* m_currentColor; + ID3D11DepthStencilView* m_currentDepthStencil; bool m_wireframe; @@ -1059,25 +1111,28 @@ namespace bgfx uint32_t m_abgr; } * vertex = (Vertex*)m_vb->data; + const uint32_t abgr = bx::endianSwap(_clear.m_rgba); + const float depth = _clear.m_depth; + 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->m_z = depth; + vertex->m_abgr = abgr; 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->m_z = depth; + vertex->m_abgr = abgr; 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->m_z = depth; + vertex->m_abgr = abgr; 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->m_z = depth; + vertex->m_abgr = abgr; } s_renderCtx.m_vertexBuffers[m_vb->handle.idx].update(0, 4*m_decl.m_stride, m_vb->data); @@ -1094,17 +1149,21 @@ namespace bgfx void Shader::create(bool _fragment, const Memory* _mem) { - m_constantBuffer = ConstantBuffer::create(1024); + bx::MemoryReader reader(_mem->data, _mem->size); - StreamRead stream(_mem->data, _mem->size); + uint32_t magic; + bx::read(&reader, magic); - stream.read(m_attrMask, sizeof(m_attrMask) ); + uint32_t iohash; + bx::read(&reader, iohash); + + bx::read(&reader, m_attrMask, sizeof(m_attrMask) ); uint16_t count; - stream.read(count); + bx::read(&reader, count); uint16_t size; - stream.read(size); + bx::read(&reader, size); if (0 < size) { @@ -1125,70 +1184,75 @@ namespace bgfx uint8_t fragmentBit = _fragment ? BGFX_UNIFORM_FRAGMENTBIT : 0; - for (uint32_t ii = 0; ii < count; ++ii) + if (0 < count) { - uint8_t nameSize; - stream.read(nameSize); + m_constantBuffer = ConstantBuffer::create(1024); - char name[256]; - stream.read(&name, nameSize); - name[nameSize] = '\0'; - - uint8_t type; - stream.read(type); - - uint8_t num; - stream.read(num); - - uint16_t regIndex; - stream.read(regIndex); - - uint16_t regCount; - stream.read(regCount); - - const char* kind = "invalid"; - - const void* data = NULL; - PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name); - if (PredefinedUniform::Count != predefined) + for (uint32_t ii = 0; ii < count; ++ii) { - kind = "predefined"; - m_predefined[m_numPredefined].m_loc = regIndex; - m_predefined[m_numPredefined].m_count = regCount; - m_predefined[m_numPredefined].m_type = predefined|fragmentBit; - m_numPredefined++; - } - else - { - const UniformInfo* info = s_renderCtx.m_uniformReg.find(name); - UniformBuffer* uniform = info != NULL ? (UniformBuffer*)info->m_data : NULL; + uint8_t nameSize; + bx::read(&reader, nameSize); - if (NULL != uniform) + char name[256]; + bx::read(&reader, &name, nameSize); + name[nameSize] = '\0'; + + uint8_t type; + bx::read(&reader, type); + + uint8_t num; + bx::read(&reader, num); + + uint16_t regIndex; + bx::read(&reader, regIndex); + + uint16_t regCount; + bx::read(&reader, regCount); + + const char* kind = "invalid"; + + const void* data = NULL; + PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name); + if (PredefinedUniform::Count != predefined) { - kind = "user"; - data = uniform->m_data; - m_constantBuffer->writeUniformRef( (UniformType::Enum)(type|fragmentBit), regIndex, data, regCount); + kind = "predefined"; + m_predefined[m_numPredefined].m_loc = regIndex; + m_predefined[m_numPredefined].m_count = regCount; + m_predefined[m_numPredefined].m_type = predefined|fragmentBit; + m_numPredefined++; } + else + { + const UniformInfo* info = s_renderCtx.m_uniformReg.find(name); + UniformBuffer* uniform = info != NULL ? (UniformBuffer*)info->m_data : NULL; + + if (NULL != uniform) + { + kind = "user"; + data = uniform->m_data; + m_constantBuffer->writeUniformRef( (UniformType::Enum)(type|fragmentBit), regIndex, data, regCount); + } + } + + BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d" + , kind + , name + , type + , num + , regIndex + , regCount + ); + BX_UNUSED(kind); } - BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d" - , kind - , name - , type - , num - , regIndex - , regCount - ); - BX_UNUSED(kind); + m_constantBuffer->finish(); } uint16_t shaderSize; - stream.read(shaderSize); + bx::read(&reader, shaderSize); - m_constantBuffer->finish(); - - const DWORD* code = (const DWORD*)stream.getDataPtr(); - stream.skip(shaderSize); + const DWORD* code = (const DWORD*)reader.getDataPtr(); + bx::skip(&reader, shaderSize); if (_fragment) { @@ -1196,7 +1260,7 @@ namespace bgfx } else { - m_hash = hash(code, shaderSize); + m_hash = hashMurmur2A(code, shaderSize); m_code = alloc(shaderSize); memcpy(m_code->data, code, shaderSize); @@ -1234,8 +1298,6 @@ namespace bgfx if (parseDds(dds, _mem) ) { - uint8_t bpp = dds.m_bpp; - bool decompress = false; if (dds.m_cubeMap) @@ -1281,16 +1343,16 @@ namespace bgfx { if (convert) { - uint8_t* temp = (uint8_t*)g_realloc(NULL, mip.m_width*bpp*mip.m_height); + uint8_t* temp = (uint8_t*)g_realloc(NULL, mip.m_width*bpp*mip.m_height/8); mip.decode(temp); srd[kk].pSysMem = temp; - srd[kk].SysMemPitch = mip.m_width*bpp; + srd[kk].SysMemPitch = mip.m_width*bpp/8; } else { srd[kk].pSysMem = mip.m_data; - srd[kk].SysMemPitch = mip.m_width*mip.m_bpp; + srd[kk].SysMemPitch = mip.m_width*mip.m_bpp/8; } srd[kk].SysMemSlicePitch = mip.m_height*srd[kk].SysMemPitch; @@ -1320,7 +1382,7 @@ namespace bgfx } else { - srd[kk].SysMemPitch = mip.m_width*mip.m_bpp; + srd[kk].SysMemPitch = mip.m_width*mip.m_bpp/8; srd[kk].SysMemSlicePitch = mip.m_height*srd[kk].SysMemPitch; } @@ -1407,22 +1469,22 @@ namespace bgfx } else { - StreamRead stream(_mem->data, _mem->size); + bx::MemoryReader reader(_mem->data, _mem->size); uint32_t magic; - stream.read(magic); + bx::read(&reader, magic); - if (BGFX_MAGIC == magic) + if (BGFX_CHUNK_MAGIC_TEX == magic) { TextureCreate tc; - stream.read(tc); + bx::read(&reader, tc); D3D11_TEXTURE2D_DESC desc; desc.Width = tc.m_width; desc.Height = tc.m_height; desc.MipLevels = tc.m_numMips; desc.ArraySize = 1; - desc.Format = s_textureFormat[tc.m_type].m_fmt; + desc.Format = s_textureFormat[tc.m_format].m_fmt; desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; @@ -1436,14 +1498,14 @@ namespace bgfx desc.Usage = D3D11_USAGE_IMMUTABLE; D3D11_SUBRESOURCE_DATA* srd = (D3D11_SUBRESOURCE_DATA*)alloca(tc.m_numMips*sizeof(D3D11_SUBRESOURCE_DATA) ); - uint32_t bpp = s_textureFormat[tc.m_type].m_bpp; + uint32_t bpp = s_textureFormat[tc.m_format].m_bpp; uint8_t* data = tc.m_mem->data; for (uint8_t side = 0, numSides = tc.m_cubeMap ? 6 : 1; side < numSides; ++side) { uint32_t width = tc.m_width; uint32_t height = tc.m_height; - uint32_t depth = tc.m_depth; + uint32_t depth = tc.m_depth; for (uint32_t lod = 0, num = tc.m_numMips; lod < num; ++lod) { @@ -1452,14 +1514,14 @@ namespace bgfx depth = uint32_max(1, depth); srd[lod].pSysMem = data; - srd[lod].SysMemPitch = width*bpp; + srd[lod].SysMemPitch = width*bpp/8; srd[lod].SysMemSlicePitch = 0; - data += width*height*bpp; + data += width*height*bpp/8; width >>= 1; height >>= 1; - depth >>= 1; + depth >>= 1; } } @@ -1493,16 +1555,16 @@ namespace bgfx s_renderCtx.m_textureStage.m_sampler[_stage] = m_sampler; } - void Texture::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem) - { + void Texture::update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem) + { ID3D11DeviceContext* deviceCtx = s_renderCtx.m_deviceCtx; - D3D11_BOX box; - box.left = _rect.m_x; - box.top = _rect.m_y; - box.right = box.left + _rect.m_width; + D3D11_BOX box; + box.left = _rect.m_x; + box.top = _rect.m_y; + box.right = box.left + _rect.m_width; box.bottom = box.top + _rect.m_height; - box.front = _z; + box.front = _z; box.back = box.front + _depth; uint32_t subres = _mip + (_side * m_numMips); @@ -1523,7 +1585,7 @@ namespace bgfx #else deviceCtx->UpdateSubresource(m_ptr, subres, &box, _mem->data, _rect.m_width, 0); #endif // 0 - } + } void RenderTarget::create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags) { @@ -1532,6 +1594,7 @@ namespace bgfx m_flags = _flags; uint32_t colorFormat = (m_flags&BGFX_RENDER_TARGET_COLOR_MASK)>>BGFX_RENDER_TARGET_COLOR_SHIFT; + uint32_t depthFormat = (m_flags&BGFX_RENDER_TARGET_DEPTH_MASK)>>BGFX_RENDER_TARGET_DEPTH_SHIFT; D3D11_TEXTURE2D_DESC desc; desc.Width = _width; @@ -1550,6 +1613,26 @@ namespace bgfx DX_CHECK(s_renderCtx.m_device->CreateRenderTargetView(m_colorTexture, NULL, &m_rtv) ); DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_colorTexture, NULL, &m_srv) ); + if (0 < depthFormat) + { + D3D11_TEXTURE2D_DESC desc; + desc.Width = _width; + desc.Height = _height; + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = s_depthFormat[colorFormat]; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_DEPTH_STENCIL; + desc.CPUAccessFlags = 0; + desc.MiscFlags = 0; + + DX_CHECK(s_renderCtx.m_device->CreateTexture2D(&desc, NULL, &m_depthTexture) ); + DX_CHECK(s_renderCtx.m_device->CreateDepthStencilView(m_depthTexture, NULL, &m_dsv) ); +// DX_CHECK(s_renderCtx.m_device->CreateShaderResourceView(m_depthTexture, NULL, &m_srv) ); + } + m_sampler = s_renderCtx.m_samplerStateCache.find(_flags); if (NULL == m_sampler) { @@ -1578,6 +1661,8 @@ namespace bgfx DX_RELEASE(m_srv, 0); DX_RELEASE(m_rtv, 0); DX_RELEASE(m_colorTexture, 0); + DX_RELEASE(m_dsv, 0); + DX_RELEASE(m_depthTexture, 0); m_flags = 0; } @@ -1889,8 +1974,7 @@ namespace bgfx s_renderCtx.setDepthStencilState(newFlags, newStencil); } - if ( (BGFX_STATE_CULL_MASK - |BGFX_STATE_ALPHA_MASK|BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE + if ( (BGFX_STATE_CULL_MASK|BGFX_STATE_ALPHA_MASK|BGFX_STATE_RGB_WRITE |BGFX_STATE_BLEND_MASK|BGFX_STATE_ALPHA_REF_MASK|BGFX_STATE_PT_MASK |BGFX_STATE_POINT_SIZE_MASK|BGFX_STATE_SRGBWRITE|BGFX_STATE_MSAA) & changedFlags) { @@ -1904,6 +1988,12 @@ namespace bgfx s_renderCtx.setRasterizerState(newFlags, wireframe); } + if ( (BGFX_STATE_ALPHA_TEST|BGFX_STATE_ALPHA_REF_MASK) & changedFlags) + { + uint32_t ref = (newFlags&BGFX_STATE_ALPHA_REF_MASK)>>BGFX_STATE_ALPHA_REF_SHIFT; + alphaRef = ref/255.0f; + } + uint8_t primIndex = uint8_t( (newFlags&BGFX_STATE_PT_MASK)>>BGFX_STATE_PT_SHIFT); if (primType != s_primType[primIndex]) { @@ -1950,8 +2040,7 @@ namespace bgfx if (constantsChanged) { - program.m_vsh->m_constantBuffer->commit(); - program.m_fsh->m_constantBuffer->commit(); + program.commit(); } for (uint32_t ii = 0, num = program.m_numPredefined; ii < num; ++ii) diff --git a/src/renderer_d3d11.h b/src/renderer_d3d11.h index fb23f4df..162eeb78 100644 --- a/src/renderer_d3d11.h +++ b/src/renderer_d3d11.h @@ -199,6 +199,19 @@ namespace bgfx m_fsh = NULL; } + void commit() + { + if (NULL != m_vsh->m_constantBuffer) + { + m_vsh->m_constantBuffer->commit(); + } + + if (NULL != m_fsh->m_constantBuffer) + { + m_fsh->m_constantBuffer->commit(); + } + } + const Shader* m_vsh; const Shader* m_fsh; @@ -224,10 +237,6 @@ namespace bgfx { } -// 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() @@ -236,14 +245,14 @@ namespace bgfx DX_RELEASE(m_ptr, 1); } - void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem); + void update(uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, const Memory* _mem); void commit(uint8_t _stage); union { ID3D11Resource* m_ptr; ID3D11Texture2D* m_texture2d; - ID3D11Texture3D* m_texture3d; + ID3D11Texture3D* m_texture3d; }; ID3D11ShaderResourceView* m_srv; @@ -256,15 +265,14 @@ namespace bgfx struct RenderTarget { RenderTarget() - : -// m_rt(NULL) -// , m_colorTexture(NULL) -// , m_color(NULL) -// , m_depthTexture(NULL) -// , m_depth(NULL) + : m_colorTexture(NULL) + , m_depthTexture(NULL) + , m_rtv(NULL) + , m_dsv(NULL) + , m_srv(NULL) // , m_minFilter(D3DTEXF_LINEAR) // , m_magFilter(D3DTEXF_LINEAR) - m_width(0) + , m_width(0) , m_height(0) , m_flags(0) , m_depthOnly(false) @@ -287,7 +295,9 @@ namespace bgfx // D3DTEXTUREFILTERTYPE m_magFilter; ID3D11Texture2D* m_colorTexture; + ID3D11Texture2D* m_depthTexture; ID3D11RenderTargetView* m_rtv; + ID3D11DepthStencilView* m_dsv; ID3D11ShaderResourceView* m_srv; ID3D11SamplerState* m_sampler; uint16_t m_width; diff --git a/src/renderer_d3d9.cpp b/src/renderer_d3d9.cpp index 5aad557e..30d9e845 100644 --- a/src/renderer_d3d9.cpp +++ b/src/renderer_d3d9.cpp @@ -171,15 +171,18 @@ namespace bgfx static const TextureFormatInfo s_textureFormat[TextureFormat::Count] = { - { D3DFMT_DXT1, 1 }, - { D3DFMT_DXT3, 1 }, - { D3DFMT_DXT5, 1 }, - { D3DFMT_UNKNOWN, 0 }, - { D3DFMT_L8, 1 }, - { D3DFMT_X8R8G8B8, 4 }, - { D3DFMT_A8R8G8B8, 4 }, - { D3DFMT_A16B16G16R16, 8 }, - { D3DFMT_R5G6B5, 2 }, + { D3DFMT_DXT1, 4 }, + { D3DFMT_DXT3, 4 }, + { D3DFMT_DXT5, 4 }, + { D3DFMT_UNKNOWN, 0 }, + { D3DFMT_L8, 8 }, + { D3DFMT_X8R8G8B8, 32 }, + { D3DFMT_A8R8G8B8, 32 }, + { D3DFMT_A16B16G16R16, 64 }, + { D3DFMT_R5G6B5, 16 }, + { D3DFMT_A4R4G4B4, 16 }, + { D3DFMT_A1R5G5B5, 16 }, + { D3DFMT_A2B10G10R10, 32 }, }; static ExtendedFormat s_extendedFormats[ExtendedFormat::Count] = @@ -730,8 +733,8 @@ namespace bgfx point.y = rc.top; ClientToScreen(g_bgfxHwnd, &point); uint8_t* data = (uint8_t*)rect.pBits; - uint32_t bpp = rect.Pitch/dm.Width; - saveTga( (const char*)_mem->data, m_params.BackBufferWidth, m_params.BackBufferHeight, rect.Pitch, &data[point.y*rect.Pitch+point.x*bpp]); + uint32_t bytesPerPixel = rect.Pitch/dm.Width; + saveTga( (const char*)_mem->data, m_params.BackBufferWidth, m_params.BackBufferHeight, rect.Pitch, &data[point.y*rect.Pitch+point.x*bytesPerPixel]); DX_CHECK(surface->UnlockRect() ); DX_RELEASE(surface, 0); @@ -993,11 +996,16 @@ namespace bgfx void Shader::create(bool _fragment, const Memory* _mem) { - m_constantBuffer = ConstantBuffer::create(1024); + bx::MemoryReader reader(_mem->data, _mem->size); + + uint32_t magic; + bx::read(&reader, magic); + + uint32_t iohash; + bx::read(&reader, iohash); - StreamRead stream(_mem->data, _mem->size); uint16_t count; - stream.read(count); + bx::read(&reader, count); m_numPredefined = 0; @@ -1005,76 +1013,83 @@ namespace bgfx uint8_t fragmentBit = _fragment ? BGFX_UNIFORM_FRAGMENTBIT : 0; - for (uint32_t ii = 0; ii < count; ++ii) + if (0 < count) { - uint8_t nameSize; - stream.read(nameSize); + m_constantBuffer = ConstantBuffer::create(1024); - char name[256]; - stream.read(&name, nameSize); - name[nameSize] = '\0'; - - uint8_t type; - stream.read(type); - - uint8_t num; - stream.read(num); - - uint16_t regIndex; - stream.read(regIndex); - - uint16_t regCount; - stream.read(regCount); - - const char* kind = "invalid"; - - const void* data = NULL; - PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name); - if (PredefinedUniform::Count != predefined) + for (uint32_t ii = 0; ii < count; ++ii) { - kind = "predefined"; - m_predefined[m_numPredefined].m_loc = regIndex; - m_predefined[m_numPredefined].m_count = regCount; - m_predefined[m_numPredefined].m_type = predefined|fragmentBit; - m_numPredefined++; - } - else - { - const UniformInfo* info = s_renderCtx.m_uniformReg.find(name); - BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); - if (NULL != info) + uint8_t nameSize; + bx::read(&reader, nameSize); + + char name[256]; + bx::read(&reader, &name, nameSize); + name[nameSize] = '\0'; + + uint8_t type; + bx::read(&reader, type); + + uint8_t num; + bx::read(&reader, num); + + uint16_t regIndex; + bx::read(&reader, regIndex); + + uint16_t regCount; + bx::read(&reader, regCount); + + const char* kind = "invalid"; + + const void* data = NULL; + PredefinedUniform::Enum predefined = nameToPredefinedUniformEnum(name); + if (PredefinedUniform::Count != predefined) { - kind = "user"; - data = info->m_data; - m_constantBuffer->writeUniformRef( (UniformType::Enum)(type|fragmentBit), regIndex, data, regCount); + kind = "predefined"; + m_predefined[m_numPredefined].m_loc = regIndex; + m_predefined[m_numPredefined].m_count = regCount; + m_predefined[m_numPredefined].m_type = predefined|fragmentBit; + m_numPredefined++; } + else + { + const UniformInfo* info = s_renderCtx.m_uniformReg.find(name); + BX_CHECK(NULL != info, "User defined uniform '%s' is not found, it won't be set.", name); + if (NULL != info) + { + kind = "user"; + data = info->m_data; + m_constantBuffer->writeUniformRef( (UniformType::Enum)(type|fragmentBit), regIndex, data, regCount); + } + } + + BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d" + , kind + , name + , type + , num + , regIndex + , regCount + ); + BX_UNUSED(kind); } - BX_TRACE("\t%s: %s, type %2d, num %2d, r.index %3d, r.count %2d" - , kind - , name - , type - , num - , regIndex - , regCount - ); - BX_UNUSED(kind); + m_constantBuffer->finish(); } uint16_t shaderSize; - stream.read(shaderSize); + bx::read(&reader, shaderSize); - m_constantBuffer->finish(); - - const DWORD* code = (const DWORD*)stream.getDataPtr(); + const DWORD* code = (const DWORD*)reader.getDataPtr(); if (_fragment) { DX_CHECK(s_renderCtx.m_device->CreatePixelShader(code, (IDirect3DPixelShader9**)&m_ptr) ); + BX_CHECK(NULL != m_ptr, "Failed to create fragment shader."); } else { DX_CHECK(s_renderCtx.m_device->CreateVertexShader(code, (IDirect3DVertexShader9**)&m_ptr) ); + BX_CHECK(NULL != m_ptr, "Failed to create vertex shader."); } } @@ -1234,23 +1249,25 @@ namespace bgfx if (parseDds(dds, _mem) ) { - uint8_t bpp = dds.m_bpp; + const TextureFormatInfo& tfi = s_textureFormat[dds.m_type]; bool decompress = false; if (dds.m_cubeMap) { - createCubeTexture(dds.m_width, dds.m_numMips, s_textureFormat[dds.m_type].m_fmt); + createCubeTexture(dds.m_width, dds.m_numMips, tfi.m_fmt); } else if (dds.m_depth > 1) { - createVolumeTexture(dds.m_width, dds.m_height, dds.m_depth, dds.m_numMips, s_textureFormat[dds.m_type].m_fmt); + createVolumeTexture(dds.m_width, dds.m_height, dds.m_depth, dds.m_numMips, tfi.m_fmt); } else { - createTexture(dds.m_width, dds.m_height, dds.m_numMips, s_textureFormat[dds.m_type].m_fmt); + createTexture(dds.m_width, dds.m_height, dds.m_numMips, tfi.m_fmt); } + uint8_t bpp = tfi.m_bpp; + if (decompress || TextureFormat::Unknown < dds.m_type) { @@ -1276,7 +1293,7 @@ namespace bgfx if (width != mip.m_width || height != mip.m_height) { - uint32_t srcpitch = mip.m_width*bpp; + uint32_t srcpitch = mip.m_width*bpp/8; uint8_t* temp = (uint8_t*)g_realloc(NULL, srcpitch*mip.m_height); mip.decode(temp); @@ -1328,32 +1345,32 @@ namespace bgfx } else { - StreamRead stream(_mem->data, _mem->size); + bx::MemoryReader reader(_mem->data, _mem->size); uint32_t magic; - stream.read(magic); + bx::read(&reader, magic); - if (BGFX_MAGIC == magic) + if (BGFX_CHUNK_MAGIC_TEX == magic) { TextureCreate tc; - stream.read(tc); + bx::read(&reader, tc); if (tc.m_cubeMap) { - createCubeTexture(tc.m_width, tc.m_numMips, s_textureFormat[tc.m_type].m_fmt); + createCubeTexture(tc.m_width, tc.m_numMips, s_textureFormat[tc.m_format].m_fmt); } else if (tc.m_depth > 1) { - createVolumeTexture(tc.m_width, tc.m_height, tc.m_depth, tc.m_numMips, s_textureFormat[tc.m_type].m_fmt); + createVolumeTexture(tc.m_width, tc.m_height, tc.m_depth, tc.m_numMips, s_textureFormat[tc.m_format].m_fmt); } else { - createTexture(tc.m_width, tc.m_height, tc.m_numMips, s_textureFormat[tc.m_type].m_fmt); + createTexture(tc.m_width, tc.m_height, tc.m_numMips, s_textureFormat[tc.m_format].m_fmt); } if (NULL != tc.m_mem) { - uint32_t bpp = s_textureFormat[tc.m_type].m_bpp; + uint32_t bpp = s_textureFormat[tc.m_format].m_bpp; uint8_t* data = tc.m_mem->data; for (uint8_t side = 0, numSides = tc.m_cubeMap ? 6 : 1; side < numSides; ++side) @@ -1371,7 +1388,7 @@ namespace bgfx uint32_t pitch; uint32_t slicePitch; uint8_t* dst = lock(side, lod, pitch, slicePitch); - uint32_t len = width*height*bpp; + uint32_t len = width*height*bpp/8; memcpy(dst, data, len); data += len; unlock(side, lod); @@ -1956,7 +1973,6 @@ namespace bgfx PIX_BEGINEVENT(D3DCOLOR_RGBA(0xff, 0x00, 0x00, 0xff), "view"); view = key.m_view; - programIdx = invalidHandle; if (m_render->m_rt[view].idx != rt.idx) @@ -2080,9 +2096,9 @@ namespace bgfx } if ( (BGFX_STATE_CULL_MASK|BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK - |BGFX_STATE_ALPHA_MASK|BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE - |BGFX_STATE_BLEND_MASK|BGFX_STATE_ALPHA_REF_MASK|BGFX_STATE_PT_MASK - |BGFX_STATE_POINT_SIZE_MASK|BGFX_STATE_SRGBWRITE|BGFX_STATE_MSAA) & changedFlags) + |BGFX_STATE_ALPHA_MASK|BGFX_STATE_RGB_WRITE|BGFX_STATE_BLEND_MASK + |BGFX_STATE_ALPHA_REF_MASK|BGFX_STATE_PT_MASK|BGFX_STATE_POINT_SIZE_MASK + |BGFX_STATE_SRGBWRITE|BGFX_STATE_MSAA) & changedFlags) { if (BGFX_STATE_CULL_MASK & changedFlags) { @@ -2192,8 +2208,7 @@ namespace bgfx if (constantsChanged) { - program.m_vsh->m_constantBuffer->commit(); - program.m_fsh->m_constantBuffer->commit(); + program.commit(); } for (uint32_t ii = 0, num = program.m_numPredefined; ii < num; ++ii) diff --git a/src/renderer_d3d9.h b/src/renderer_d3d9.h index 3fc34372..d91a388a 100644 --- a/src/renderer_d3d9.h +++ b/src/renderer_d3d9.h @@ -71,43 +71,43 @@ namespace bgfx #endif // BGFX_CONFIG_DEBUG_PIX # ifndef D3DFMT_ATI1 -# define D3DFMT_ATI1 ( (D3DFORMAT)MAKEFOURCC('A','T','I','1') ) +# define D3DFMT_ATI1 ( (D3DFORMAT)BX_MAKEFOURCC('A','T','I','1') ) # endif // D3DFMT_ATI1 # ifndef D3DFMT_ATI2 -# define D3DFMT_ATI2 ( (D3DFORMAT)MAKEFOURCC('A','T','I','2') ) +# define D3DFMT_ATI2 ( (D3DFORMAT)BX_MAKEFOURCC('A','T','I','2') ) # endif // D3DFMT_ATI2 # ifndef D3DFMT_ATOC -# define D3DFMT_ATOC ( (D3DFORMAT)MAKEFOURCC('A','T','O','C') ) +# define D3DFMT_ATOC ( (D3DFORMAT)BX_MAKEFOURCC('A','T','O','C') ) # endif // D3DFMT_ATOC # ifndef D3DFMT_DF16 -# define D3DFMT_DF16 ( (D3DFORMAT)MAKEFOURCC('D','F','1','6') ) +# define D3DFMT_DF16 ( (D3DFORMAT)BX_MAKEFOURCC('D','F','1','6') ) # endif // D3DFMT_DF16 # ifndef D3DFMT_DF24 -# define D3DFMT_DF24 ( (D3DFORMAT)MAKEFOURCC('D','F','2','4') ) +# define D3DFMT_DF24 ( (D3DFORMAT)BX_MAKEFOURCC('D','F','2','4') ) # endif // D3DFMT_DF24 # ifndef D3DFMT_INST -# define D3DFMT_INST ( (D3DFORMAT)MAKEFOURCC('I','N','S','T') ) +# define D3DFMT_INST ( (D3DFORMAT)BX_MAKEFOURCC('I','N','S','T') ) # endif // D3DFMT_INST # ifndef D3DFMT_INTZ -# define D3DFMT_INTZ ( (D3DFORMAT)MAKEFOURCC('I','N','T','Z') ) +# define D3DFMT_INTZ ( (D3DFORMAT)BX_MAKEFOURCC('I','N','T','Z') ) # endif // D3DFMT_INTZ # ifndef D3DFMT_NULL -# define D3DFMT_NULL ( (D3DFORMAT)MAKEFOURCC('N','U','L','L') ) +# define D3DFMT_NULL ( (D3DFORMAT)BX_MAKEFOURCC('N','U','L','L') ) # endif // D3DFMT_NULL # ifndef D3DFMT_RESZ -# define D3DFMT_RESZ ( (D3DFORMAT)MAKEFOURCC('R','E','S','Z') ) +# define D3DFMT_RESZ ( (D3DFORMAT)BX_MAKEFOURCC('R','E','S','Z') ) # endif // D3DFMT_RESZ # ifndef D3DFMT_RAWZ -# define D3DFMT_RAWZ ( (D3DFORMAT)MAKEFOURCC('R','A','W','Z') ) +# define D3DFMT_RAWZ ( (D3DFORMAT)BX_MAKEFOURCC('R','A','W','Z') ) # endif // D3DFMT_RAWZ struct ExtendedFormat @@ -280,6 +280,19 @@ namespace bgfx m_fsh = NULL; } + void commit() + { + if (NULL != m_vsh->m_constantBuffer) + { + m_vsh->m_constantBuffer->commit(); + } + + if (NULL != m_fsh->m_constantBuffer) + { + m_fsh->m_constantBuffer->commit(); + } + } + const Shader* m_vsh; const Shader* m_fsh; diff --git a/src/renderer_gl.cpp b/src/renderer_gl.cpp index 47397cb4..408e9aa4 100644 --- a/src/renderer_gl.cpp +++ b/src/renderer_gl.cpp @@ -19,6 +19,9 @@ # define glGetProgramBinary glGetProgramBinaryOES # define GL_PROGRAM_BINARY_LENGTH GL_PROGRAM_BINARY_LENGTH_OES # define GL_HALF_FLOAT GL_HALF_FLOAT_OES +# define GL_RGB10_A2 GL_RGB10_A2_EXT +# define GL_UNSIGNED_INT_2_10_10_10_REV GL_UNSIGNED_INT_2_10_10_10_REV_EXT +# define GL_SAMPLER_3D GL_SAMPLER_3D_OES #endif // BGFX_CONFIG_RENDERER_OPENGLES2 namespace bgfx @@ -617,13 +620,19 @@ namespace bgfx EXT_texture_compression_dxt1, CHROMIUM_texture_compression_dxt3, CHROMIUM_texture_compression_dxt5, + ARB_texture_float, + OES_texture_float, + OES_texture_float_linear, + OES_texture_half_float, + OES_texture_half_float_linear, + EXT_texture_type_2_10_10_10_REV, + EXT_texture_sRGB, OES_standard_derivatives, ARB_get_program_binary, OES_get_program_binary, EXT_framebuffer_blit, ARB_timer_query, EXT_timer_query, - EXT_texture_sRGB, ARB_framebuffer_sRGB, EXT_framebuffer_sRGB, ARB_multisample, @@ -631,11 +640,6 @@ namespace bgfx ANGLE_translated_shader_source, ARB_instanced_arrays, ANGLE_instanced_arrays, - ARB_texture_float, - OES_texture_float, - OES_texture_float_linear, - OES_texture_half_float, - OES_texture_half_float_linear, ARB_half_float_vertex, OES_vertex_half_float, ARB_vertex_type_2_10_10_10_rev, @@ -662,13 +666,19 @@ namespace bgfx { "GL_EXT_texture_compression_dxt1", false, true }, { "GL_CHROMIUM_texture_compression_dxt3", false, true }, { "GL_CHROMIUM_texture_compression_dxt5", false, true }, + { "GL_ARB_texture_float", false, true }, + { "GL_OES_texture_float", false, true }, + { "GL_OES_texture_float_linear", false, true }, + { "GL_OES_texture_half_float", false, true }, + { "GL_OES_texture_half_float_linear", false, true }, + { "GL_EXT_texture_type_2_10_10_10_REV", false, true }, + { "GL_EXT_texture_sRGB", false, true }, { "GL_OES_standard_derivatives", false, true }, { "GL_ARB_get_program_binary", false, true }, { "GL_OES_get_program_binary", false, false }, { "GL_EXT_framebuffer_blit", false, true }, { "GL_ARB_timer_query", false, true }, { "GL_EXT_timer_query", false, true }, - { "GL_EXT_texture_sRGB", false, true }, { "GL_ARB_framebuffer_sRGB", false, true }, { "GL_EXT_framebuffer_sRGB", false, true }, { "GL_ARB_multisample", false, true }, @@ -676,11 +686,6 @@ namespace bgfx { "GL_ANGLE_translated_shader_source", false, true }, { "GL_ARB_instanced_arrays", false, true }, { "GL_ANGLE_instanced_arrays", false, true }, - { "GL_ARB_texture_float", false, true }, - { "GL_OES_texture_float", false, true }, - { "GL_OES_texture_float_linear", false, true }, - { "GL_OES_texture_half_float", false, true }, - { "GL_OES_texture_half_float_linear", false, true }, { "GL_ARB_half_float_vertex", false, true }, { "GL_OES_vertex_half_float", false, true }, { "GL_ARB_vertex_type_2_10_10_10_rev", false, true }, @@ -841,19 +846,22 @@ namespace bgfx static const TextureFormatInfo s_textureFormat[TextureFormat::Count] = { - { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_ZERO, GL_ZERO, 4 }, - { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_ZERO, GL_ZERO, 4 }, - { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_ZERO, GL_ZERO, 4 }, - { GL_ZERO, GL_ZERO, GL_ZERO, 0 }, - { GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 1 }, - { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 4 }, - { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 4 }, + { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, GL_ZERO, 4 }, + { GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, GL_ZERO, 4 }, + { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, GL_ZERO, 4 }, + { GL_ZERO, GL_ZERO, GL_ZERO, 0 }, + { GL_LUMINANCE, GL_LUMINANCE, GL_UNSIGNED_BYTE, 8 }, + { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32 }, + { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 32 }, #if BGFX_CONFIG_RENDERER_OPENGL - { GL_RGBA16, GL_RGBA, GL_HALF_FLOAT, 8 }, + { GL_RGBA16, GL_RGBA, GL_HALF_FLOAT, 64 }, #else - { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 8 }, + { GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 64 }, #endif // BGFX_CONFIG_RENDERER_OPENGL - { GL_RGB, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 2 }, + { GL_RGB565, GL_RGB, GL_UNSIGNED_SHORT_5_6_5, 16 }, + { GL_RGBA4, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, 16 }, + { GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, 16 }, + { GL_RGB10_A2, GL_RGBA, GL_UNSIGNED_INT_2_10_10_10_REV, 32 }, }; const char* glslTypeName(GLuint _type) @@ -877,7 +885,7 @@ namespace bgfx // GLSL_TYPE(GL_FLOAT_MAT4x3); // GLSL_TYPE(GL_SAMPLER_1D); GLSL_TYPE(GL_SAMPLER_2D); -// GLSL_TYPE(GL_SAMPLER_3D); + GLSL_TYPE(GL_SAMPLER_3D); GLSL_TYPE(GL_SAMPLER_CUBE); // GLSL_TYPE(GL_SAMPLER_1D_SHADOW); // GLSL_TYPE(GL_SAMPLER_2D_SHADOW); @@ -936,10 +944,10 @@ namespace bgfx // case GL_FLOAT_MAT4x3: // break; - case GL_SAMPLER_2D: - case GL_SAMPLER_CUBE: // case GL_SAMPLER_1D: -// case GL_SAMPLER_3D: + case GL_SAMPLER_2D: + case GL_SAMPLER_3D: + case GL_SAMPLER_CUBE: // case GL_SAMPLER_1D_SHADOW: // case GL_SAMPLER_2D_SHADOW: return UniformType::Uniform1iv; @@ -969,12 +977,12 @@ namespace bgfx void* data = g_realloc(NULL, length); g_cache(id, false, data, length); - StreamRead stream(data, length); + bx::MemoryReader reader(data, length); GLenum format; - stream.read(format); + bx::read(&reader, format); - GL_CHECK(glProgramBinary(m_id, format, stream.getDataPtr(), stream.remaining() ) ); + GL_CHECK(glProgramBinary(m_id, format, reader.getDataPtr(), (GLsizei)reader.remaining() ) ); g_free(data); } @@ -1347,7 +1355,7 @@ namespace bgfx m_type = GL_UNSIGNED_BYTE; } - uint8_t* bits = (uint8_t*)g_realloc(NULL, dds.m_width*dds.m_height*tfi.m_bpp); + uint8_t* bits = (uint8_t*)g_realloc(NULL, dds.m_width*dds.m_height*tfi.m_bpp/8); for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side) { @@ -1406,6 +1414,8 @@ namespace bgfx } else { + m_compressed = true; + for (uint8_t side = 0, numSides = dds.m_cubeMap ? 6 : 1; side < numSides; ++side) { uint32_t width = dds.m_width; @@ -1442,15 +1452,15 @@ namespace bgfx } else { - StreamRead stream(_mem->data, _mem->size); + bx::MemoryReader reader(_mem->data, _mem->size); uint32_t magic; - stream.read(magic); + bx::read(&reader, magic); - if (BGFX_MAGIC == magic) + if (BGFX_CHUNK_MAGIC_TEX == magic) { TextureCreate tc; - stream.read(tc); + bx::read(&reader, tc); if (tc.m_cubeMap) { @@ -1471,10 +1481,11 @@ namespace bgfx BX_CHECK(0 != m_id, "Failed to generate texture id."); GL_CHECK(glBindTexture(m_target, m_id) ); - const TextureFormatInfo& tfi = s_textureFormat[tc.m_type]; + const TextureFormatInfo& tfi = s_textureFormat[tc.m_format]; GLenum internalFmt = tfi.m_internalFmt; m_fmt = tfi.m_fmt; m_type = tfi.m_type; + m_compressed = tc.m_format < TextureFormat::Unknown; GLenum target = m_target; if (tc.m_cubeMap) @@ -1482,8 +1493,9 @@ namespace bgfx target = GL_TEXTURE_CUBE_MAP_POSITIVE_X; } - uint32_t bpp = s_textureFormat[tc.m_type].m_bpp; + uint32_t bpp = tfi.m_bpp; uint8_t* data = NULL != tc.m_mem ? tc.m_mem->data : NULL; + uint32_t min = m_compressed ? 4 : 1; for (uint8_t side = 0, numSides = tc.m_cubeMap ? 6 : 1; side < numSides; ++side) { @@ -1493,25 +1505,42 @@ namespace bgfx for (uint32_t lod = 0, num = tc.m_numMips; lod < num; ++lod) { - width = uint32_max(width, 1); - height = uint32_max(height, 1); + width = uint32_max(width, min); + height = uint32_max(height, min); depth = uint32_max(1, depth); + uint32_t size = width*height*bpp/8; - texImage(target+side - , lod - , internalFmt - , width - , height - , depth - , 0 - , m_fmt - , m_type - , data - ); + if (m_compressed) + { + compressedTexImage(target+side + , lod + , internalFmt + , width + , height + , depth + , 0 + , size + , data + ); + } + else + { + texImage(target+side + , lod + , internalFmt + , width + , height + , depth + , 0 + , m_fmt + , m_type + , data + ); + } if (NULL != data) { - data += width*height*bpp; + data += size; } width >>= 1; @@ -1623,6 +1652,20 @@ namespace bgfx switch (m_target) { case GL_TEXTURE_2D: + if (m_compressed) + { + GL_CHECK(glCompressedTexSubImage2D(m_target + , _mip + , _rect.m_x + , _rect.m_y + , _rect.m_width + , _rect.m_height + , m_fmt + , _mem->size + , _mem->data + ) ); + } + else { GL_CHECK(glTexSubImage2D(m_target , _mip @@ -1638,6 +1681,20 @@ namespace bgfx break; case GL_TEXTURE_CUBE_MAP: + if (m_compressed) + { + GL_CHECK(glCompressedTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+_side + , _mip + , _rect.m_x + , _rect.m_y + , _rect.m_width + , _rect.m_height + , m_fmt + , _mem->size + , _mem->data + ) ); + } + else { GL_CHECK(glTexSubImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X+_side , _mip @@ -1654,6 +1711,22 @@ namespace bgfx #if BGFX_CONFIG_RENDERER_OPENGL case GL_TEXTURE_3D: + if (m_compressed) + { + GL_CHECK(glCompressedTexSubImage3D(m_target + , _mip + , _rect.m_x + , _rect.m_y + , _z + , _rect.m_width + , _rect.m_height + , _depth + , m_fmt + , _mem->size + , _mem->data + ) ); + } + else { GL_CHECK(glTexSubImage3D(m_target , _mip @@ -2091,7 +2164,7 @@ namespace bgfx void Context::rendererCreateVertexShader(VertexShaderHandle _handle, Memory* _mem) { - s_renderCtx.m_vertexShaders[_handle.idx].create(GL_VERTEX_SHADER, _mem->data); + s_renderCtx.m_vertexShaders[_handle.idx].create(GL_VERTEX_SHADER, _mem); } void Context::rendererDestroyVertexShader(VertexShaderHandle _handle) @@ -2101,7 +2174,7 @@ namespace bgfx void Context::rendererCreateFragmentShader(FragmentShaderHandle _handle, Memory* _mem) { - s_renderCtx.m_fragmentShaders[_handle.idx].create(GL_FRAGMENT_SHADER, _mem->data); + s_renderCtx.m_fragmentShaders[_handle.idx].create(GL_FRAGMENT_SHADER, _mem); } void Context::rendererDestroyFragmentShader(FragmentShaderHandle _handle) @@ -2329,7 +2402,7 @@ namespace bgfx // if (BGFX_STENCIL_FUNC_RMASK_MASK & bchanged) // { // uint32_t wmask = (bstencil&BGFX_STENCIL_FUNC_RMASK_MASK)>>BGFX_STENCIL_FUNC_RMASK_SHIFT; -// BX_CHECK(glStencilMask(wmask) ); +// GL_CHECK(glStencilMask(wmask) ); // } for (uint32_t ii = 0, num = frontAndBack+1; ii < num; ++ii) @@ -2362,9 +2435,8 @@ namespace bgfx } if ( (BGFX_STATE_CULL_MASK|BGFX_STATE_DEPTH_WRITE|BGFX_STATE_DEPTH_TEST_MASK - |BGFX_STATE_ALPHA_MASK|BGFX_STATE_ALPHA_WRITE|BGFX_STATE_RGB_WRITE - |BGFX_STATE_BLEND_MASK|BGFX_STATE_ALPHA_REF_MASK|BGFX_STATE_PT_MASK - |BGFX_STATE_POINT_SIZE_MASK) & changedFlags) + |BGFX_STATE_ALPHA_MASK|BGFX_STATE_RGB_WRITE|BGFX_STATE_BLEND_MASK + |BGFX_STATE_ALPHA_REF_MASK|BGFX_STATE_PT_MASK|BGFX_STATE_POINT_SIZE_MASK) & changedFlags) { if (BGFX_STATE_CULL_MASK & changedFlags) { @@ -2478,7 +2550,7 @@ namespace bgfx if (constantsChanged) { - program.m_constantBuffer->commit(); + program.commit(); } for (uint32_t ii = 0, num = program.m_numPredefined; ii < num; ++ii) diff --git a/src/renderer_gl.h b/src/renderer_gl.h index ecbf0f45..a7695331 100644 --- a/src/renderer_gl.h +++ b/src/renderer_gl.h @@ -325,6 +325,9 @@ namespace bgfx Texture() : m_id(0) , m_target(GL_TEXTURE_2D) + , m_fmt(GL_ZERO) + , m_type(GL_ZERO) + , m_compressed(false) { } @@ -338,19 +341,30 @@ namespace bgfx GLenum m_target; GLenum m_fmt; GLenum m_type; + bool m_compressed; }; struct Shader { - void create(GLenum _type, const uint8_t* _code) + void create(GLenum _type, Memory* _mem) { m_id = glCreateShader(_type); m_type = _type; + bx::MemoryReader reader(_mem->data, _mem->size); + m_hash = hashMurmur2A(_mem->data, _mem->size); + + uint32_t magic; + bx::read(&reader, magic); + + uint32_t hash; + bx::read(&reader, hash); + + const uint8_t* code = reader.getDataPtr(); + if (0 != m_id) { - m_hash = hash(_code, (uint32_t)strlen( (const char*)_code) ); - GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&_code, NULL) ); + GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&code, NULL) ); GL_CHECK(glCompileShader(m_id) ); GLint compiled = 0; @@ -361,9 +375,10 @@ namespace bgfx char log[1024]; GL_CHECK(glGetShaderInfoLog(m_id, sizeof(log), NULL, log) ); BX_TRACE("Failed to compile shader. %d: %s", compiled, log); - BX_TRACE("\n####\n%s\n####", _code); + BX_TRACE("\n####\n%s\n####", code); GL_CHECK(glDeleteShader(m_id) ); + BGFX_FATAL(false, bgfx::Fatal::InvalidShader, "Failed to compile shader."); } } } @@ -398,6 +413,11 @@ namespace bgfx void init(); void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const; void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const; + + void commit() + { + m_constantBuffer->commit(); + } GLuint m_id; diff --git a/src/renderer_null.cpp b/src/renderer_null.cpp index 883755e8..d6682940 100644 --- a/src/renderer_null.cpp +++ b/src/renderer_null.cpp @@ -107,15 +107,15 @@ namespace bgfx void Context::rendererCreateTexture(TextureHandle /*_handle*/, Memory* _mem, uint32_t /*_flags*/) { - StreamRead stream(_mem->data, _mem->size); + bx::MemoryReader reader(_mem->data, _mem->size); uint32_t magic; - stream.read(magic); + bx::read(&reader, magic); - if (BGFX_MAGIC == magic) + if (BGFX_CHUNK_MAGIC_TEX == magic) { TextureCreate tc; - stream.read(tc); + bx::read(&reader, tc); if (NULL != tc.m_mem) { diff --git a/src/vs_clear_dx11.bin.h b/src/vs_clear_dx11.bin.h index 20112fb2..53cb6aaf 100644 --- a/src/vs_clear_dx11.bin.h +++ b/src/vs_clear_dx11.bin.h @@ -1,44 +1,45 @@ -static const uint8_t vs_clear_dx11[650] = +static const uint8_t vs_clear_dx11[658] = { - 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ - 0x00, 0x00, 0x00, 0x74, 0x02, 0x44, 0x58, 0x42, 0x43, 0x9f, 0x90, 0x55, 0x9a, 0x15, 0xd7, 0x4d, // ...t.DXBC..U...M - 0x46, 0x12, 0x19, 0x32, 0x30, 0xa7, 0xfd, 0x7a, 0x83, 0x01, 0x00, 0x00, 0x00, 0x74, 0x02, 0x00, // F..20..z.....t.. - 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0xac, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, // .....4.......... - 0x00, 0x50, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x70, 0x00, 0x00, // .P.......RDEFp.. - 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, 0x31, // .........<...RD1 - 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, // 1<....... ...(.. - 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x69, 0x63, // .$...........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, 0xab, 0xab, // 9.29.952.3111... - 0xab, 0x49, 0x53, 0x47, 0x4e, 0x48, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // .ISGNH.......... - 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .8.............. - 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........A...... - 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, 0x00, // .POSITION.COLOR. - 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x4c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, // .OSGNL.......... - 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .8.............. - 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........D...... - 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, 0x4c, // .SV_POSITION.COL - 0x4f, 0x52, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, 0x58, 0x80, 0x00, 0x00, 0x00, 0x50, 0x00, 0x01, // OR...SHEX....P.. - 0x00, 0x20, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x5f, 0x00, 0x00, 0x03, 0x72, 0x10, 0x10, // . ...j..._...r.. - 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, 0x00, // .g.... ......... - 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, // .e.... ......6.. - 0x05, 0x72, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x12, 0x10, 0x00, 0x00, 0x00, 0x00, // .r ......F...... - 0x00, 0x36, 0x00, 0x00, 0x05, 0x82, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, // .6.... .......@. - 0x00, 0x00, 0x00, 0x80, 0x3f, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, // ....?6.... ..... - 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, // .F.......>...STA - 0x54, 0x94, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // T............... - 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, // ................ + 0x56, 0x53, 0x48, 0x00, 0xa4, 0x8b, 0xef, 0x49, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, // VSH....I........ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x02, 0x44, 0x58, 0x42, // ...........t.DXB + 0x43, 0xda, 0x52, 0xa4, 0x82, 0x31, 0xef, 0x9d, 0x65, 0xc3, 0x64, 0xcc, 0x10, 0x3d, 0x4f, 0x86, // C.R..1..e.d..=O. + 0x53, 0x01, 0x00, 0x00, 0x00, 0x74, 0x02, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, // S....t.......4.. + 0x00, 0xac, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, 0x00, 0x50, 0x01, 0x00, 0x00, 0xd8, 0x01, 0x00, // .........P...... + 0x00, 0x52, 0x44, 0x45, 0x46, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .RDEFp.......... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0xff, 0x00, 0x91, 0x00, // .....<.......... + 0x00, 0x3c, 0x00, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, // .<...RD11<...... + 0x00, 0x20, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, // . ...(...$...... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // .....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, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x48, 0x00, 0x00, // .3111....ISGNH.. + 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........8...... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, // ................ + 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .>.............. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x50, // .........COLOR.P + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x4c, 0x00, 0x00, // OSITION..OSGNL.. + 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .........8...... + 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, // ................ + 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, // .D.............. + 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, 0x53, 0x49, // .........SV_POSI + 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0xab, 0xab, 0x53, 0x48, 0x45, // TION.COLOR...SHE + 0x58, 0x80, 0x00, 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, // X....P... ...j.. + 0x01, 0x5f, 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, // ._..........._.. + 0x03, 0x72, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, // .r.......g.... . + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, // .........e.... . + 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x72, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, // .....6...r ..... + 0x00, 0x46, 0x12, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x82, 0x20, 0x10, // .F.......6.... . + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f, 0x36, 0x00, 0x00, // ......@.....?6.. + 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x00, 0x00, 0x00, // .. ......F...... + 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, // .>...STAT....... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 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, 0x03, 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, // .. }; diff --git a/src/vs_debugfont_dx11.bin.h b/src/vs_debugfont_dx11.bin.h index 5dfbefe3..d75ce223 100644 --- a/src/vs_debugfont_dx11.bin.h +++ b/src/vs_debugfont_dx11.bin.h @@ -1,96 +1,96 @@ -static const uint8_t vs_debugfont_dx11[1476] = +static const uint8_t vs_debugfont_dx11[1484] = { - 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // ................ - 0x00, 0xc0, 0x01, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, // ....u_modelViewP - 0x72, 0x6f, 0x6a, 0x09, 0x00, 0x00, 0x01, 0x04, 0x00, 0x98, 0x05, 0x44, 0x58, 0x42, 0x43, 0x46, // roj........DXBCF - 0xbf, 0xfc, 0xa7, 0xce, 0x2a, 0xea, 0x90, 0xbc, 0x31, 0x32, 0x0a, 0x66, 0x1f, 0xa2, 0x34, 0x01, // ....*...12.f..4. - 0x00, 0x00, 0x00, 0x98, 0x05, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x88, // ...........4.... - 0x02, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x9c, 0x03, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0x52, // ...............R - 0x44, 0x45, 0x46, 0x4c, 0x02, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x01, // DEFL.......h.... - 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x05, 0xfe, 0xff, 0x00, 0x91, 0x00, 0x00, 0x18, // ...<............ - 0x02, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x20, // ...RD11<....... - 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, 0x5c, // ...$Globals..... - 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, // ................ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, // ...............@ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xcc, // ................ - 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, // ...@...@........ + 0x56, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, // VSH..."f........ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xc0, 0x01, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, // ............u_mo + 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x09, 0x00, 0x00, 0x01, 0x04, // delViewProj..... + 0x00, 0x98, 0x05, 0x44, 0x58, 0x42, 0x43, 0x4e, 0x14, 0xcf, 0x18, 0xca, 0x5f, 0xd6, 0x83, 0xb0, // ...DXBCN...._... + 0x52, 0x90, 0x95, 0x2f, 0xd3, 0xd3, 0x43, 0x01, 0x00, 0x00, 0x00, 0x98, 0x05, 0x00, 0x00, 0x05, // R../..C......... + 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x88, 0x02, 0x00, 0x00, 0x10, 0x03, 0x00, 0x00, 0x9c, // ...4............ + 0x03, 0x00, 0x00, 0xfc, 0x04, 0x00, 0x00, 0x52, 0x44, 0x45, 0x46, 0x4c, 0x02, 0x00, 0x00, 0x01, // .......RDEFL.... + 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, // ...h.......<.... + 0x05, 0xfe, 0xff, 0x00, 0x91, 0x00, 0x00, 0x18, 0x02, 0x00, 0x00, 0x52, 0x44, 0x31, 0x31, 0x3c, // ...........RD11< + 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 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, // ...........$Glob + 0x61, 0x6c, 0x73, 0x00, 0xab, 0xab, 0xab, 0x5c, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x80, // als............. + 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, // ................ + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, // .......@........ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xd7, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, // ...............@ + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x40, // ...........@...@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xdf, // ................ - 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, // .......@........ + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xd7, // ................ + 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, // .......@........ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xeb, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, // ...............@ - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfb, // ................ - 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, // ...@...@........ - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x40, // ...............@ + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xdf, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x40, // ...............@ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ - 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x75, // ...............u - 0x5f, 0x76, 0x69, 0x65, 0x77, 0x00, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x00, 0x03, // _view.float4x4.. - 0x00, 0x03, 0x00, 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, 0x9f, // ................ - 0x01, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x75, 0x5f, // ...u_viewProj.u_ - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // model.u_modelVie - 0x77, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // w.u_modelViewPro - 0x6a, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // j.u_modelViewPro - 0x6a, 0x58, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x58, 0x00, 0x4d, // jX.u_viewProjX.M - 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, // icrosoft (R) HLS - 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, // L Shader Compile - 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, // r 9.29.952.3111. - 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x80, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, // ...ISGN......... - 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ...h............ - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x00, // ...........q.... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, // ................ - 0x0f, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ...q............ - 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, // ...........w.... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, // ................ - 0x03, 0x00, 0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, // ...POSITION.COLO - 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0x4f, 0x53, 0x47, 0x4e, 0x84, // R.TEXCOORD.OSGN. + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xeb, // ................ + 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xa8, // .......@........ + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x01, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x40, // ...........@...@ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x0c, // ................ + 0x02, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, // .......@........ + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, // ................ + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, 0x77, 0x00, 0x66, 0x6c, // .......u_view.fl + 0x6f, 0x61, 0x74, 0x34, 0x78, 0x34, 0x00, 0x03, 0x00, 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, // oat4x4.......... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ................ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9f, 0x01, 0x00, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, // ...........u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x00, 0x75, 0x5f, // wProj.u_model.u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // modelView.u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // lViewProj.u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x58, 0x00, 0x75, 0x5f, 0x76, 0x69, 0x65, // lViewProjX.u_vie + 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x58, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, // wProjX.Microsoft + 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, // (R) HLSL Shader + 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x39, 0x2e, 0x32, 0x39, 0x2e, 0x39, // Compiler 9.29.9 + 0x35, 0x32, 0x2e, 0x33, 0x31, 0x31, 0x31, 0x00, 0xab, 0xab, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x80, // 52.3111....ISGN. 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, // ...........h.... - 0x00, 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, // ...t............ - 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x01, // ...........t.... - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, // ................ - 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ...z............ - 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x53, 0x56, 0x5f, 0x50, 0x4f, // ...........SV_PO - 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, // SITION.COLOR.TEX - 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x53, 0x48, 0x45, 0x58, 0x58, 0x01, 0x00, 0x00, 0x50, // COORD..SHEXX...P - 0x00, 0x01, 0x00, 0x56, 0x00, 0x00, 0x00, 0x6a, 0x08, 0x00, 0x01, 0x59, 0x00, 0x00, 0x04, 0x46, // ...V...j...Y...F - 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x72, // . ........._...r - 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 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, 0x67, 0x00, 0x00, 0x04, 0xf2, // ...2.......g.... - 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, // ..........e.... - 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x02, // ......e.... ... - 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0x32, 0x20, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x68, // ...e...2 ......h - 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x38, 0x00, 0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x00, // .......8........ - 0x00, 0x00, 0x00, 0x56, 0x15, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, // ...V.......F. .. - 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, // .......2........ - 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x06, // ...F. .......... - 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, // .......F.......2 + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, // ................ + 0x0f, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ...h............ + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, 0x00, // ...........n.... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, // ................ + 0x07, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, // ...w............ + 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x03, 0x00, 0x00, 0x43, 0x4f, 0x4c, 0x4f, 0x52, // ...........COLOR + 0x00, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, // .POSITION.TEXCOO + 0x52, 0x44, 0x00, 0x4f, 0x53, 0x47, 0x4e, 0x84, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08, // RD.OSGN......... + 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, // ...h............ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, // ...........t.... + 0x00, 0x00, 0x00, 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, // ...t............ + 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x7a, 0x00, 0x00, 0x00, 0x00, // ...........z.... + 0x00, 0x00, 0x00, 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, // ...SV_POSITION.C + 0x4f, 0x4c, 0x4f, 0x52, 0x00, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x00, 0xab, 0x53, // OLOR.TEXCOORD..S + 0x48, 0x45, 0x58, 0x58, 0x01, 0x00, 0x00, 0x50, 0x00, 0x01, 0x00, 0x56, 0x00, 0x00, 0x00, 0x6a, // HEXX...P...V...j + 0x08, 0x00, 0x01, 0x59, 0x00, 0x00, 0x04, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, // ...Y...F. ...... + 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5f, // ..._..........._ + 0x00, 0x00, 0x03, 0xf2, 0x10, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x72, // ..........._...r + 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5f, 0x00, 0x00, 0x03, 0x32, 0x10, 0x10, 0x00, 0x03, // ......._...2.... + 0x00, 0x00, 0x00, 0x67, 0x00, 0x00, 0x04, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, // ...g.... ....... + 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x65, // ...e.... ......e + 0x00, 0x00, 0x03, 0xf2, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x03, 0x32, // .... ......e...2 + 0x20, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x68, 0x00, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x38, // ......h.......8 + 0x00, 0x00, 0x08, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x15, 0x10, 0x00, 0x02, // ...........V.... + 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x32, // ...F. .........2 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, // ...........F. .. - 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa6, 0x1a, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, // ...............F - 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xf2, 0x20, 0x10, 0x00, 0x00, // ............ ... - 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, // ...F.......F. .. - 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, // .......6.... ... - 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, // ...F.......6.... - 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, // ......F.......6 - 0x00, 0x00, 0x05, 0x32, 0x20, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x03, // ...2 ......F.... - 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x08, // ...>...STAT..... - 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, 0x10, 0x00, 0x00, 0x00, 0x06, 0x10, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, // ...............F + 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x0a, 0xf2, 0x00, 0x10, 0x00, 0x00, // .......2........ + 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0xa6, // ...F. .......... + 0x1a, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // .......F........ + 0x00, 0x00, 0x08, 0xf2, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x0e, 0x10, 0x00, 0x00, // .... ......F.... + 0x00, 0x00, 0x00, 0x46, 0x8e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x36, // ...F. .........6 + 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x46, 0x1e, 0x10, 0x00, 0x00, // .... ......F.... + 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0xf2, 0x20, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, // ...6.... ......F + 0x1e, 0x10, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x05, 0x32, 0x20, 0x10, 0x00, 0x03, // .......6...2 ... + 0x00, 0x00, 0x00, 0x46, 0x10, 0x10, 0x00, 0x03, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x01, 0x53, // ...F.......>...S + 0x54, 0x41, 0x54, 0x94, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, // TAT............. + 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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 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, 0x00, 0x00, 0x00, 0x00, // ................ - 0x00, 0x00, 0x00, 0x00, // .... + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ............ }; diff --git a/src/vs_debugfont_dx9.bin.h b/src/vs_debugfont_dx9.bin.h index 4b333f4d..3626ce80 100644 --- a/src/vs_debugfont_dx9.bin.h +++ b/src/vs_debugfont_dx9.bin.h @@ -1,24 +1,25 @@ -static const uint8_t vs_debugfont_dx9[335] = +static const uint8_t vs_debugfont_dx9[343] = { - 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, // ............... + 0x56, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x01, 0x00, 0x0f, 0x75, 0x5f, 0x6d, 0x6f, 0x64, // VSH..."f...u_mod + 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x09, 0x01, 0x00, 0x00, 0x04, 0x00, // elViewProj...... + 0x34, 0x01, 0x00, 0x02, 0xfe, 0xff, 0xfe, 0xff, 0x23, 0x00, 0x43, 0x54, 0x41, 0x42, 0x1c, 0x00, // 4.......#.CTAB.. + 0x00, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x02, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0x1c, 0x00, // ..W............. + 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x02, 0x00, // ......P...0..... + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x5f, // ......@.......u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x00, 0x03, 0x00, // modelViewProj... + 0x03, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x73, // ..............vs + 0x5f, 0x32, 0x5f, 0x30, 0x00, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, // _2_0.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, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x00, 0x80, 0x00, 0x00, // .3111........... + 0x0f, 0x90, 0x1f, 0x00, 0x00, 0x02, 0x0a, 0x00, 0x01, 0x80, 0x01, 0x00, 0x0f, 0x90, 0x1f, 0x00, // ................ + 0x00, 0x02, 0x00, 0x00, 0x00, 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, 0x02, 0x00, // ................ + 0x55, 0x90, 0x01, 0x00, 0xe4, 0xa0, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0f, 0x80, 0x00, 0x00, // U............... + 0xe4, 0xa0, 0x02, 0x00, 0x00, 0x90, 0x00, 0x00, 0xe4, 0x80, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, // ................ + 0x0f, 0x80, 0x02, 0x00, 0xe4, 0xa0, 0x02, 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, 0x00, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x01, 0x00, // ................ + 0x0f, 0xd0, 0x01, 0x00, 0xe4, 0x90, 0x01, 0x00, 0x00, 0x02, 0x00, 0x00, 0x03, 0xe0, 0x03, 0x00, // ................ + 0xe4, 0x90, 0xff, 0xff, 0x00, 0x00, 0x00, // ....... }; diff --git a/src/vs_debugfont_glsl.bin.h b/src/vs_debugfont_glsl.bin.h index 6bbeb7d2..6ca4a20f 100644 --- a/src/vs_debugfont_glsl.bin.h +++ b/src/vs_debugfont_glsl.bin.h @@ -1,33 +1,33 @@ -static const uint8_t vs_debugfont_glsl[466] = +static const uint8_t vs_debugfont_glsl[474] = { - 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x70, 0x72, 0x65, // #ifdef GL_ES.pre - 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, // cision highp flo - 0x61, 0x74, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x4c, // at;.#endif // GL - 0x5f, 0x45, 0x53, 0x0a, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, // _ES..uniform mat - 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, // 4 u_modelViewPro - 0x6a, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, // j;.varying vec2 - 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, // v_texcoord0;.var - 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // ying vec4 v_colo - 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, // r1;.varying vec4 - 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, // v_color0;.attri - 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, // bute vec2 a_texc - 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, // oord0;.attribute - 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, // vec4 a_color1;. - 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, // attribute vec4 a - 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, // _color0;.attribu - 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, // te vec3 a_positi - 0x6f, 0x6e, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, // on;.void main () - 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // .{. vec4 tmpvar - 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, // _1;. tmpvar_1.w - 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, // = 1.0;. tmpvar - 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, // _1.xyz = a_posit - 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, // ion;. gl_Positi - 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, // on = (u_modelVie - 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, // wProj * tmpvar_1 - 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, // );. v_texcoord0 - 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, // = a_texcoord0;. - 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, // v_color0 = a_c - 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // olor0;. v_color - 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, // 1 = a_color1;.}. - 0x0a, 0x00, // .. + 0x56, 0x53, 0x48, 0x00, 0xb8, 0xbe, 0x22, 0x66, 0x23, 0x69, 0x66, 0x64, 0x65, 0x66, 0x20, 0x47, // VSH..."f#ifdef G + 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x70, 0x72, 0x65, 0x63, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x68, // L_ES.precision h + 0x69, 0x67, 0x68, 0x70, 0x20, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x3b, 0x0a, 0x23, 0x65, 0x6e, 0x64, // ighp float;.#end + 0x69, 0x66, 0x20, 0x2f, 0x2f, 0x20, 0x47, 0x4c, 0x5f, 0x45, 0x53, 0x0a, 0x0a, 0x75, 0x6e, 0x69, // if // GL_ES..uni + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x6d, 0x6f, 0x64, 0x65, // form mat4 u_mode + 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, // lViewProj;.varyi + 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x32, 0x20, 0x76, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, // ng vec2 v_texcoo + 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, // rd0;.varying vec + 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x76, 0x61, 0x72, 0x79, // 4 v_color1;.vary + 0x69, 0x6e, 0x67, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ing vec4 v_color + 0x30, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, // 0;.attribute vec + 0x32, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x61, // 2 a_texcoord0;.a + 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x61, 0x5f, // ttribute vec3 a_ + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, // position;.attrib + 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, // ute vec4 a_color + 0x31, 0x3b, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x20, 0x76, 0x65, 0x63, // 1;.attribute vec + 0x34, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x76, 0x6f, 0x69, 0x64, // 4 a_color0;.void + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x20, 0x28, 0x29, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x76, 0x65, 0x63, // main ().{. vec + 0x34, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x3b, 0x0a, 0x20, 0x20, 0x74, 0x6d, // 4 tmpvar_1;. tm + 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x77, 0x20, 0x3d, 0x20, 0x31, 0x2e, 0x30, 0x3b, 0x0a, // pvar_1.w = 1.0;. + 0x20, 0x20, 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x2e, 0x78, 0x79, 0x7a, 0x20, 0x3d, // tmpvar_1.xyz = + 0x20, 0x61, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0a, 0x20, 0x20, 0x67, // a_position;. g + 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x28, 0x75, 0x5f, // l_Position = (u_ + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x56, 0x69, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6a, 0x20, 0x2a, 0x20, // modelViewProj * + 0x74, 0x6d, 0x70, 0x76, 0x61, 0x72, 0x5f, 0x31, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x74, // tmpvar_1);. v_t + 0x65, 0x78, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x74, 0x65, 0x78, // excoord0 = a_tex + 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, // coord0;. v_colo + 0x72, 0x30, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x30, 0x3b, 0x0a, 0x20, // r0 = a_color0;. + 0x20, 0x76, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x20, 0x3d, 0x20, 0x61, 0x5f, 0x63, 0x6f, // v_color1 = a_co + 0x6c, 0x6f, 0x72, 0x31, 0x3b, 0x0a, 0x7d, 0x0a, 0x0a, 0x00, // lor1;.}... }; diff --git a/tools/bin/shaderc.exe b/tools/bin/shaderc.exe index a20695dfeb74dcd3d144f66f9e9330332f58fa02..40acd5f11dff9befd976ecbb68bc664f48161347 100644 GIT binary patch delta 141202 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%0AfXiWCsoQtv5VXwPz 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%0A3t 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 delta 136365 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≪(gCeev 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ⅇ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%0Do&Ap?+zS?IQBJvp&8?}V&if?QGPT3ACj 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 diff --git a/tools/shaderc.cpp b/tools/shaderc/shaderc.cpp similarity index 78% rename from tools/shaderc.cpp rename to tools/shaderc/shaderc.cpp index 704cd607..2b3f66d7 100644 --- a/tools/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -13,6 +13,7 @@ #include <stdint.h> #include <stdlib.h> #include <string.h> +#include <algorithm> #include <string> #include <vector> #include <unordered_map> @@ -29,20 +30,18 @@ extern "C" # define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__) #endif // DEBUG -#define BX_NAMESPACE 1 +#define BGFX_CHUNK_MAGIC_VSH BX_MAKEFOURCC('V', 'S', 'H', 0x0) +#define BGFX_CHUNK_MAGIC_FSH BX_MAKEFOURCC('F', 'S', 'H', 0x0) + #include <bx/bx.h> -#if BX_PLATFORM_LINUX -# include <stdarg.h> - -# define _stricmp strcasecmp -# define _snprintf snprintf -#endif // BX_PLATFORM_LINUX - #include <bx/commandline.h> #include <bx/countof.h> #include <bx/endian.h> #include <bx/uint32_t.h> +#include <bx/readerwriter.h> +#include <bx/string.h> +#include <bx/hash.h> #include "glsl_optimizer.h" @@ -267,208 +266,128 @@ static uint32_t s_optimizationLevelDx11[4] = }; #endif // BX_PLATFORM_WINDOWS -class IStreamWriter +int32_t writef(bx::WriterI* _writer, const char* _format, ...) { -public: - 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; + va_list argList; + va_start(argList, _format); - template<typename Ty> - void write(Ty _value) + char temp[2048]; + + char* out = temp; + int32_t max = sizeof(temp); + int32_t len = bx::vsnprintf(out, max, _format, argList); + if (len > max) { - write(&_value, sizeof(Ty) ); + out = (char*)alloca(len); + len = bx::vsnprintf(out, len, _format, argList); } - void writeString(const char* _str) - { - uint16_t len = (uint16_t)strlen(_str); - write(len); - write(_str); - char term = '\0'; - write(term); - } -}; + len = _writer->write(out, len); -IStreamWriter::~IStreamWriter() -{ + va_end(argList); + + return len; } -class FileWriter : public IStreamWriter +class Bin2cWriter : public bx::CrtFileWriter { public: - FileWriter(const char* _filePath, bool _bigEndian = false) - : m_filePath(_filePath) - , m_file(NULL) - , m_bigEndian(_bigEndian) + Bin2cWriter(const char* _name) + : m_name(_name) { } - ~FileWriter() + virtual ~Bin2cWriter() { } - bool open() + virtual int32_t close() BX_OVERRIDE { - BX_CHECK(NULL == m_file, "Still open!"); - - m_file = fopen(m_filePath.c_str(), "wb"); - return NULL != m_file; + generate(); + return bx::CrtFileWriter::close(); } - void close() + virtual int32_t write(const void* _data, int32_t _size) BX_OVERRIDE { - if (NULL != m_file) - { - fclose(m_file); - m_file = NULL; - } - } - - void writef(const char* _format, ...) - { - if (NULL != m_file) - { - va_list argList; - va_start(argList, _format); - - char temp[2048]; - int len = vsnprintf(temp, sizeof(temp), _format, argList); - fwrite(temp, len, 1, m_file); - - va_end(argList); - } - } - - void write(const char* _str) - { - if (NULL != m_file) - { - fwrite(_str, strlen(_str), 1, m_file); - } - } - - void write(const void* _data, size_t _size) - { - if (NULL != m_file) - { - fwrite(_data, _size, 1, m_file); - } + const char* data = (const char*)_data; + m_buffer.insert(m_buffer.end(), data, data+_size); + return _size; } 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) + void generate() { - } - - ~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(); + const uint8_t* data = &m_buffer[0]; + uint32_t size = (uint32_t)m_buffer.size(); - fprintf(m_file, "static const uint8_t %s[%d] =\n{\n", m_name.c_str(), size); + outf("static const uint8_t %s[%d] =\n{\n", m_name.c_str(), size); - if (NULL != data) + 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) { - 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; + _snprintf(&hex[hexPos], sizeof(hex)-hexPos, "0x%02x, ", data[asciiPos]); + hexPos += 6; - ascii[asciiPos] = isprint(data[asciiPos]) && data[asciiPos] != '\\' ? data[asciiPos] : '.'; - asciiPos++; + 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) + if (HEX_DUMP_WIDTH == asciiPos) { ascii[asciiPos] = '\0'; - fprintf(m_file, "\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); + outf("\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); + data += asciiPos; + hexPos = 0; + asciiPos = 0; } } - fprintf(m_file, "};\n"); + if (0 != asciiPos) + { + ascii[asciiPos] = '\0'; + outf("\t" HEX_DUMP_FORMAT "// %s\n", hex, ascii); + } + } + + outf("};\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, ...) + int32_t outf(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); + char* out = temp; + int32_t max = sizeof(temp); + int32_t len = bx::vsnprintf(out, max, _format, argList); + if (len > max) + { + out = (char*)alloca(len); + len = bx::vsnprintf(out, len, _format, argList); + } + + int32_t size = bx::CrtFileWriter::write(out, len); va_end(argList); + + return size; } - 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; }; struct Varying @@ -492,7 +411,7 @@ public: { m_size = fsize(file); m_data = new char[m_size+1]; - m_size = fread(m_data, 1, m_size, file); + m_size = (uint32_t)fread(m_data, 1, m_size, file); m_data[m_size] = '\0'; fclose(file); } @@ -508,90 +427,16 @@ public: return m_data; } - long int getSize() const + uint32_t getSize() const { return m_size; } private: char* m_data; - long int m_size; + uint32_t m_size; }; -const char* strnl(const char* _str) -{ - const char* eol = strstr(_str, "\n\r"); - if (NULL != eol) - { - return eol + 2; - } - - eol = strstr(_str, "\n"); - if (NULL != eol) - { - return eol + 1; - } - - return eol + strlen(_str); -} - -const char* streol(const char* _str) -{ - const char* eol = strstr(_str, "\n\r"); - if (NULL != eol) - { - return eol; - } - - eol = strstr(_str, "\n"); - if (NULL != eol) - { - return eol; - } - - return eol + strlen(_str); -} - -const char* strws(const char* _str) -{ - for (; isspace(*_str); ++_str); - return _str; -} - -const char* strnws(const char* _str) -{ - for (; !isspace(*_str); ++_str); - return _str; -} - -const char* strword(const char* _str) -{ - for (char ch = *_str++; isalnum(ch) || '_' == ch; ch = *_str++); - return _str-1; -} - -const char* strmb(const char* _str, char _open, char _close) -{ - int count = 0; - for (char ch = *_str++; ch != '\0' && count >= 0; ch = *_str++) - { - if (ch == _open) - { - count++; - } - else if (ch == _close) - { - count--; - if (0 == count) - { - return _str-1; - } - } - } - - return NULL; -} - void strins(char* _str, const char* _insert) { size_t len = strlen(_insert); @@ -630,7 +475,7 @@ private: void skipLine() { const char* str = &m_str[m_pos]; - const char* nl = strnl(str); + const char* nl = bx::strnl(str); m_pos += (uint32_t)(nl - str); } @@ -662,7 +507,7 @@ void writeFile(const char* _filePath, void* _data, uint32_t _size) } } -bool compileGLSLShader(CommandLine& _cmdLine, const std::string& _code, IStreamWriter& _stream) +bool compileGLSLShader(bx::CommandLine& _cmdLine, const std::string& _code, bx::WriterI* _writer) { const glslopt_shader_type type = tolower(_cmdLine.findOption('\0', "type")[0]) == 'f' ? kGlslOptShaderFragment : kGlslOptShaderVertex; @@ -683,36 +528,34 @@ bool compileGLSLShader(CommandLine& _cmdLine, const std::string& _code, IStreamW 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"); + writef(_writer, "#ifdef GL_ES\n"); + writef(_writer, "precision highp float;\n"); + writef(_writer, "#endif // GL_ES\n\n"); } else { - _stream.writef("#version %s\n\n", profile); + writef(_writer, "#version %s\n\n", profile); } - _stream.write(optimizedShader, strlen(optimizedShader) ); + _writer->write(optimizedShader, (int32_t)strlen(optimizedShader) ); uint8_t nul = 0; - _stream.write(nul); + bx::write(_writer, nul); glslopt_cleanup(ctx); return true; } -bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStreamWriter& _stream) +bool compileHLSLShaderDx9(bx::CommandLine& _cmdLine, const std::string& _code, bx::WriterI* _writer) { #if BX_PLATFORM_WINDOWS const char* profile = _cmdLine.findOption('p'); if (NULL == profile) { - printf("Shader profile must be specified.\n"); + fprintf(stderr, "Shader profile must be specified.\n"); return false; } - bool bigEndian = _cmdLine.hasArg('\0', "xbox360"); - uint32_t flags = 0; flags |= _cmdLine.hasArg('\0', "debug") ? D3DXSHADER_DEBUG : 0; flags |= _cmdLine.hasArg('\0', "avoid-flow-control") ? D3DXSHADER_AVOID_FLOW_CONTROL : 0; @@ -736,14 +579,13 @@ bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStre BX_TRACE("Profile: %s", profile); BX_TRACE("Flags: 0x%08x", flags); - BX_TRACE("Big Endian: %s", bigEndian?"true":"false"); LPD3DXBUFFER code; LPD3DXBUFFER errorMsg; LPD3DXCONSTANTTABLE constantTable; HRESULT hr = D3DXCompileShader(_code.c_str() - , _code.size() + , (uint32_t)_code.size() , NULL , NULL , "main" @@ -754,10 +596,10 @@ bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStre , &constantTable ); if (FAILED(hr) - || werror && NULL != errorMsg) + || (werror && NULL != errorMsg) ) { printCode(_code.c_str() ); - fprintf(stderr, "Error: 0x%08x %s\n", hr, errorMsg->GetBufferPointer() ); + fprintf(stderr, "Error: 0x%08x %s\n", (uint32_t)hr, (const char*)errorMsg->GetBufferPointer() ); return false; } @@ -765,7 +607,7 @@ bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStre hr = constantTable->GetDesc(&desc); if (FAILED(hr) ) { - fprintf(stderr, "Error 0x%08x\n", hr); + fprintf(stderr, "Error 0x%08x\n", (uint32_t)hr); return false; } @@ -809,19 +651,20 @@ bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStre } uint16_t count = (uint16_t)uniforms.size(); - _stream.write(count); + bx::write(_writer, 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); + bx::write(_writer, nameSize); + _writer->write(un.name.c_str(), nameSize); + uint8_t type = un.type|fragmentBit; + bx::write(_writer, type); + bx::write(_writer, un.num); + bx::write(_writer, un.regIndex); + bx::write(_writer, un.regCount); BX_TRACE("%s, %s, %d, %d, %d" , un.name.c_str() @@ -830,13 +673,14 @@ bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStre , un.regIndex , un.regCount ); + BX_UNUSED(s_constantTypeName); } uint16_t shaderSize = (uint16_t)code->GetBufferSize(); - _stream.write(shaderSize); - _stream.write(code->GetBufferPointer(), shaderSize); + bx::write(_writer, shaderSize); + _writer->write(code->GetBufferPointer(), shaderSize); uint8_t nul = 0; - _stream.write(nul); + bx::write(_writer, nul); if (_cmdLine.hasArg('\0', "disasm") ) { @@ -879,18 +723,16 @@ bool compileHLSLShaderDx9(CommandLine& _cmdLine, const std::string& _code, IStre #endif // BX_PLATFORM_WINDOWS } -bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStreamWriter& _stream) +bool compileHLSLShaderDx11(bx::CommandLine& _cmdLine, const std::string& _code, bx::WriterI* _writer) { #if BX_PLATFORM_WINDOWS const char* profile = _cmdLine.findOption('p'); if (NULL == profile) { - printf("Shader profile must be specified.\n"); + fprintf(stderr, "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; @@ -919,7 +761,6 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr BX_TRACE("Profile: %s", profile); BX_TRACE("Flags: 0x%08x", flags); - BX_TRACE("Big Endian: %s", bigEndian?"true":"false"); ID3DBlob* code; ID3DBlob* errorMsg; @@ -937,10 +778,10 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr , &errorMsg ); if (FAILED(hr) - || werror && NULL != errorMsg) + || (werror && NULL != errorMsg) ) { printCode(_code.c_str() ); - fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x %s\n", hr, (char*)errorMsg->GetBufferPointer() ); + fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x %s\n", (uint32_t)hr, (char*)errorMsg->GetBufferPointer() ); errorMsg->Release(); return false; } @@ -955,7 +796,7 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr ); if (FAILED(hr) ) { - fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x\n", hr); + fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x\n", (uint32_t)hr); return false; } @@ -963,7 +804,7 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr hr = reflect->GetDesc(&desc); if (FAILED(hr) ) { - fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x\n", hr); + fprintf(stderr, BX_FILE_LINE_LITERAL "Error: 0x%08x\n", (uint32_t)hr); return false; } @@ -995,7 +836,7 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr } } - _stream.write(attrMask, sizeof(attrMask) ); + _writer->write(attrMask, sizeof(attrMask) ); BX_TRACE("Output:"); for (uint32_t ii = 0; ii < desc.OutputParameters; ++ii) @@ -1084,21 +925,22 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr } uint16_t count = (uint16_t)uniforms.size(); - _stream.write(count); + bx::write(_writer, count); - _stream.write(size); + bx::write(_writer, 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::write(_writer, nameSize); + _writer->write(un.name.c_str(), nameSize); + uint8_t type = un.type|fragmentBit; + bx::write(_writer, type); + bx::write(_writer, un.num); + bx::write(_writer, un.regIndex); + bx::write(_writer, un.regCount); BX_TRACE("%s, %s, %d, %d, %d" , un.name.c_str() @@ -1110,10 +952,10 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr } uint16_t shaderSize = (uint16_t)code->GetBufferSize(); - _stream.write(shaderSize); - _stream.write(code->GetBufferPointer(), shaderSize); + bx::write(_writer, shaderSize); + _writer->write(code->GetBufferPointer(), shaderSize); uint8_t nul = 0; - _stream.write(nul); + bx::write(_writer, nul); if (_cmdLine.hasArg('\0', "disasm") ) { @@ -1130,7 +972,7 @@ bool compileHLSLShaderDx11(CommandLine& _cmdLine, const std::string& _code, IStr std::string ofp = _cmdLine.findOption('o'); ofp += ".disasm"; - writeFile(ofp.c_str(), disasm->GetBufferPointer(), disasm->GetBufferSize() ); + writeFile(ofp.c_str(), disasm->GetBufferPointer(), (uint32_t)disasm->GetBufferSize() ); disasm->Release(); } } @@ -1206,7 +1048,7 @@ struct Preprocessor void setDefaultDefine(const char* _name) { char temp[1024]; - _snprintf(temp, countof(temp) + bx::snprintf(temp, countof(temp) , "#ifndef %s\n" "# define %s 0\n" "#endif // %s\n" @@ -1223,11 +1065,7 @@ struct Preprocessor { va_list argList; va_start(argList, _format); - - char temp[2048]; - int len = vsnprintf(temp, sizeof(temp), _format, argList); - m_default += temp; - + m_default += bx::stringPrintfVargs(_format, argList); va_end(argList); } @@ -1242,6 +1080,7 @@ struct Preprocessor m_fgetsPos = 0; m_input = m_default; + m_input += "\n\n"; m_input += _input; fppTag* tagptr = m_tagptr; @@ -1300,7 +1139,7 @@ struct Preprocessor { char* result = &m_scratch[m_scratchPos]; strcpy(result, _str); - m_scratchPos += strlen(_str)+1; + m_scratchPos += (uint32_t)strlen(_str)+1; return result; } @@ -1331,6 +1170,44 @@ const char* baseName(const char* _filePath) return _filePath; } +typedef std::vector<std::string> InOut; + +uint32_t parseInOut(InOut& _inout, const char* _str, const char* _eol) +{ + uint32_t hash = 0; + _str = bx::strws(_str); + + if (_str < _eol) + { + const char* delim; + do + { + delim = strpbrk(_str, " ,"); + if (NULL != delim) + { + delim = delim > _eol ? _eol : delim; + std::string token; + token.assign(_str, delim-_str); + _inout.push_back(token); + _str = bx::strws(delim + 1); + } + } + while (delim < _eol && NULL != delim); + + std::sort(_inout.begin(), _inout.end() ); + + bx::HashMurmur2A murmur; + murmur.begin(); + for (InOut::const_iterator it = _inout.begin(), itEnd = _inout.end(); it != itEnd; ++it) + { + murmur.add(it->c_str(), it->size() ); + } + hash = murmur.end(); + } + + return hash; +} + // OpenGL #version Features Direct3D Features Shader Model // 2.1 120 vf 9.0 vf 2.0 // 3.0 130 @@ -1382,7 +1259,7 @@ void help(const char* _error = NULL) int main(int _argc, const char* _argv[]) { - CommandLine cmdLine(_argc, _argv); + bx::CommandLine cmdLine(_argc, _argv); if (cmdLine.hasArg('h', "help") ) { @@ -1443,7 +1320,7 @@ int main(int _argc, const char* _argv[]) if (NULL == bin2c) { bin2c = baseName(outFilePath); - uint32_t len = strlen(bin2c); + uint32_t len = (uint32_t)strlen(bin2c); char* temp = (char*)alloca(len+1); for (char *out = temp; *bin2c != '\0';) { @@ -1482,44 +1359,44 @@ int main(int _argc, const char* _argv[]) bool glsl = false; - if (0 == _stricmp(platform, "android") ) + if (0 == bx::stricmp(platform, "android") ) { preprocessor.setDefine("BX_PLATFORM_ANDROID=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); glsl = true; } - else if (0 == _stricmp(platform, "ios") ) + else if (0 == bx::stricmp(platform, "ios") ) { preprocessor.setDefine("BX_PLATFORM_IOS=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); glsl = true; } - else if (0 == _stricmp(platform, "linux") ) + else if (0 == bx::stricmp(platform, "linux") ) { preprocessor.setDefine("BX_PLATFORM_IOS=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); glsl = true; } - else if (0 == _stricmp(platform, "nacl") ) + else if (0 == bx::stricmp(platform, "nacl") ) { preprocessor.setDefine("BX_PLATFORM_NACL=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); glsl = true; } - else if (0 == _stricmp(platform, "osx") ) + else if (0 == bx::stricmp(platform, "osx") ) { preprocessor.setDefine("BX_PLATFORM_OSX=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); glsl = true; } - else if (0 == _stricmp(platform, "windows") ) + else if (0 == bx::stricmp(platform, "windows") ) { preprocessor.setDefine("BX_PLATFORM_WINDOWS=1"); char temp[256]; - _snprintf(temp, sizeof(temp), "BGFX_SHADER_LANGUAGE_HLSL=%d", hlsl); + bx::snprintf(temp, sizeof(temp), "BGFX_SHADER_LANGUAGE_HLSL=%d", hlsl); preprocessor.setDefine(temp); } - else if (0 == _stricmp(platform, "xbox360") ) + else if (0 == bx::stricmp(platform, "xbox360") ) { preprocessor.setDefine("BX_PLATFORM_XBOX360=1"); preprocessor.setDefine("BGFX_SHADER_LANGUAGE_HLSL=3"); @@ -1559,16 +1436,16 @@ int main(int _argc, const char* _argv[]) while (NULL != parse && *parse != '\0') { - parse = strws(parse); + parse = bx::strws(parse); const char* eol = strchr(parse, ';'); if (NULL != eol) { const char* type = parse; - const char* name = parse = strws(strword(parse) ); - const char* column = parse = strws(strword(parse) ); - const char* semantics = parse = strws(strnws(parse) ); - const char* assign = parse = strws(strword(parse) ); - const char* init = parse = strws(strnws(parse) ); + const char* name = parse = bx::strws(bx::strword(parse) ); + const char* column = parse = bx::strws(bx::strword(parse) ); + const char* semantics = parse = bx::strws(bx::strnws(parse) ); + const char* assign = parse = bx::strws(bx::strword(parse) ); + const char* init = parse = bx::strws(bx::strnws(parse) ); if (type < eol && name < eol @@ -1577,9 +1454,9 @@ int main(int _argc, const char* _argv[]) && semantics < eol) { Varying var; - var.m_type.assign(type, strword(type)-type); - var.m_name.assign(name, strword(name)-name); - var.m_semantics.assign(semantics, strword(semantics)-semantics); + var.m_type.assign(type, bx::strword(type)-type); + var.m_name.assign(name, bx::strword(name)-name); + var.m_semantics.assign(semantics, bx::strword(semantics)-semantics); if (assign < eol && '=' == *assign @@ -1596,69 +1473,34 @@ int main(int _argc, const char* _argv[]) } const size_t padding = 16; - long int size = fsize(file); + uint32_t size = (uint32_t)fsize(file); char* data = new char[size+padding]; - size = fread(data, 1, size, file); + size = (uint32_t)fread(data, 1, size, file); memset(&data[size], 0, padding); fclose(file); - typedef std::vector<std::string> InOut; InOut shaderInputs; InOut shaderOutputs; + uint32_t inputHash = 0; + uint32_t outputHash = 0; const char* input = data; while (input[0] == '$') { const char* str = input+1; - const char* eol = streol(str); - const char* nl = strnl(eol); + const char* eol = bx::streol(str); + const char* nl = bx::strnl(eol); input = nl; if (0 == strncmp(str, "input", 5) ) { str += 5; - str = strws(str); - - if (str < eol) - { - const char* delim; - do - { - delim = strpbrk(str, " ,"); - if (NULL != delim) - { - delim = delim > eol ? eol : delim; - std::string token; - token.assign(str, delim-str); - shaderInputs.push_back(token); - str = strws(delim + 1); - } - } - while (delim < eol && NULL != delim); - } + inputHash = parseInOut(shaderInputs, str, eol); } else if (0 == strncmp(str, "output", 6) ) { str += 6; - str = strws(str); - - if (str < eol) - { - const char* delim; - do - { - delim = strpbrk(str, " ,"); - if (NULL != delim) - { - delim = delim > eol ? eol : delim; - std::string token; - token.assign(str, delim-str); - shaderOutputs.push_back(token); - str = strws(delim + 1); - } - } - while (delim < eol && NULL != delim); - } + outputHash = parseInOut(shaderOutputs, str, eol); } } @@ -1756,7 +1598,7 @@ int main(int _argc, const char* _argv[]) const char* brace = strstr(entry, "{"); if (NULL != brace) { - const char* end = strmb(brace, '{', '}'); + const char* end = bx::strmb(brace, '{', '}'); if (NULL != end) { strins(const_cast<char*>(end), "__RETURN__;\n"); @@ -1828,9 +1670,9 @@ int main(int _argc, const char* _argv[]) if (preprocessOnly) { - FileWriter stream(outFilePath); + bx::CrtFileWriter writer; - if (!stream.open() ) + if (0 != writer.open(outFilePath) ) { fprintf(stderr, "Unable to open output file '%s'.", outFilePath); return false; @@ -1841,17 +1683,17 @@ int main(int _argc, const char* _argv[]) 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"); + writef(&writer, "#ifdef GL_ES\n"); + writef(&writer, "precision highp float;\n"); + writef(&writer, "#endif // GL_ES\n\n"); } else { - stream.writef("#version %s\n\n", profile); + writef(&writer, "#version %s\n\n", profile); } } - stream.write(preprocessor.m_preprocessed.c_str(), preprocessor.m_preprocessed.size() ); - stream.close(); + writer.write(preprocessor.m_preprocessed.c_str(), (int32_t)preprocessor.m_preprocessed.size() ); + writer.close(); return EXIT_SUCCESS; } @@ -1859,45 +1701,52 @@ int main(int _argc, const char* _argv[]) bool compiled = false; { - IStreamWriter* stream = NULL; + bx::CrtFileWriter* writer = NULL; if (NULL != bin2c) { - stream = new Bin2cStream(outFilePath, bin2c); + writer = new Bin2cWriter(bin2c); } else { - stream = new FileWriter(outFilePath); + writer = new bx::CrtFileWriter; } - if (!stream->open() ) + if (0 != writer->open(outFilePath) ) { fprintf(stderr, "Unable to open output file '%s'.", outFilePath); return false; } + if (fragment) + { + bx::write(writer, BGFX_CHUNK_MAGIC_FSH); + bx::write(writer, inputHash); + } + else + { + bx::write(writer, BGFX_CHUNK_MAGIC_VSH); + bx::write(writer, outputHash); + } + if (glsl) { - compiled = compileGLSLShader(cmdLine, preprocessor.m_preprocessed, *stream); + compiled = compileGLSLShader(cmdLine, preprocessor.m_preprocessed, writer); } else { if (hlsl > 3) { - compiled = compileHLSLShaderDx11(cmdLine, preprocessor.m_preprocessed, *stream); + compiled = compileHLSLShaderDx11(cmdLine, preprocessor.m_preprocessed, writer); } else { - compiled = compileHLSLShaderDx9(cmdLine, preprocessor.m_preprocessed, *stream); + compiled = compileHLSLShaderDx9(cmdLine, preprocessor.m_preprocessed, writer); } } -#if SHADERC_DEBUG - stream->writeString(filePath); -#endif // SHADERC_DEBUG - - stream->close(); - delete stream; + writer->close(); + delete writer; } if (compiled) @@ -1906,14 +1755,11 @@ int main(int _argc, const char* _argv[]) { std::string ofp = outFilePath; ofp += ".d"; - FileWriter stream(ofp.c_str() ); - if (stream.open() ) + bx::CrtFileWriter writer; + if (0 == writer.open(ofp.c_str() ) ) { - stream.write(outFilePath); - stream.write(":"); - stream.write(preprocessor.m_depends.c_str() ); - stream.write("\n"); - stream.close(); + writef(&writer, "%s : %s\n", outFilePath, preprocessor.m_depends.c_str() ); + writer.close(); } } diff --git a/tools/ddsdump.cpp b/tools/texturec/texturec.cpp similarity index 91% rename from tools/ddsdump.cpp rename to tools/texturec/texturec.cpp index 351c282d..69886858 100644 --- a/tools/ddsdump.cpp +++ b/tools/texturec/texturec.cpp @@ -17,7 +17,6 @@ using namespace bgfx; # define BX_TRACE(_format, ...) fprintf(stderr, "" _format "\n", ##__VA_ARGS__) #endif // DEBUG -#define BX_NAMESPACE 1 #include <bx/bx.h> #include <bx/commandline.h> #include <bx/uint32_t.h> @@ -95,7 +94,7 @@ long int fsize(FILE* _file) int main(int _argc, const char* _argv[]) { - CommandLine cmdLine(_argc, _argv); + bx::CommandLine cmdLine(_argc, _argv); FILE* file = fopen(_argv[1], "rb"); uint32_t size = fsize(file); @@ -157,7 +156,7 @@ int main(int _argc, const char* _argv[]) } char filePath[256]; - _snprintf(filePath, sizeof(filePath), "mip%d_%d.tga", side, lod); + bx::snprintf(filePath, sizeof(filePath), "mip%d_%d.tga", side, lod); saveTga(filePath, width, height, dstpitch, bits); free(bits); @@ -176,7 +175,7 @@ int main(int _argc, const char* _argv[]) if (getRawImageData(dds, 0, lod, mem, mip) ) { char filePath[256]; - _snprintf(filePath, sizeof(filePath), "mip%d.bin", lod); + bx::snprintf(filePath, sizeof(filePath), "mip%d.bin", lod); file = fopen(filePath, "wb"); fwrite(mip.m_data, 1, mip.m_size, file); fclose(file);