void GSTextureOGL::CommitPages(const GSVector2i& region, bool commit) { GLState::available_vram += m_mem_usage; if (commit) { if (m_committed_size.x == 0) { // Nothing allocated so far GL_INS("CommitPages initial %dx%d of %u", region.x, region.y, m_texture_id); glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, 0, 0, 0, region.x, region.y, 1, commit); } else { GL_INS("CommitPages extend %dx%d to %dx%d of %u", m_committed_size.x, m_committed_size.y, region.x, region.y, m_texture_id); int w = region.x - m_committed_size.x; int h = region.y - m_committed_size.y; // Extend width glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, m_committed_size.x, 0, 0, w, m_committed_size.y, 1, commit); // Extend height glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, 0, m_committed_size.y, 0, region.x, h, 1, commit); } m_committed_size = region; } else { // Release everything GL_INS("CommitPages release of %u", m_texture_id); glTexturePageCommitmentEXT(m_texture_id, GL_TEX_LEVEL_0, 0, 0, 0, m_committed_size.x, m_committed_size.y, 1, commit); m_committed_size = GSVector2i(0, 0); } m_mem_usage = (m_committed_size.x * m_committed_size.y) << m_int_shift; GLState::available_vram -= m_mem_usage; }
// ------------------------------------------------------------------------------------------------ void Texture2DContainer::changeCommitment(GLsizei slice, GLboolean commit) { if (glTexturePageCommitmentEXT == nullptr) return; GLenum err = glGetError(); GLsizei levelWidth = mWidth, levelHeight = mHeight; for (int level = 0; level < mLevels; ++level) { glTexturePageCommitmentEXT(mTexId, level, 0, 0, slice, levelWidth, levelHeight, 1, commit); levelWidth = std::max(levelWidth / 2, 1); levelHeight = std::max(levelHeight / 2, 1); } err = glGetError(); }