GrGLPathRange.cpp revision 861e1037017bbb7ac52ec5ebecab3a636a82a3e8
1b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
2b85a0aab6905af8b329539b7573a7555b727d5e5cdalton/*
3b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * Copyright 2014 Google Inc.
4b85a0aab6905af8b329539b7573a7555b727d5e5cdalton *
5b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * Use of this source code is governed by a BSD-style license that can be
6b85a0aab6905af8b329539b7573a7555b727d5e5cdalton * found in the LICENSE file.
7b85a0aab6905af8b329539b7573a7555b727d5e5cdalton */
8b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
9b85a0aab6905af8b329539b7573a7555b727d5e5cdalton#include "GrGLPathRange.h"
10b85a0aab6905af8b329539b7573a7555b727d5e5cdalton#include "GrGLPath.h"
11c7103a104fdc7150b4e3c0d3efc42735ad359616cdalton#include "GrGLPathRendering.h"
12b85a0aab6905af8b329539b7573a7555b727d5e5cdalton#include "GrGpuGL.h"
13b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
14861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonGrGLPathRange::GrGLPathRange(GrGLGpu* gpu, PathGenerator* pathGenerator, const SkStrokeRec& stroke)
15855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    : INHERITED(gpu, pathGenerator, stroke),
16855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fBasePathID(gpu->glPathRendering()->genPaths(this->getNumPaths())),
17855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fGpuMemorySize(0) {
18855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    this->registerWithCache();
19855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton}
20855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton
21861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomonGrGLPathRange::GrGLPathRange(GrGLGpu* gpu,
22855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             GrGLuint basePathID,
23855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             int numPaths,
24855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             size_t gpuMemorySize,
25855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                             const SkStrokeRec& stroke)
26855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    : INHERITED(gpu, numPaths, stroke),
27855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fBasePathID(basePathID),
28855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton      fGpuMemorySize(gpuMemorySize) {
29855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    this->registerWithCache();
30b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
31b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
32855d83ff79c6c822b2ad653f2f890178ad0f637bcdaltonvoid GrGLPathRange::onInitPath(int index, const SkPath& skPath) const {
33861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon    GrGLGpu* gpu = static_cast<GrGLGpu*>(this->getGpu());
34b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    if (NULL == gpu) {
35b85a0aab6905af8b329539b7573a7555b727d5e5cdalton        return;
36b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    }
37b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
38b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    // Make sure the path at this index hasn't been initted already.
395b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    SkDEBUGCODE(
405b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        GrGLboolean isPath;
415b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen        GR_GL_CALL_RET(gpu->glInterface(), isPath, IsPath(fBasePathID + index)));
425b653577994fe298e08e5f7a5c1fa39fe53c9203kkinnunen    SkASSERT(GR_GL_FALSE == isPath);
43b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
44855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    GrGLPath::InitPathObject(gpu, fBasePathID + index, skPath, this->getStroke());
45855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton
46855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    // TODO: Use a better approximation for the individual path sizes.
47855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton    fGpuMemorySize += 100;
48b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
49b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
50b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonvoid GrGLPathRange::onRelease() {
5149f085dddff10473b6ebf832a974288300224e60bsalomon    SkASSERT(this->getGpu());
52b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
53b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    if (0 != fBasePathID && !this->isWrapped()) {
54861e1037017bbb7ac52ec5ebecab3a636a82a3e8bsalomon        static_cast<GrGLGpu*>(this->getGpu())->glPathRendering()->deletePaths(fBasePathID,
55855d83ff79c6c822b2ad653f2f890178ad0f637bcdalton                                                                              this->getNumPaths());
56b85a0aab6905af8b329539b7573a7555b727d5e5cdalton        fBasePathID = 0;
57b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    }
58b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
59b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    INHERITED::onRelease();
60b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
61b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
62b85a0aab6905af8b329539b7573a7555b727d5e5cdaltonvoid GrGLPathRange::onAbandon() {
63b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    fBasePathID = 0;
64b85a0aab6905af8b329539b7573a7555b727d5e5cdalton
65b85a0aab6905af8b329539b7573a7555b727d5e5cdalton    INHERITED::onAbandon();
66b85a0aab6905af8b329539b7573a7555b727d5e5cdalton}
67