13f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
23f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com/*
33f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Copyright 2011 Google Inc.
43f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com *
53f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * Use of this source code is governed by a BSD-style license that can be
63f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com * found in the LICENSE file.
73f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com */
83f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
93f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
103f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrTypes.h"
113f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
122df70f5e46abf6361a988a2c09d04815f77f19cftomhudson@google.com#include "gl/GrGLConfig.h"
133f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
143f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#include "GrGpu.h"
1556a27453dc4275cfafe261230e4fdf06839c0fafbsalomon@google.com#include "gl/GrGpuGL.h"
163f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
170ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.comGrGpu* GrGpu::Create(GrBackend backend, GrBackendContext backendContext, GrContext* context) {
183f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
193f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    const GrGLInterface* glInterface = NULL;
203f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    SkAutoTUnref<const GrGLInterface> glInterfaceUnref;
213f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com
22cff60e9fc895438fae7733789ef0cd02327ca38dbsalomon@google.com    if (kOpenGL_GrBackend == backend) {
230ad5bd91fd7dc876326ee0832ca8f7947dc1cc24bsalomon@google.com        glInterface = reinterpret_cast<const GrGLInterface*>(backendContext);
243f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        if (NULL == glInterface) {
253f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            glInterface = GrGLDefaultInterface();
263f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            // By calling GrGLDefaultInterface we've taken a ref on the
273f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            // returned object. We only want to hold that ref until after
283f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            // the GrGpu is constructed and has taken ownership.
293f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            glInterfaceUnref.reset(glInterface);
303f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
313f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        if (NULL == glInterface) {
323f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#if GR_DEBUG
333f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            GrPrintf("No GL interface provided!\n");
343f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com#endif
353f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com            return NULL;
363f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
37860f3b88452e3dd2cf47282f1a1527e8876d41e1robertphillips@google.com        GrGLContext ctx(glInterface);
38860f3b88452e3dd2cf47282f1a1527e8876d41e1robertphillips@google.com        if (ctx.isInitialized()) {
39860f3b88452e3dd2cf47282f1a1527e8876d41e1robertphillips@google.com            return SkNEW_ARGS(GrGpuGL, (ctx, context));
403f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com        }
413f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com    }
42d1ff62bc65c70ac34b972878f125f1645200f41fbsalomon@google.com    return NULL;
433f30e3a41fc16816105e28e0d4c241eff6d391b4bsalomon@google.com}
44