HdSimpleTextureResource::HdSimpleTextureResource( GlfTextureHandleRefPtr const &textureHandle, bool isPtex, HdWrap wrapS, HdWrap wrapT, HdMinFilter minFilter, HdMagFilter magFilter) : _textureHandle(textureHandle) , _texture(textureHandle->GetTexture()) , _borderColor(0.0,0.0,0.0,0.0) , _maxAnisotropy(16.0) , _sampler(0) , _isPtex(isPtex) { if (!glGenSamplers) { // GL initialization guard for headless unit test return; } // When we are not using Ptex we will use samplers, // that includes both, bindless textures and no-bindless textures if (!_isPtex) { // It is possible the texture provides wrap modes itself, in that // case we will use the wrap modes provided by the texture GLenum fwrapS = HdConversions::GetWrap(wrapS); GLenum fwrapT = HdConversions::GetWrap(wrapT); VtDictionary txInfo = _texture->GetTextureInfo(); if (VtDictionaryIsHolding<GLuint>(txInfo, "wrapModeS")) { fwrapS = VtDictionaryGet<GLuint>(txInfo, "wrapModeS"); } if (VtDictionaryIsHolding<GLuint>(txInfo, "wrapModeT")) { fwrapT = VtDictionaryGet<GLuint>(txInfo, "wrapModeT"); } GLenum fminFilter = HdConversions::GetMinFilter(minFilter); GLenum fmagFilter = HdConversions::GetMagFilter(magFilter); if (!_texture->IsMinFilterSupported(fminFilter)) { fminFilter = GL_NEAREST; } if (!_texture->IsMagFilterSupported(fmagFilter)) { fmagFilter = GL_NEAREST; } glGenSamplers(1, &_sampler); glSamplerParameteri(_sampler, GL_TEXTURE_WRAP_S, fwrapS); glSamplerParameteri(_sampler, GL_TEXTURE_WRAP_T, fwrapT); glSamplerParameteri(_sampler, GL_TEXTURE_MIN_FILTER, fminFilter); glSamplerParameteri(_sampler, GL_TEXTURE_MAG_FILTER, fmagFilter); glSamplerParameterf(_sampler, GL_TEXTURE_MAX_ANISOTROPY_EXT, _maxAnisotropy); glSamplerParameterfv(_sampler, GL_TEXTURE_BORDER_COLOR, _borderColor.GetArray()); } bool bindlessTexture = HdRenderContextCaps::GetInstance().bindlessTextureEnabled; if (bindlessTexture) { size_t handle = GetTexelsTextureHandle(); if (handle) { if (!glIsTextureHandleResidentNV(handle)) { glMakeTextureHandleResidentNV(handle); } } if (_isPtex) { handle = GetLayoutTextureHandle(); if (handle) { if (!glIsTextureHandleResidentNV(handle)) { glMakeTextureHandleResidentNV(handle); } } } } }
bool isResident() const { assert(m_nHandle); return glIsTextureHandleResidentNV(m_nHandle); }
JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengles_NVBindlessTexture_glIsTextureHandleResidentNV(JNIEnv *__env, jclass clazz, jlong handle) { glIsTextureHandleResidentNVPROC glIsTextureHandleResidentNV = (glIsTextureHandleResidentNVPROC)tlsGetFunction(598); UNUSED_PARAM(clazz) return (jboolean)glIsTextureHandleResidentNV(handle); }