130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun/*
330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Copyright 2011 Google Inc.
430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun *
530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * Use of this source code is governed by a BSD-style license that can be
630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun * found in the LICENSE file.
730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun */
830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "GrTypes.h"
1130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gl/GrGLConfig.h"
1330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "GrGpu.h"
1530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#include "gl/GrGpuGL.h"
1630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim GurunGrGpu* GrGpu::Create(GrBackend backend, GrBackendContext backendContext, GrContext* context) {
1830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
1930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    const GrGLInterface* glInterface = NULL;
2030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    SkAutoTUnref<const GrGLInterface> glInterfaceUnref;
2130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun
2230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    if (kOpenGL_GrBackend == backend) {
2330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        glInterface = reinterpret_cast<const GrGLInterface*>(backendContext);
2430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        if (NULL == glInterface) {
2530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            glInterface = GrGLDefaultInterface();
2630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            // By calling GrGLDefaultInterface we've taken a ref on the
2730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            // returned object. We only want to hold that ref until after
2830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            // the GrGpu is constructed and has taken ownership.
2930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            glInterfaceUnref.reset(glInterface);
3030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        }
3130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        if (NULL == glInterface) {
3230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#ifdef SK_DEBUG
3330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            GrPrintf("No GL interface provided!\n");
3430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun#endif
3530d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            return NULL;
3630d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        }
3730d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        GrGLContext ctx(glInterface);
3830d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        if (ctx.isInitialized()) {
3930d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun            return SkNEW_ARGS(GrGpuGL, (ctx, context));
4030d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun        }
4130d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    }
4230d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun    return NULL;
4330d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun}
4430d4e1f3d81ad9f7a1aa14ce6d2ceb5df56c15cdSelim Gurun