/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "GLcommon/TextureData.h" #include "aemu/base/containers/Lookup.h" #include "aemu/base/files/StreamSerializing.h" #include "GLcommon/GLEScontext.h" #include "GLcommon/GLutils.h" #include using android::base::find; TextureData::TextureData(android::base::Stream* stream) : ObjectData(stream) { // The current TextureData structure is wrong when dealing with mipmaps. target = stream->getBe32(); width = stream->getBe32(); height = stream->getBe32(); depth = stream->getBe32(); border = stream->getBe32(); internalFormat = stream->getBe32(); format = stream->getBe32(); type = stream->getBe32(); sourceEGLImage = stream->getBe32(); hasStorage = stream->getByte(); wasBound = stream->getByte(); requiresAutoMipmap = stream->getByte(); compressed = stream->getByte(); compressedFormat = stream->getBe32(); stream->read(crop_rect, sizeof(crop_rect)); texStorageLevels = stream->getBe32(); stream->getBe32(); // deprecated mipmap level globalName = stream->getBe32(); loadCollection(stream, &m_texParam, [](android::base::Stream* stream) { GLenum item = stream->getBe32(); GLint val = stream->getBe32(); return std::make_pair(item, val); }); } void TextureData::onSave(android::base::Stream* stream, unsigned int globalName) const { ObjectData::onSave(stream, globalName); // The current TextureData structure is wrong when dealing with mipmaps. stream->putBe32(target); stream->putBe32(width); stream->putBe32(height); stream->putBe32(depth); stream->putBe32(border); stream->putBe32(internalFormat); stream->putBe32(format); stream->putBe32(type); stream->putBe32(sourceEGLImage); stream->putByte(hasStorage); stream->putByte(wasBound); stream->putByte(requiresAutoMipmap); stream->putByte(compressed); stream->putBe32(compressedFormat); stream->write(crop_rect, sizeof(crop_rect)); stream->putBe32(texStorageLevels); stream->putBe32(0); // deprecated mipmap level stream->putBe32(globalName); saveCollection(stream, m_texParam, [](android::base::Stream* stream, const std::pair& texParam) { stream->putBe32(texParam.first); stream->putBe32(texParam.second); }); } void TextureData::restore(ObjectLocalName localName, const getGlobalName_t& getGlobalName) { ObjectData::restore(localName, getGlobalName); } void TextureData::setSaveableTexture(SaveableTexturePtr&& saveableTexture) { m_saveableTexture = std::move(saveableTexture); } const SaveableTexturePtr& TextureData::getSaveableTexture() const { return m_saveableTexture; } void TextureData::resetSaveableTexture() { m_saveableTexture.reset(new SaveableTexture(*this)); } unsigned int TextureData::getGlobalName() const { return globalName; } void TextureData::setGlobalName(unsigned int name) { globalName = name; } void TextureData::setTexParam(GLenum pname, GLint param) { m_texParam[pname] = param; } GLenum TextureData::getSwizzle(GLenum component) const { if (const auto res = find(m_texParam, component)) { return *res; }; switch (component) { case GL_TEXTURE_SWIZZLE_R: return GL_RED; case GL_TEXTURE_SWIZZLE_G: return GL_GREEN; case GL_TEXTURE_SWIZZLE_B: return GL_BLUE; case GL_TEXTURE_SWIZZLE_A: return GL_ALPHA; default: return GL_ZERO; } } void TextureData::makeDirty() { assert(m_saveableTexture); m_saveableTexture->makeDirty(); } void TextureData::setTarget(GLenum _target) { target = _target; m_saveableTexture->setTarget(target); } void TextureData::setMipmapLevelAtLeast(unsigned int level) { m_saveableTexture->setMipmapLevelAtLeast(level); }