11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef SkGLContext_DEFINED 91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SkGLContext_DEFINED 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "GrGLInterface.h" 124f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger#include "SkString.h" 131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** 151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Create an offscreen opengl context with an RGBA8 / 8bit stencil FBO. 161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Provides a GrGLInterface struct of function pointers for the context. 171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkGLContext : public SkRefCnt { 201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic: 211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger SkGLContext(); 221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual ~SkGLContext(); 231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Initializes the context and makes it current. 261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger bool init(const int width, const int height); 281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger int getFBOID() const { return fFBO; } 301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrGLInterface* gl() const { return fGL; } 321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void makeCurrent() const = 0; 341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 354f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger bool hasExtension(const char* extensionName) const; 364f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger 371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected: 381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Subclass implements this to make a GL context. The returned GrGLInterface 401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * should be populated with functions compatible with the context. The 411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * format and size of backbuffers does not matter since an FBO will be 421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * created. 431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual const GrGLInterface* createGLContext() = 0; 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger /** 471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Subclass should destroy the underlying GL context. 481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger virtual void destroyGLContext() = 0; 501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate: 524f1dae40e24d57d647db01443b8bf2410514b8b5Derek Sollenberger SkString fExtensionString; 531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger GrGLuint fFBO; 541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger const GrGLInterface* fGL; 551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}; 561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/** 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Helper macro for using the GL context through the GrGLInterface. Example: 591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * SK_GL(glCtx, GenTextures(1, &texID)); 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SK_GL(ctx, X) (ctx).gl()->f ## X 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif 64