/* * 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 #include "aemu/base/synchronization/Lock.h" #include #include #include #include #include bool isPowerOf2(int num) { return (num & (num -1)) == 0; } android::base::StaticLock sGlobalSettingsLock; static uint32_t s_gles2Gles = 0; static uint32_t s_coreProfile = 0; void setGles2Gles(bool isGles2Gles) { __atomic_store_n(&s_gles2Gles, isGles2Gles ? 1 : 0, __ATOMIC_RELAXED); } bool isGles2Gles() { return __atomic_load_n(&s_gles2Gles, __ATOMIC_RELAXED) != 0; } void setCoreProfile(bool isCore) { __atomic_store_n(&s_coreProfile, isCore ? 1 : 0, __ATOMIC_RELAXED); } bool isCoreProfile() { return __atomic_load_n(&s_coreProfile, __ATOMIC_RELAXED) != 0; } FramebufferChannelBits glFormatToChannelBits(GLenum colorFormat, GLenum depthFormat, GLenum stencilFormat) { FramebufferChannelBits res = {}; #define COLOR_BITS_CASE(format, r, g, b, a) \ case format: res.red = r; res.green = g; res.blue = b; res.alpha = a; break; \ switch (colorFormat) { COLOR_BITS_CASE(GL_ALPHA, 0, 0, 0, 8) COLOR_BITS_CASE(GL_LUMINANCE, 0, 0, 0, 0) COLOR_BITS_CASE(GL_LUMINANCE_ALPHA, 0, 0, 0, 8) COLOR_BITS_CASE(GL_RGB, 8, 8, 8, 0) COLOR_BITS_CASE(GL_RGBA, 8, 8, 8, 8) COLOR_BITS_CASE(GL_R11F_G11F_B10F, 11, 11, 10, 0) COLOR_BITS_CASE(GL_R16F, 16, 0, 0, 0) COLOR_BITS_CASE(GL_R16I, 16, 0, 0, 0) COLOR_BITS_CASE(GL_R16UI, 16, 0, 0, 0) COLOR_BITS_CASE(GL_R32F, 32, 0, 0, 0) COLOR_BITS_CASE(GL_R32I, 32, 0, 0, 0) COLOR_BITS_CASE(GL_R32UI, 32, 0, 0, 0) COLOR_BITS_CASE(GL_R8, 8, 0, 0, 0) COLOR_BITS_CASE(GL_R8I, 8, 0, 0, 0) COLOR_BITS_CASE(GL_R8_SNORM, 8, 0, 0, 0) COLOR_BITS_CASE(GL_R8UI, 8, 0, 0, 0) COLOR_BITS_CASE(GL_RG16F, 16, 0, 0, 0) COLOR_BITS_CASE(GL_RG16I, 16, 0, 0, 0) COLOR_BITS_CASE(GL_RG16UI, 16, 0, 0, 0) COLOR_BITS_CASE(GL_RG32F, 32, 0, 0, 0) COLOR_BITS_CASE(GL_RG32I, 32, 0, 0, 0) COLOR_BITS_CASE(GL_RG32UI, 32, 0, 0, 0) COLOR_BITS_CASE(GL_RG8, 8, 8, 0, 0) COLOR_BITS_CASE(GL_RG8I, 8, 8, 0, 0) COLOR_BITS_CASE(GL_RG8_SNORM, 8, 8, 0, 0) COLOR_BITS_CASE(GL_RG8UI, 8, 8, 0, 0) COLOR_BITS_CASE(GL_RGB10_A2, 10, 10, 10, 2) COLOR_BITS_CASE(GL_RGB10_A2UI, 10, 10, 10, 2) COLOR_BITS_CASE(GL_RGB16F, 16, 16, 16, 0) COLOR_BITS_CASE(GL_RGB16I, 16, 16, 16, 0) COLOR_BITS_CASE(GL_RGB16UI, 16, 16, 16, 0) COLOR_BITS_CASE(GL_RGB32F, 32, 32, 32, 0) COLOR_BITS_CASE(GL_RGB32I, 32, 32, 32, 0) COLOR_BITS_CASE(GL_RGB32UI, 32, 32, 32, 0) COLOR_BITS_CASE(GL_RGB565, 5, 6, 5, 0) COLOR_BITS_CASE(GL_RGB5_A1, 5, 5, 5, 1) COLOR_BITS_CASE(GL_RGB8, 8, 8, 8, 0) COLOR_BITS_CASE(GL_RGB8I, 8, 8, 8, 0) COLOR_BITS_CASE(GL_RGB8_SNORM, 8, 8, 8, 0) COLOR_BITS_CASE(GL_RGB8UI, 8, 8, 8, 0) COLOR_BITS_CASE(GL_RGB9_E5, 9, 9, 9, 0) COLOR_BITS_CASE(GL_RGBA16F, 16, 16, 16, 16) COLOR_BITS_CASE(GL_RGBA16I, 16, 16, 16, 16) COLOR_BITS_CASE(GL_RGBA16UI, 16, 16, 16, 16) COLOR_BITS_CASE(GL_RGBA32F, 32, 32, 32, 32) COLOR_BITS_CASE(GL_RGBA32I, 32, 32, 32, 32) COLOR_BITS_CASE(GL_RGBA32UI, 32, 32, 32, 32) COLOR_BITS_CASE(GL_RGBA4, 4, 4, 4, 4) COLOR_BITS_CASE(GL_RGBA8, 8, 8, 8, 8) COLOR_BITS_CASE(GL_RGBA8I, 8, 8, 8, 8) COLOR_BITS_CASE(GL_RGBA8_SNORM, 8, 8, 8, 8) COLOR_BITS_CASE(GL_RGBA8UI, 8, 8, 8, 8) COLOR_BITS_CASE(GL_SRGB8, 8, 8, 8, 0) COLOR_BITS_CASE(GL_SRGB8_ALPHA8, 8, 8, 8, 8) } #define DEPTH_BITS_CASE(format, d) \ case format: res.depth = d; break; \ switch (depthFormat) { DEPTH_BITS_CASE(GL_DEPTH_COMPONENT16, 16) DEPTH_BITS_CASE(GL_DEPTH_COMPONENT24, 24) DEPTH_BITS_CASE(GL_DEPTH_COMPONENT32F, 32) DEPTH_BITS_CASE(GL_DEPTH24_STENCIL8, 24) DEPTH_BITS_CASE(GL_DEPTH32F_STENCIL8, 32) DEPTH_BITS_CASE(GL_STENCIL_INDEX8, 0) } #define STENCIL_BITS_CASE(format, d) \ case format: res.stencil = d; break; \ switch (stencilFormat) { STENCIL_BITS_CASE(GL_DEPTH_COMPONENT16, 0) STENCIL_BITS_CASE(GL_DEPTH_COMPONENT24, 0) STENCIL_BITS_CASE(GL_DEPTH_COMPONENT32F, 0) STENCIL_BITS_CASE(GL_DEPTH24_STENCIL8, 8) STENCIL_BITS_CASE(GL_DEPTH32F_STENCIL8, 8) STENCIL_BITS_CASE(GL_STENCIL_INDEX8, 8) } return res; } GLenum baseFormatOfInternalFormat(GLint internalformat) { switch (internalformat) { case GL_ALPHA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: case GL_RGB: case GL_RGBA: return internalformat; case GL_R8: case GL_R8_SNORM: case GL_R16F: case GL_R32F: return GL_RED; case GL_R8I: case GL_R8UI: case GL_R16I: case GL_R16UI: case GL_R32I: case GL_R32UI: return GL_RED_INTEGER; case GL_RG8: case GL_RG8_SNORM: case GL_RG16F: case GL_RG32F: return GL_RG; case GL_RG8I: case GL_RG8UI: case GL_RG16I: case GL_RG16UI: case GL_RG32I: case GL_RG32UI: return GL_RG_INTEGER; case GL_RGB565: case GL_RGB8: case GL_SRGB8: case GL_RGB8_SNORM: case GL_RGB9_E5: case GL_R11F_G11F_B10F: case GL_RGB16F: case GL_RGB32F: return GL_RGB; case GL_RGB8I: case GL_RGB8UI: case GL_RGB16I: case GL_RGB16UI: case GL_RGB32I: case GL_RGB32UI: return GL_RGB_INTEGER; case GL_RGBA4: case GL_RGB5_A1: case GL_RGBA8: case GL_SRGB8_ALPHA8: case GL_RGBA8_SNORM: case GL_RGB10_A2: case GL_RGBA16F: case GL_RGBA32F: return GL_RGBA; case GL_RGBA8I: case GL_RGBA8UI: case GL_RGB10_A2UI: case GL_RGBA16I: case GL_RGBA16UI: case GL_RGBA32I: case GL_RGBA32UI: return GL_RGBA_INTEGER; case GL_DEPTH_COMPONENT16: case GL_DEPTH_COMPONENT24: case GL_DEPTH_COMPONENT32F: return GL_DEPTH_COMPONENT; case GL_DEPTH24_STENCIL8: case GL_DEPTH32F_STENCIL8: return GL_DEPTH_STENCIL; case GL_STENCIL_INDEX8: return GL_STENCIL; } fprintf(stderr, "%s: warning: unrecognized internal format 0x%x\n", __func__, internalformat); return internalformat; } GLenum accurateTypeOfInternalFormat(GLint internalformat) { switch (internalformat) { case GL_ALPHA: case GL_LUMINANCE: case GL_LUMINANCE_ALPHA: case GL_RGB: case GL_RGBA: case GL_R8: case GL_R8_SNORM: case GL_RG8: case GL_RG8_SNORM: case GL_RGB8: case GL_SRGB8: case GL_RGB8_SNORM: case GL_RGBA8: case GL_SRGB8_ALPHA8: case GL_RGBA8_SNORM: case GL_R8UI: case GL_RG8UI: case GL_RGB8UI: case GL_RGBA8UI: return GL_UNSIGNED_BYTE; case GL_R8I: case GL_RG8I: case GL_RGB8I: case GL_RGBA8I: return GL_BYTE; case GL_R16UI: case GL_RG16UI: case GL_RGB16UI: case GL_RGBA16UI: case GL_DEPTH_COMPONENT16: return GL_UNSIGNED_SHORT; case GL_R16I: case GL_RG16I: case GL_RGB16I: case GL_RGBA16I: return GL_SHORT; case GL_R32UI: case GL_RG32UI: case GL_RGB32UI: case GL_RGBA32UI: case GL_DEPTH_COMPONENT24: return GL_UNSIGNED_INT; case GL_R32I: case GL_RG32I: case GL_RGB32I: case GL_RGBA32I: return GL_INT; case GL_R16F: case GL_RG16F: case GL_RGB16F: case GL_RGBA16F: return GL_HALF_FLOAT; case GL_R32F: case GL_RG32F: case GL_RGB32F: case GL_RGBA32F: case GL_DEPTH_COMPONENT32F: return GL_FLOAT; case GL_DEPTH24_STENCIL8: return GL_UNSIGNED_INT_24_8; case GL_DEPTH32F_STENCIL8: return GL_FLOAT_32_UNSIGNED_INT_24_8_REV; case GL_RGB565: return GL_UNSIGNED_SHORT_5_6_5; case GL_RGB9_E5: return GL_UNSIGNED_INT_5_9_9_9_REV; case GL_R11F_G11F_B10F: return GL_UNSIGNED_INT_10F_11F_11F_REV; case GL_RGBA4: return GL_UNSIGNED_SHORT_4_4_4_4; case GL_RGB5_A1: return GL_UNSIGNED_SHORT_5_5_5_1; case GL_RGB10_A2: case GL_RGB10_A2UI: return GL_UNSIGNED_INT_2_10_10_10_REV; case GL_STENCIL_INDEX8: return GL_UNSIGNED_BYTE; } fprintf(stderr, "%s: warning: unrecognized internal format 0x%x\n", __func__, internalformat); return GL_UNSIGNED_BYTE; }