/// <summary> /// Gets the texture descriptor for a given texture handle. /// </summary> /// <param name="state">The current GPU state</param> /// <param name="stageIndex">The stage number where the texture is bound</param> /// <param name="handle">The texture handle</param> /// <returns>The texture descriptor for the specified texture</returns> public TextureDescriptor GetTextureDescriptor(GpuState state, int stageIndex, int handle) { int packedId = ReadPackedId(stageIndex, handle, state.Get <int>(MethodOffset.TextureBufferIndex)); int textureId = UnpackTextureId(packedId); var poolState = state.Get <PoolState>(MethodOffset.TexturePoolState); ulong poolAddress = _context.MemoryManager.Translate(poolState.Address.Pack()); TexturePool texturePool = _texturePoolCache.FindOrCreate(poolAddress, poolState.MaximumId); return(texturePool.GetDescriptor(textureId)); }
/// <summary> /// Gets the texture descriptor for a given texture handle. /// </summary> /// <param name="poolGpuVa">GPU virtual address of the texture pool</param> /// <param name="bufferIndex">Index of the constant buffer with texture handles</param> /// <param name="maximumId">Maximum ID of the texture pool</param> /// <param name="stageIndex">The stage number where the texture is bound</param> /// <param name="handle">The texture handle</param> /// <param name="cbufSlot">The texture handle's constant buffer slot</param> /// <returns>The texture descriptor for the specified texture</returns> public TextureDescriptor GetTextureDescriptor( ulong poolGpuVa, int bufferIndex, int maximumId, int stageIndex, int handle, int cbufSlot) { int textureBufferIndex = cbufSlot < 0 ? bufferIndex : cbufSlot & SlotMask; int packedId = ReadPackedId(stageIndex, handle, textureBufferIndex, textureBufferIndex); int textureId = UnpackTextureId(packedId); ulong poolAddress = _channel.MemoryManager.Translate(poolGpuVa); TexturePool texturePool = _texturePoolCache.FindOrCreate(_channel, poolAddress, maximumId); return(texturePool.GetDescriptor(textureId)); }