diff --git a/examples/40-svt/virtualtexture.sh b/examples/40-svt/virtualtexture.sh index 8369cceae..acc861492 100644 --- a/examples/40-svt/virtualtexture.sh +++ b/examples/40-svt/virtualtexture.sh @@ -51,7 +51,7 @@ vec4 SampleAtlas( vec3 page, vec2 uv ) uv *= BorderScale; uv += BorderOffset; - vec2 offset = floor( page.xy * 255 + 0.5 ); + vec2 offset = floor( page.xy * 255.0 + 0.5 ); return texture2D( s_vt_texture_atlas, ( offset + uv ) * AtlasScale ); } @@ -60,10 +60,10 @@ vec4 SampleAtlas( vec3 page, vec2 uv ) vec4 VirtualTextureTrilinear( vec2 uv ) { float miplevel = MipLevel( uv, VirtualTextureSize ); - miplevel = clamp( miplevel, 0, log2( PageTableSize )-1 ); + miplevel = clamp( miplevel, 0.0, log2( PageTableSize )-1.0 ); float mip1 = floor( miplevel ); - float mip2 = mip1 + 1; + float mip2 = mip1 + 1.0; float mipfrac = miplevel - mip1; vec3 page1 = SampleTable( uv, mip1 ); diff --git a/examples/common/debugdraw/varying.def.sc b/examples/common/debugdraw/varying.def.sc index 62da71486..8f44b077d 100644 --- a/examples/common/debugdraw/varying.def.sc +++ b/examples/common/debugdraw/varying.def.sc @@ -1,5 +1,5 @@ vec3 a_position : POSITION; -ivec4 a_indices : BLENDINDICES; +uvec4 a_indices : BLENDINDICES; vec4 a_color0 : COLOR0; vec2 a_texcoord0 : TEXCOORD0; diff --git a/src/bgfx_shader.sh b/src/bgfx_shader.sh index c0e8cc5d3..a796c5e5a 100644 --- a/src/bgfx_shader.sh +++ b/src/bgfx_shader.sh @@ -36,7 +36,7 @@ # define ARRAY_END() } #endif // BGFX_SHADER_LANGUAGE_GLSL -#if BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV +#if BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL # define CONST(_x) static const _x # define dFdx(_x) ddx(_x) # define dFdy(_y) ddy(-_y) @@ -53,8 +53,8 @@ # define REGISTER(_type, _reg) register(_type ## _reg) # endif // BGFX_SHADER_LANGUAGE_HLSL -# if BGFX_SHADER_LANGUAGE_HLSL > 3 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV -# if BGFX_SHADER_LANGUAGE_HLSL > 4 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV +# if BGFX_SHADER_LANGUAGE_HLSL > 3 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL +# if BGFX_SHADER_LANGUAGE_HLSL > 4 || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL # define dFdxCoarse(_x) ddx_coarse(_x) # define dFdxFine(_x) ddx_fine(_x) # define dFdyCoarse(_y) ddy_coarse(-_y) @@ -88,7 +88,7 @@ uint2 bitfieldReverse(uint2 _x) { return reversebits(_x); } uint3 bitfieldReverse(uint3 _x) { return reversebits(_x); } uint4 bitfieldReverse(uint4 _x) { return reversebits(_x); } -# if !BGFX_SHADER_LANGUAGE_SPIRV +# if !BGFX_SHADER_LANGUAGE_SPIRV && !BGFX_SHADER_LANGUAGE_METAL uint packHalf2x16(vec2 _x) { return (f32tof16(_x.y)<<16) | f32tof16(_x.x); @@ -98,7 +98,7 @@ vec2 unpackHalf2x16(uint _x) { return vec2(f16tof32(_x & 0xffff), f16tof32(_x >> 16) ); } -# endif // !BGFX_SHADER_LANGUAGE_SPIRV +# endif // !BGFX_SHADER_LANGUAGE_SPIRV && !BGFX_SHADER_LANGUAGE_METAL struct BgfxSampler2D { @@ -560,11 +560,11 @@ vec2 vec2_splat(float _x) { return vec2(_x, _x); } vec3 vec3_splat(float _x) { return vec3(_x, _x, _x); } vec4 vec4_splat(float _x) { return vec4(_x, _x, _x, _x); } -#if BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV +#if BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL uvec2 uvec2_splat(uint _x) { return uvec2(_x, _x); } uvec3 uvec3_splat(uint _x) { return uvec3(_x, _x, _x); } uvec4 uvec4_splat(uint _x) { return uvec4(_x, _x, _x, _x); } -#endif // BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV +#endif // BGFX_SHADER_LANGUAGE_GLSL >= 130 || BGFX_SHADER_LANGUAGE_HLSL || BGFX_SHADER_LANGUAGE_PSSL || BGFX_SHADER_LANGUAGE_SPIRV || BGFX_SHADER_LANGUAGE_METAL mat4 mtxFromRows(vec4 _0, vec4 _1, vec4 _2, vec4 _3) { diff --git a/tools/shaderc/shaderc.cpp b/tools/shaderc/shaderc.cpp index 0f5ce77f3..b696e2f1c 100644 --- a/tools/shaderc/shaderc.cpp +++ b/tools/shaderc/shaderc.cpp @@ -1030,7 +1030,14 @@ namespace bgfx else if (0 == bx::strCmpI(platform, "ios") ) { preprocessor.setDefine("BX_PLATFORM_IOS=1"); - preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); + if (metal) + { + preprocessor.setDefine("BGFX_SHADER_LANGUAGE_METAL=1"); + } + else + { + preprocessor.setDefine("BGFX_SHADER_LANGUAGE_GLSL=1"); + } } else if (0 == bx::strCmpI(platform, "linux") ) { @@ -1047,11 +1054,7 @@ namespace bgfx else if (0 == bx::strCmpI(platform, "osx") ) { preprocessor.setDefine("BX_PLATFORM_OSX=1"); - if (_options.shaderType == 'c') - { - preprocessor.setDefine("BGFX_SHADER_LANGUAGE_SPIRV=1"); - } - else + if (!metal) { preprocessor.setDefine(glslDefine); } @@ -1510,8 +1513,7 @@ namespace bgfx else { if (0 != glsl - || 0 != essl - || 0 != metal) + || 0 != essl) { if (0 == essl) { @@ -1937,8 +1939,7 @@ namespace bgfx } if (0 != glsl - || 0 != essl - || 0 != metal) + || 0 != essl) { if (!bx::strFind(preprocessor.m_preprocessed.c_str(), "layout(std430").isEmpty() ) { @@ -1961,21 +1962,14 @@ namespace bgfx if (0 == essl) { - const bool need130 = 0 != metal || (120 == glsl && (false + const bool need130 = (120 == glsl && (false || !bx::findIdentifierMatch(input, s_130).isEmpty() || usesInterpolationQualifiers || usesTexelFetch ) ); - if (0 != metal) - { - bx::stringPrintf(code, "#version 130\n"); - } - else - { - bx::stringPrintf(code, "#version %s\n", need130 ? "130" : _options.profile.c_str()); - glsl = 130; - } + bx::stringPrintf(code, "#version %s\n", need130 ? "130" : _options.profile.c_str()); + glsl = 130; if (need130) { @@ -2211,7 +2205,10 @@ namespace bgfx , "#define ivec2 vec2\n" "#define ivec3 vec3\n" "#define ivec4 vec4\n" - ); + "#define uvec2 vec2\n" + "#define uvec3 vec3\n" + "#define uvec4 vec4\n" + ); } } else @@ -2265,9 +2262,9 @@ namespace bgfx code += _comment; code += preprocessor.m_preprocessed; - if (0 != spirv) + if (0 != spirv || 0 != metal) { - compiled = compileSPIRVShader(_options, 0, code, _writer); + compiled = compileSPIRVShader(_options, metal ? BX_MAKEFOURCC('M', 'T', 'L', 0) : 0, code, _writer); } else if (0 != pssl) { diff --git a/tools/shaderc/shaderc_spirv.cpp b/tools/shaderc/shaderc_spirv.cpp index 91bd7c96c..16574242a 100644 --- a/tools/shaderc/shaderc_spirv.cpp +++ b/tools/shaderc/shaderc_spirv.cpp @@ -849,6 +849,12 @@ namespace bgfx { namespace spirv msl.set_decoration(resource.id, spv::DecorationBinding, binding + 1); } + for (auto &resource : resources.separate_images) + { + std::string name = msl.get_name(resource.id); + if (name.size() > 7 && 0 == bx::strCmp(name.c_str() + name.length() - 7, "Texture") ) + msl.set_name(resource.id, name.substr(0, name.length() - 7)); + } std::string source = msl.compile(); if ('c' == _options.shaderType)