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