cbuffer _95 { int4 _95_mipOffsets : packoffset(c0); uint2 _95_virtualTextureSize : packoffset(c1); uint2 _95_physicalTextureSize : packoffset(c1.z); uint _95_logTileSize : packoffset(c2); uint _95_tileSize : packoffset(c2.y); uint _95_tileBorder : packoffset(c2.z); float _95_rcpTileSize : packoffset(c2.w); float2 _95_physicalPixelTexCoordSize : packoffset(c3); float2 _95_physicalTileTexCoordSize : packoffset(c3.z); float2 _95_physicalInnerTileTexCoordSize : packoffset(c4); float2 _95_tileBorderTexCoordSize : packoffset(c4.z); }; cbuffer _181 { uint _181_virtTex : packoffset(c0); uint _181_virtMask1 : packoffset(c0.y); uint _181_virtMask2 : packoffset(c0.z); }; Texture2D atlasTexture : register(t0); SamplerState _atlasTexture_sampler : register(s0); Buffer TexturePageTable : register(t3); Texture2D mask1Texture : register(t1); SamplerState _mask1Texture_sampler : register(s1); Texture2D mask2Texture : register(t2); SamplerState _mask2Texture_sampler : register(s2); static float2 vUV; static float2 mask1UV; static float2 mask2UV; static float4 fragColor; static float3 vTint; struct SPIRV_Cross_Input { float2 vUV : TEXCOORD0; float2 mask1UV : TEXCOORD1; float2 mask2UV : TEXCOORD2; nointerpolation float3 vTint : TEXCOORD4; }; struct SPIRV_Cross_Output { float4 fragColor : SV_Target0; }; int derpMipMapLevel(float2 uv) { float2 dx_vtc = ddx(uv); float2 dy_vtc = ddy(uv); float scaleSqr = min(dx_vtc.x * dx_vtc.x, dy_vtc.y * dy_vtc.y); return int(scaleSqr); } float rcp_power_of_two(uint p) { return asfloat((127u - p) << uint(23)); } float4 virtualTexture(Texture2D physicalTexture, SamplerState _physicalTexture_sampler, Buffer pageTable, float2 texCoord) { float2 param = texCoord; int derpMip = derpMipMapLevel(param); int _76; if (derpMip < 4) { _76 = 0; } else { _76 = (derpMip < 16) ? 1 : 2; } uint mipLevel = uint(_76); float2 uv = texCoord * _95_rcpTileSize; int pageMipLevelOffset = _95_mipOffsets[mipLevel]; float virtualTextureRowLenght = float(_95_virtualTextureSize.x >> (_95_logTileSize + mipLevel)); uint param_1 = mipLevel; float2 virtualPage = floor(uv * rcp_power_of_two(param_1)); int pageID = pageMipLevelOffset + int(virtualPage.x + (virtualPage.y * virtualTextureRowLenght)); uint4 physicalTilePageData = pageTable.Load(pageID); uint2 physicalPage = physicalTilePageData.xy; mipLevel = physicalTilePageData.w; uint param_2 = mipLevel; float2 offset = (frac(uv * rcp_power_of_two(param_2)) * _95_physicalInnerTileTexCoordSize) + _95_tileBorderTexCoordSize; float2 physicalUV = (float2(physicalPage) * _95_physicalTileTexCoordSize) + offset; return physicalTexture.Sample(_physicalTexture_sampler, physicalUV); } void frag_main() { float4 texColor; if (_181_virtTex != 0u) { float2 param = vUV; texColor = virtualTexture(atlasTexture, _atlasTexture_sampler, TexturePageTable, param); } else { texColor = atlasTexture.Sample(_atlasTexture_sampler, vUV); } float mask = 1.0f; if (mask1UV.x > (-1.0f)) { if (_181_virtMask1 != 0u) { float2 param_1 = mask1UV; mask = virtualTexture(mask1Texture, _mask1Texture_sampler, TexturePageTable, param_1).x; } else { mask = mask1Texture.Sample(_mask1Texture_sampler, mask1UV).x; } if (mask2UV.x > (-1.0f)) { float mask2; if (_181_virtMask2 != 0u) { float2 param_2 = mask2UV; mask2 = virtualTexture(mask2Texture, _mask2Texture_sampler, TexturePageTable, param_2).x; } else { mask2 = mask2Texture.Sample(_mask2Texture_sampler, mask2UV).x; } mask *= mask2; } } fragColor = texColor * mask; float3 _261 = fragColor.xyz * vTint; fragColor = float4(_261.x, _261.y, _261.z, fragColor.w); } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { vUV = stage_input.vUV; mask1UV = stage_input.mask1UV; mask2UV = stage_input.mask2UV; vTint = stage_input.vTint; frag_main(); SPIRV_Cross_Output stage_output; stage_output.fragColor = fragColor; return stage_output; }