void GLBackend::setResourceTexture(unsigned int slot, const TexturePointer& resourceTexture) { // check cache before thinking if (_resource._textures[slot] == resourceTexture) { return; } // One more True texture bound _stats._RSNumTextureBounded++; // Always make sure the GLObject is in sync GLTexture* object = syncGPUObject(resourceTexture); if (object) { GLuint to = object->_texture; GLuint target = object->_target; glActiveTexture(GL_TEXTURE0 + slot); glBindTexture(target, to); (void)CHECK_GL_ERROR(); _resource._textures[slot] = resourceTexture; _stats._RSAmountTextureMemoryBounded += (int)object->size(); } else { releaseResourceTexture(slot); return; } }
void GLBackend::do_setResourceTexture(const Batch& batch, size_t paramOffset) { GLuint slot = batch._params[paramOffset + 1]._uint; if (slot >= (GLuint) MAX_NUM_RESOURCE_TEXTURES) { // "GLBackend::do_setResourceTexture: Trying to set a resource Texture at slot #" + slot + " which doesn't exist. MaxNumResourceTextures = " + getMaxNumResourceTextures()); return; } TexturePointer resourceTexture = batch._textures.get(batch._params[paramOffset + 0]._uint); if (!resourceTexture) { releaseResourceTexture(slot); return; } // check cache before thinking if (_resource._textures[slot] == resourceTexture) { return; } // One more True texture bound _stats._RSNumTextureBounded++; // Always make sure the GLObject is in sync GLTexture* object = syncGPUObject(resourceTexture); if (object) { GLuint to = object->_texture; GLuint target = object->_target; glActiveTexture(GL_TEXTURE0 + slot); glBindTexture(target, to); (void) CHECK_GL_ERROR(); _resource._textures[slot] = resourceTexture; _stats._RSAmountTextureMemoryBounded += object->size(); } else { releaseResourceTexture(slot); return; } }