Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(557)

Side by Side Diff: src/gpu/gl/GrGpuGL.cpp

Issue 400713003: Add a GrPathRange class (Closed) Base URL: https://skia.googlesource.com/skia.git@clupload-ispath
Patch Set: Fix more windows trivial warningswq Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« src/gpu/GrDrawTarget.h ('K') | « src/gpu/gl/GrGpuGL.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrGpuGL.h" 9 #include "GrGpuGL.h"
10 #include "GrGLNameAllocator.h" 10 #include "GrGLNameAllocator.h"
11 #include "GrGLStencilBuffer.h" 11 #include "GrGLStencilBuffer.h"
12 #include "GrGLPath.h" 12 #include "GrGLPath.h"
13 #include "GrGLPathRange.h"
13 #include "GrGLShaderBuilder.h" 14 #include "GrGLShaderBuilder.h"
14 #include "GrTemplates.h" 15 #include "GrTemplates.h"
15 #include "GrTypes.h" 16 #include "GrTypes.h"
16 #include "SkStrokeRec.h" 17 #include "SkStrokeRec.h"
17 #include "SkTemplates.h" 18 #include "SkTemplates.h"
18 19
19 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X) 20 #define GL_CALL(X) GR_GL_CALL(this->glInterface(), X)
20 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X) 21 #define GL_CALL_RET(RET, X) GR_GL_CALL_RET(this->glInterface(), RET, X)
21 22
22 #define SKIP_CACHE_CHECK true 23 #define SKIP_CACHE_CHECK true
23 24
24 #if GR_GL_CHECK_ALLOC_WITH_GET_ERROR 25 #if GR_GL_CHECK_ALLOC_WITH_GET_ERROR
25 #define CLEAR_ERROR_BEFORE_ALLOC(iface) GrGLClearErr(iface) 26 #define CLEAR_ERROR_BEFORE_ALLOC(iface) GrGLClearErr(iface)
26 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL_NOERRCHECK(iface, call) 27 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL_NOERRCHECK(iface, call)
27 #define CHECK_ALLOC_ERROR(iface) GR_GL_GET_ERROR(iface) 28 #define CHECK_ALLOC_ERROR(iface) GR_GL_GET_ERROR(iface)
28 #else 29 #else
29 #define CLEAR_ERROR_BEFORE_ALLOC(iface) 30 #define CLEAR_ERROR_BEFORE_ALLOC(iface)
30 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL(iface, call) 31 #define GL_ALLOC_CALL(iface, call) GR_GL_CALL(iface, call)
31 #define CHECK_ALLOC_ERROR(iface) GR_GL_NO_ERROR 32 #define CHECK_ALLOC_ERROR(iface) GR_GL_NO_ERROR
32 #endif 33 #endif
33 34
34 35
35 /////////////////////////////////////////////////////////////////////////////// 36 ///////////////////////////////////////////////////////////////////////////////
36 37
38 static const GrGLenum gXformType2GLType[] = {
39 GR_GL_NONE,
40 GR_GL_TRANSLATE_X,
41 GR_GL_TRANSLATE_Y,
42 GR_GL_TRANSLATE_2D,
43 GR_GL_TRANSPOSE_AFFINE_2D
44 };
45
46 GR_STATIC_ASSERT(0 == GrDrawTarget::kNone_PathTransformType);
47 GR_STATIC_ASSERT(1 == GrDrawTarget::kTranslateX_PathTransformType);
48 GR_STATIC_ASSERT(2 == GrDrawTarget::kTranslateY_PathTransformType);
49 GR_STATIC_ASSERT(3 == GrDrawTarget::kTranslate_PathTransformType);
50 GR_STATIC_ASSERT(4 == GrDrawTarget::kAffine_PathTransformType);
51 GR_STATIC_ASSERT(GrDrawTarget::kAffine_PathTransformType == GrDrawTarget::kLast_ PathTransformType);
52
37 static const GrGLenum gXfermodeCoeff2Blend[] = { 53 static const GrGLenum gXfermodeCoeff2Blend[] = {
38 GR_GL_ZERO, 54 GR_GL_ZERO,
39 GR_GL_ONE, 55 GR_GL_ONE,
40 GR_GL_SRC_COLOR, 56 GR_GL_SRC_COLOR,
41 GR_GL_ONE_MINUS_SRC_COLOR, 57 GR_GL_ONE_MINUS_SRC_COLOR,
42 GR_GL_DST_COLOR, 58 GR_GL_DST_COLOR,
43 GR_GL_ONE_MINUS_DST_COLOR, 59 GR_GL_ONE_MINUS_DST_COLOR,
44 GR_GL_SRC_ALPHA, 60 GR_GL_SRC_ALPHA,
45 GR_GL_ONE_MINUS_SRC_ALPHA, 61 GR_GL_ONE_MINUS_SRC_ALPHA,
46 GR_GL_DST_ALPHA, 62 GR_GL_DST_ALPHA,
(...skipping 1315 matching lines...) Expand 10 before | Expand all | Expand 10 after
1362 } 1378 }
1363 return NULL; 1379 return NULL;
1364 } 1380 }
1365 } 1381 }
1366 1382
1367 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) { 1383 GrPath* GrGpuGL::onCreatePath(const SkPath& inPath, const SkStrokeRec& stroke) {
1368 SkASSERT(this->caps()->pathRenderingSupport()); 1384 SkASSERT(this->caps()->pathRenderingSupport());
1369 return SkNEW_ARGS(GrGLPath, (this, inPath, stroke)); 1385 return SkNEW_ARGS(GrGLPath, (this, inPath, stroke));
1370 } 1386 }
1371 1387
1388 GrPathRange* GrGpuGL::onCreatePathRange(size_t size, const SkStrokeRec& stroke) {
1389 SkASSERT(this->caps()->pathRenderingSupport());
1390 return SkNEW_ARGS(GrGLPathRange, (this, size, stroke));
1391 }
1392
1372 void GrGpuGL::flushScissor() { 1393 void GrGpuGL::flushScissor() {
1373 if (fScissorState.fEnabled) { 1394 if (fScissorState.fEnabled) {
1374 // Only access the RT if scissoring is being enabled. We can call this b efore performing 1395 // Only access the RT if scissoring is being enabled. We can call this b efore performing
1375 // a glBitframebuffer for a surface->surface copy, which requires no RT to be bound to the 1396 // a glBitframebuffer for a surface->surface copy, which requires no RT to be bound to the
1376 // GrDrawState. 1397 // GrDrawState.
1377 const GrDrawState& drawState = this->getDrawState(); 1398 const GrDrawState& drawState = this->getDrawState();
1378 const GrGLRenderTarget* rt = 1399 const GrGLRenderTarget* rt =
1379 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget()); 1400 static_cast<const GrGLRenderTarget*>(drawState.getRenderTarget());
1380 1401
1381 SkASSERT(NULL != rt); 1402 SkASSERT(NULL != rt);
(...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after
1900 SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_Scala rHalf; 1921 SkScalar bloat = drawState->getViewMatrix().getMaxScale() * SK_Scala rHalf;
1901 bounds.outset(bloat, bloat); 1922 bounds.outset(bloat, bloat);
1902 } else { 1923 } else {
1903 avmr.setIdentity(drawState); 1924 avmr.setIdentity(drawState);
1904 } 1925 }
1905 1926
1906 this->drawSimpleRect(bounds, NULL); 1927 this->drawSimpleRect(bounds, NULL);
1907 } 1928 }
1908 } 1929 }
1909 1930
1910 void GrGpuGL::onGpuDrawPaths(int pathCount, const GrPath** paths, 1931 void GrGpuGL::onGpuDrawPaths(const GrPathRange* pathRange,
1911 const SkMatrix* transforms, 1932 const uint32_t indices[], int count,
1912 SkPath::FillType fill, 1933 const float transforms[], PathTransformType transfo rmsType,
1913 SkStrokeRec::Style stroke) { 1934 SkPath::FillType fill) {
1914 SkASSERT(this->caps()->pathRenderingSupport()); 1935 SkASSERT(this->caps()->pathRenderingSupport());
1915 SkASSERT(NULL != this->drawState()->getRenderTarget()); 1936 SkASSERT(NULL != this->drawState()->getRenderTarget());
1916 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer()); 1937 SkASSERT(NULL != this->drawState()->getRenderTarget()->getStencilBuffer());
1917 SkASSERT(!fCurrentProgram->hasVertexShader()); 1938 SkASSERT(!fCurrentProgram->hasVertexShader());
1918 SkASSERT(stroke != SkStrokeRec::kHairline_Style);
1919 1939
1920 SkAutoMalloc pathData(pathCount * sizeof(GrGLuint)); 1940 GrGLuint baseID = static_cast<const GrGLPathRange*>(pathRange)->basePathID() ;
1921 SkAutoMalloc transformData(pathCount * sizeof(GrGLfloat) * 6);
1922 GrGLfloat* transformValues =
1923 reinterpret_cast<GrGLfloat*>(transformData.get());
1924 GrGLuint* pathIDs = reinterpret_cast<GrGLuint*>(pathData.get());
1925
1926 for (int i = 0; i < pathCount; ++i) {
1927 SkASSERT(transforms[i].asAffine(NULL));
1928 const SkMatrix& m = transforms[i];
1929 transformValues[i * 6] = m.getScaleX();
1930 transformValues[i * 6 + 1] = m.getSkewY();
1931 transformValues[i * 6 + 2] = m.getSkewX();
1932 transformValues[i * 6 + 3] = m.getScaleY();
1933 transformValues[i * 6 + 4] = m.getTranslateX();
1934 transformValues[i * 6 + 5] = m.getTranslateY();
1935 pathIDs[i] = static_cast<const GrGLPath*>(paths[i])->pathID();
1936 }
1937 1941
1938 flushPathStencilSettings(fill); 1942 flushPathStencilSettings(fill);
1943 const SkStrokeRec& stroke = pathRange->getStroke();
1939 1944
1940 SkPath::FillType nonInvertedFill = 1945 SkPath::FillType nonInvertedFill =
1941 SkPath::ConvertToNonInverseFillType(fill); 1946 SkPath::ConvertToNonInverseFillType(fill);
1942 1947
1943 SkASSERT(!fHWPathStencilSettings.isTwoSided()); 1948 SkASSERT(!fHWPathStencilSettings.isTwoSided());
1944 GrGLenum fillMode = 1949 GrGLenum fillMode =
1945 gr_stencil_op_to_gl_path_rendering_fill_mode( 1950 gr_stencil_op_to_gl_path_rendering_fill_mode(
1946 fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face)); 1951 fHWPathStencilSettings.passOp(GrStencilSettings::kFront_Face));
1947 GrGLint writeMask = 1952 GrGLint writeMask =
1948 fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face); 1953 fHWPathStencilSettings.writeMask(GrStencilSettings::kFront_Face);
1949 1954
1950 bool doFill = stroke == SkStrokeRec::kFill_Style 1955 if (stroke.isFillStyle() || SkStrokeRec::kStrokeAndFill_Style == stroke.getS tyle()) {
1951 || stroke == SkStrokeRec::kStrokeAndFill_Style; 1956 GL_CALL(StencilFillPathInstanced(count, GR_GL_UNSIGNED_INT, indices, bas eID, fillMode,
1952 bool doStroke = stroke == SkStrokeRec::kStroke_Style 1957 writeMask, gXformType2GLType[transforms Type],
1953 || stroke == SkStrokeRec::kStrokeAndFill_Style; 1958 transforms));
1954
1955 if (doFill) {
1956 GL_CALL(StencilFillPathInstanced(pathCount, GR_GL_UNSIGNED_INT,
1957 pathIDs, 0,
1958 fillMode, writeMask,
1959 GR_GL_AFFINE_2D, transformValues));
1960 } 1959 }
1961 if (doStroke) { 1960 if (stroke.needToApply()) {
1962 GL_CALL(StencilStrokePathInstanced(pathCount, GR_GL_UNSIGNED_INT, 1961 GL_CALL(StencilStrokePathInstanced(count, GR_GL_UNSIGNED_INT, indices, b aseID, 0xffff,
1963 pathIDs, 0, 1962 writeMask, gXformType2GLType[transfor msType],
1964 0xffff, writeMask, 1963 transforms));
1965 GR_GL_AFFINE_2D, transformValues));
1966 } 1964 }
1967 1965
1968 if (nonInvertedFill == fill) { 1966 if (nonInvertedFill == fill) {
1969 if (doStroke) { 1967 if (stroke.needToApply()) {
1970 GL_CALL(CoverStrokePathInstanced( 1968 GL_CALL(CoverStrokePathInstanced(
1971 pathCount, GR_GL_UNSIGNED_INT, pathIDs, 0, 1969 count, GR_GL_UNSIGNED_INT, indices, baseID,
1972 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, 1970 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
1973 GR_GL_AFFINE_2D, transformValues)); 1971 gXformType2GLType[transformsType], transforms));
1974 } else { 1972 } else {
1975 GL_CALL(CoverFillPathInstanced( 1973 GL_CALL(CoverFillPathInstanced(
1976 pathCount, GR_GL_UNSIGNED_INT, pathIDs, 0, 1974 count, GR_GL_UNSIGNED_INT, indices, baseID,
1977 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES, 1975 GR_GL_BOUNDING_BOX_OF_BOUNDING_BOXES,
1978 GR_GL_AFFINE_2D, transformValues)); 1976 gXformType2GLType[transformsType], transforms));
1979
1980 } 1977 }
1981 } else { 1978 } else {
1982 GrDrawState* drawState = this->drawState(); 1979 GrDrawState* drawState = this->drawState();
1983 GrDrawState::AutoViewMatrixRestore avmr; 1980 GrDrawState::AutoViewMatrixRestore avmr;
1984 SkRect bounds = SkRect::MakeLTRB(0, 0, 1981 SkRect bounds = SkRect::MakeLTRB(0, 0,
1985 SkIntToScalar(drawState->getRenderTarge t()->width()), 1982 SkIntToScalar(drawState->getRenderTarge t()->width()),
1986 SkIntToScalar(drawState->getRenderTarge t()->height())); 1983 SkIntToScalar(drawState->getRenderTarge t()->height()));
1987 SkMatrix vmi; 1984 SkMatrix vmi;
1988 // mapRect through persp matrix may not be correct 1985 // mapRect through persp matrix may not be correct
1989 if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewIn verse(&vmi)) { 1986 if (!drawState->getViewMatrix().hasPerspective() && drawState->getViewIn verse(&vmi)) {
(...skipping 1046 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 this->setVertexArrayID(gpu, 0); 3033 this->setVertexArrayID(gpu, 0);
3037 } 3034 }
3038 int attrCount = gpu->glCaps().maxVertexAttributes(); 3035 int attrCount = gpu->glCaps().maxVertexAttributes();
3039 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3036 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3040 fDefaultVertexArrayAttribState.resize(attrCount); 3037 fDefaultVertexArrayAttribState.resize(attrCount);
3041 } 3038 }
3042 attribState = &fDefaultVertexArrayAttribState; 3039 attribState = &fDefaultVertexArrayAttribState;
3043 } 3040 }
3044 return attribState; 3041 return attribState;
3045 } 3042 }
OLDNEW
« src/gpu/GrDrawTarget.h ('K') | « src/gpu/gl/GrGpuGL.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698