#pragma once #include #include #include #include #include #include "interfaces/ITexture.h" #include "nvrenderer/nvrenderer_enums.h" enum MaTextureTraits { MaTextureTraits_Sharpen, MaTextureTraits_ClampS, MaTextureTraits_ClampT, MaTextureTraits_NoMipBias, MaTextureTraits_NoAnisotropy, MaTextureTraits_Num }; using TextureTraitFlags = std::bitset; struct opengl_texture; struct NvTexture : public ITexture { virtual bool create(bool Static = false) override { return CreateRhiTexture(); } virtual int get_width() const override { return m_width; } virtual int get_height() const override { return m_height; } virtual size_t get_id() const override { return reinterpret_cast(m_rhi_texture.Get()); } virtual void release() override {} virtual void make_stub() override {} virtual std::string_view get_traits() const override { return ""; } virtual std::string_view get_name() const override { return m_sz_texture->get_name(); } virtual std::string_view get_type() const override { return m_sz_texture->get_type(); } virtual bool is_stub() const override { return false; } virtual bool get_has_alpha() const override { return m_has_alpha; } virtual bool get_is_ready() const override { return m_rhi_texture; } virtual void set_components_hint(int format_hint) override; virtual void make_from_memory(size_t width, size_t height, const uint8_t* data) override; virtual void update_from_memory(size_t width, size_t height, const uint8_t* data) override; void Load(int size_bias); bool LoadDDS(std::string& data, int size_bias); bool IsLoaded() const; std::shared_ptr m_sz_texture; nvrhi::TextureHandle m_rhi_texture; std::vector> m_data; TextureTraitFlags GetTraits() const { return 0; } int m_width; int m_height; int m_mipcount; int m_slicecount; bool m_srgb; bool m_bc; bool m_has_alpha; nvrhi::Format m_format; size_t m_gc_slot; bool CreateRhiTexture(); uint64_t m_last_change; static uint64_t s_change_counter; uint64_t m_own_handle; }; class NvTextureManager { public: struct TextureGCSlot { size_t m_index; glm::dvec3 m_last_position_requested; }; NvTextureManager(class NvRenderer* renderer); size_t FetchTexture(std::string path, int format_hint, int size_bias, bool unload_on_location); void UpdateLastUse(size_t handle, const glm::dvec3& location); bool IsValidHandle(size_t handle); NvTexture* GetTexture(size_t handle); nvrhi::ITexture* GetRhiTexture(size_t handle, nvrhi::ICommandList* command_list = nullptr); TextureTraitFlags GetTraits(size_t handle); nvrhi::SamplerHandle GetSamplerForTraits(TextureTraitFlags traits, RendererEnums::RenderPassType pass); std::vector m_unloadable_textures; void Cleanup(const glm::dvec3& location); private: std::unordered_map m_samplers; class NvRendererBackend* m_backend; std::unordered_map m_texture_map; std::vector> m_texture_cache; };