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); }; Texture2D tex : register(t0); SamplerState _tex_sampler : register(s0); Buffer TexturePageTable : register(t1); static float4 fragColor; static float2 vUV; static float4 vTint; struct SPIRV_Cross_Input { float2 vUV : TEXCOORD0; float4 vTint : TEXCOORD1; }; 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() { float2 param = vUV; fragColor = virtualTexture(tex, _tex_sampler, TexturePageTable, param) * vTint; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { vUV = stage_input.vUV; vTint = stage_input.vTint; frag_main(); SPIRV_Cross_Output stage_output; stage_output.fragColor = fragColor; return stage_output; }