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