| /* |
| * 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. |
| */ |
| #ifndef _RENDERER_CONTEXT_H_ |
| #define _RENDERER_CONTEXT_H_ |
| |
| #include "RendererObject.h" |
| #include "GLDecoderContextData.h" |
| |
| #include <EGL/egl.h> |
| #define GL_API |
| #define GL_APIENTRY |
| #include <GLES/gl.h> |
| #include <string.h> |
| |
| #ifdef PVR_WAR |
| #include <set> |
| struct PendingCropRect |
| { |
| GLuint texture; |
| int rect[4]; |
| }; |
| |
| typedef std::set<PendingCropRect *> PendingCropRectSet; |
| #endif |
| |
| class RendererContext : public RendererObject { |
| public: |
| static RendererContext *create(EGLDisplay dpy, EGLConfig config, RendererContext *shareCtx, int version); |
| EGLContext eglContext() { return m_ctx; } |
| int destroy(); |
| GLDecoderContextData & decoderContextData() { return m_contextData; } |
| #ifdef PVR_WAR |
| void setActiveTexture(GLenum texture); |
| GLenum getActiveTexture() { return GL_TEXTURE0 + m_activeTexture; } |
| void setTex2DBind(GLuint texture); |
| void setTex2DEnable(bool enable) { |
| m_tex2DEnable[m_activeTexture] = enable; |
| } |
| bool isTex2DEnable(int texunit) { return m_tex2DEnable[texunit]; } |
| GLuint getTex2DBind(); |
| void addPendingCropRect(const int *rect); |
| PendingCropRectSet &getPendingCropRects() { return m_pendingCropRects; } |
| |
| void setClientActiveTexture(GLenum texture) { m_clientActiveTexture = texture - GL_TEXTURE0; } |
| GLenum getClientActiveTexture() { return m_clientActiveTexture + GL_TEXTURE0; } |
| void enableClientState(GLenum cap, bool enable) { |
| switch(cap) { |
| case GL_VERTEX_ARRAY: |
| m_clientStateEnable[0] = enable; |
| break; |
| case GL_NORMAL_ARRAY: |
| m_clientStateEnable[1] = enable; |
| break; |
| case GL_COLOR_ARRAY: |
| m_clientStateEnable[2] = enable; |
| break; |
| case GL_POINT_SIZE_ARRAY_OES: |
| m_clientStateEnable[3] = enable; |
| break; |
| case GL_TEXTURE_COORD_ARRAY: |
| m_clientStateEnable[4 + m_clientActiveTexture] = enable; |
| break; |
| } |
| } |
| |
| bool getClientState(GLenum cap, int texUnit) { |
| switch(cap) { |
| case GL_VERTEX_ARRAY: |
| return m_clientStateEnable[0]; |
| case GL_NORMAL_ARRAY: |
| return m_clientStateEnable[1]; |
| case GL_COLOR_ARRAY: |
| return m_clientStateEnable[2]; |
| case GL_POINT_SIZE_ARRAY_OES: |
| return m_clientStateEnable[3]; |
| break; |
| case GL_TEXTURE_COORD_ARRAY: |
| return m_clientStateEnable[4 + texUnit]; |
| break; |
| } |
| return false; |
| } |
| #endif |
| |
| private: |
| EGLDisplay m_dpy; |
| EGLContext m_ctx; |
| GLDecoderContextData m_contextData; |
| int m_version; |
| |
| RendererContext(EGLDisplay dpy, EGLContext ctx, int version) : |
| m_dpy(dpy), |
| m_ctx(ctx), |
| m_version(version) |
| { |
| #ifdef PVR_WAR |
| m_activeTexture = 0; |
| m_clientActiveTexture = 0; |
| memset(m_tex2DBind, 0, 8*sizeof(GLuint)); |
| memset(m_tex2DEnable, 0, 8*sizeof(bool)); |
| memset(m_clientStateEnable, 0, 16*sizeof(bool)); |
| #endif |
| } |
| |
| #ifdef PVR_WAR |
| int m_tex2DBind[8]; |
| bool m_tex2DEnable[8]; |
| int m_activeTexture; |
| int m_clientActiveTexture; |
| bool m_clientStateEnable[16]; |
| PendingCropRectSet m_pendingCropRects; |
| #endif |
| }; |
| #endif |