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

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

Issue 1232103002: Enable stencil clipping in mixed sampled render targets (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Predefined sample locations, glcaps, render target priv Created 5 years, 3 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
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 "GrGLGpu.h" 9 #include "GrGLGpu.h"
10 #include "GrGLGLSL.h" 10 #include "GrGLGLSL.h"
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
150 150
151 GR_STATIC_ASSERT(14 == kS2C_GrBlendCoeff); 151 GR_STATIC_ASSERT(14 == kS2C_GrBlendCoeff);
152 GR_STATIC_ASSERT(15 == kIS2C_GrBlendCoeff); 152 GR_STATIC_ASSERT(15 == kIS2C_GrBlendCoeff);
153 GR_STATIC_ASSERT(16 == kS2A_GrBlendCoeff); 153 GR_STATIC_ASSERT(16 == kS2A_GrBlendCoeff);
154 GR_STATIC_ASSERT(17 == kIS2A_GrBlendCoeff); 154 GR_STATIC_ASSERT(17 == kIS2A_GrBlendCoeff);
155 155
156 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope 156 // assertion for gXfermodeCoeff2Blend have to be in GrGpu scope
157 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gXfermodeCoeff2Blend)); 157 GR_STATIC_ASSERT(kGrBlendCoeffCnt == SK_ARRAY_COUNT(gXfermodeCoeff2Blend));
158 } 158 }
159 159
160 // Sample locations that are colocated at pixel center.
161 static const GrGLfloat gCenteredSampleLocations[2*16] = { 0.5f, 0.5f, 0.5f, 0.5f , 0.5f, 0.5f, 0.5f, 0.5f,
162 0.5f, 0.5f, 0.5f, 0.5f , 0.5f, 0.5f, 0.5f, 0.5f,
163 0.5f, 0.5f, 0.5f, 0.5f , 0.5f, 0.5f, 0.5f, 0.5f,
164 0.5f, 0.5f, 0.5f, 0.5f , 0.5f, 0.5f, 0.5f, 0.5f };
165
166 // Default sample pattern.
167 static GrGLfloat defaultSampleLocations2x[] = { 0.75f, 0.75f, 0.25f, 0.25f };
168 static GrGLfloat defaultSampleLocations4x[] = { 0.375f, 0.125f, 0.875f, 0.375f, 0.125f, 0.625f, 0.625f, 0.875f };
169 static GrGLfloat defaultSampleLocations8x[] = { 0.5625f, 0.3125f, 0.4375f, 0.68 75f, 0.8125f, 0.5625f, 0.3125f, 0.1875f,
170 0.1875f, 0.8125f, 0.0625f, 0.43 75f, 0.6875f, 0.9375f, 0.9375f, 0.0625f };
171 static GrGLfloat defaultSampleLocations16x[] = { 0.5625f, 0.5625f, 0.4375f, 0.31 25f, 0.3125f, 0.625f, 0.75f, 0.4375f,
172 0.1875f, 0.375f, 0.625f, 0.8125 f, 0.8125f, 0.6875f, 0.6875f, 0.1875f,
173 0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f,
174 0.375f, 0.875f, 0.5f, 0.0625f, 0.25f, 0.125f, 0.125f, 0.75f,
175 0.0f, 0.5f, 0.9375f, 0.25f, 0.8 75f, 0.9375f, 0.0625f, 0.0f };
176 // Lookup table for sample locations array for sample count 0..16.
177 static GrGLfloat* gDefaultSampleLocations[17] = { 0,
178 0, defaultSampleLocations2x, 0 , defaultSampleLocations4x,
179 0, 0, 0, defaultSampleLocation s8x,
180 0, 0, 0, 0,
181 0, 0, 0, defaultSampleLocation s16x };
182
160 /////////////////////////////////////////////////////////////////////////////// 183 ///////////////////////////////////////////////////////////////////////////////
161 184
162 // Used in the map of pixel configs to stencil format indices. This value is use d to 185 // Used in the map of pixel configs to stencil format indices. This value is use d to
163 // indicate that a stencil format has not yet been set for the given config. 186 // indicate that a stencil format has not yet been set for the given config.
164 static const int kUnknownStencilIndex = -1; 187 static const int kUnknownStencilIndex = -1;
165 // This value is used as the stencil index when no stencil configs are supported with the 188 // This value is used as the stencil index when no stencil configs are supported with the
166 // given pixel config. 189 // given pixel config.
167 static const int kUnsupportedStencilIndex = -2; 190 static const int kUnsupportedStencilIndex = -2;
168 191
169 /////////////////////////////////////////////////////////////////////////////// 192 ///////////////////////////////////////////////////////////////////////////////
(...skipping 1300 matching lines...) Expand 10 before | Expand all | Expand 10 after
1470 1493
1471 int numTextureAccesses = textureAccesses.count(); 1494 int numTextureAccesses = textureAccesses.count();
1472 for (int i = 0; i < numTextureAccesses; i++) { 1495 for (int i = 0; i < numTextureAccesses; i++) {
1473 this->bindTexture(i, textureAccesses[i]->getParams(), 1496 this->bindTexture(i, textureAccesses[i]->getParams(),
1474 static_cast<GrGLTexture*>(textureAccesses[i]->getTextu re())); 1497 static_cast<GrGLTexture*>(textureAccesses[i]->getTextu re()));
1475 } 1498 }
1476 1499
1477 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa rget()); 1500 GrGLRenderTarget* glRT = static_cast<GrGLRenderTarget*>(pipeline.getRenderTa rget());
1478 this->flushStencil(pipeline.getStencil()); 1501 this->flushStencil(pipeline.getStencil());
1479 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or igin()); 1502 this->flushScissor(pipeline.getScissorState(), glRT->getViewport(), glRT->or igin());
1480 this->flushHWAAState(glRT, pipeline.isHWAntialiasState()); 1503 this->flushHWAAState(glRT, pipeline.isHWAntialiasState(), !pipeline.getStenc il().isDisabled());
1481 1504
1482 // This must come after textures are flushed because a texture may need 1505 // This must come after textures are flushed because a texture may need
1483 // to be msaa-resolved (which will modify bound FBO state). 1506 // to be msaa-resolved (which will modify bound FBO state).
1484 this->flushRenderTarget(glRT, nullptr); 1507 this->flushRenderTarget(glRT, nullptr);
1485 1508
1486 return true; 1509 return true;
1487 } 1510 }
1488 1511
1489 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc, 1512 void GrGLGpu::setupGeometry(const GrPrimitiveProcessor& primProc,
1490 const GrNonInstancedVertices& vertices, 1513 const GrNonInstancedVertices& vertices,
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 if (!flipY) { 1916 if (!flipY) {
1894 dst += rowBytes; 1917 dst += rowBytes;
1895 } else { 1918 } else {
1896 dst -= rowBytes; 1919 dst -= rowBytes;
1897 } 1920 }
1898 } 1921 }
1899 } 1922 }
1900 return true; 1923 return true;
1901 } 1924 }
1902 1925
1926 void GrGLGpu::setCenteredSampleLocations(GrRenderTarget* rt, bool useCenteredSam pleLocations) {
1927 GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt->asRenderTarget ());
1928 SkASSERT(0 != target->renderFBOID());
1929
1930 if (0 == rt->numRasterSamples() ||
1931 useCenteredSampleLocations == rt->renderTargetPriv().usesCenteredSampleL ocations()) {
1932 return;
1933 }
1934
1935 if (!rt->renderTargetPriv().programmableSampleLocationsEnabled()) {
1936 GL_CALL(NamedFramebufferParameteri(target->renderFBOID(),
1937 GR_GL_FRAMEBUFFER_PROGRAMMABLE_SAMPLE _LOCATIONS, true));
1938 rt->renderTargetPriv().setProgrammableSampleLocationsEnabled(true);
1939 }
1940
1941 SkASSERT(rt->numRasterSamples() == 2 ||
1942 rt->numRasterSamples() == 4 ||
1943 rt->numRasterSamples() == 8 ||
1944 rt->numRasterSamples() == 16);
1945
1946 const GrGLfloat *sampleLocations =
1947 useCenteredSampleLocations ? gCenteredSampleLocations
1948 : gDefaultSampleLocations[rt->numRasterSample s()];
1949 GL_CALL(NamedFramebufferSampleLocationsfv(target->renderFBOID(), 0, rt->numR asterSamples(), sampleLocations));
1950 rt->renderTargetPriv().flagAsUsingCenteredSampleLocations(useCenteredSampleL ocations);
1951 }
1952
1903 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound) { 1953 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound) {
1904 1954
1905 SkASSERT(target); 1955 SkASSERT(target);
1906 1956
1907 uint32_t rtID = target->getUniqueID(); 1957 uint32_t rtID = target->getUniqueID();
1908 if (fHWBoundRenderTargetUniqueID != rtID) { 1958 if (fHWBoundRenderTargetUniqueID != rtID) {
1909 fStats.incRenderTargetBinds(); 1959 fStats.incRenderTargetBinds();
1910 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID())); 1960 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID()));
1911 #ifdef SK_DEBUG 1961 #ifdef SK_DEBUG
1912 // don't do this check in Chromium -- this is causing 1962 // don't do this check in Chromium -- this is causing
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
2140 set_gl_stencil(this->glInterface(), 2190 set_gl_stencil(this->glInterface(),
2141 stencilSettings, 2191 stencilSettings,
2142 GR_GL_FRONT_AND_BACK, 2192 GR_GL_FRONT_AND_BACK,
2143 GrStencilSettings::kFront_Face); 2193 GrStencilSettings::kFront_Face);
2144 } 2194 }
2145 } 2195 }
2146 fHWStencilSettings = stencilSettings; 2196 fHWStencilSettings = stencilSettings;
2147 } 2197 }
2148 } 2198 }
2149 2199
2150 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) { 2200 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA, bool stencilEnabl ed) {
2151 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled()); 2201 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled());
2152 2202
2203 if (rt->hasMixedSamples() && stencilEnabled &&
2204 this->glCaps().glslCaps()->programmableSampleLocationsSupport()) {
2205 if (useHWAA) {
2206 setCenteredSampleLocations(rt, false);
2207 } else {
2208 setCenteredSampleLocations(rt, true);
2209 }
2210 useHWAA = true;
2211 }
2212
2153 if (this->glCaps().multisampleDisableSupport()) { 2213 if (this->glCaps().multisampleDisableSupport()) {
2154 if (useHWAA) { 2214 if (useHWAA) {
2155 if (kYes_TriState != fMSAAEnabled) { 2215 if (kYes_TriState != fMSAAEnabled) {
2156 GL_CALL(Enable(GR_GL_MULTISAMPLE)); 2216 GL_CALL(Enable(GR_GL_MULTISAMPLE));
2157 fMSAAEnabled = kYes_TriState; 2217 fMSAAEnabled = kYes_TriState;
2158 } 2218 }
2159 } else { 2219 } else {
2160 if (kNo_TriState != fMSAAEnabled) { 2220 if (kNo_TriState != fMSAAEnabled) {
2161 GL_CALL(Disable(GR_GL_MULTISAMPLE)); 2221 GL_CALL(Disable(GR_GL_MULTISAMPLE));
2162 fMSAAEnabled = kNo_TriState; 2222 fMSAAEnabled = kNo_TriState;
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
2925 GL_CALL(Uniform4f(fCopyProgram.fPosXformUniform, dx1 - dx0, dy1 - dy0, dx0, dy0)); 2985 GL_CALL(Uniform4f(fCopyProgram.fPosXformUniform, dx1 - dx0, dy1 - dy0, dx0, dy0));
2926 GL_CALL(Uniform4f(fCopyProgram.fTexCoordXformUniform, sx1 - sx0, sy1 - sy0, sx0, sy0)); 2986 GL_CALL(Uniform4f(fCopyProgram.fTexCoordXformUniform, sx1 - sx0, sy1 - sy0, sx0, sy0));
2927 GL_CALL(Uniform1i(fCopyProgram.fTextureUniform, 0)); 2987 GL_CALL(Uniform1i(fCopyProgram.fTextureUniform, 0));
2928 2988
2929 GrXferProcessor::BlendInfo blendInfo; 2989 GrXferProcessor::BlendInfo blendInfo;
2930 blendInfo.reset(); 2990 blendInfo.reset();
2931 this->flushBlend(blendInfo); 2991 this->flushBlend(blendInfo);
2932 this->flushColorWrite(true); 2992 this->flushColorWrite(true);
2933 this->flushDither(false); 2993 this->flushDither(false);
2934 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace); 2994 this->flushDrawFace(GrPipelineBuilder::kBoth_DrawFace);
2935 this->flushHWAAState(dstRT, false); 2995 this->flushHWAAState(dstRT, false, false);
2936 this->disableScissor(); 2996 this->disableScissor();
2937 GrStencilSettings stencil; 2997 GrStencilSettings stencil;
2938 stencil.setDisabled(); 2998 stencil.setDisabled();
2939 this->flushStencil(stencil); 2999 this->flushStencil(stencil);
2940 3000
2941 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4)); 3001 GL_CALL(DrawArrays(GR_GL_TRIANGLE_STRIP, 0, 4));
2942 } 3002 }
2943 3003
2944 void GrGLGpu::copySurfaceAsCopyTexSubImage(GrSurface* dst, 3004 void GrGLGpu::copySurfaceAsCopyTexSubImage(GrSurface* dst,
2945 GrSurface* src, 3005 GrSurface* src,
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
3160 this->setVertexArrayID(gpu, 0); 3220 this->setVertexArrayID(gpu, 0);
3161 } 3221 }
3162 int attrCount = gpu->glCaps().maxVertexAttributes(); 3222 int attrCount = gpu->glCaps().maxVertexAttributes();
3163 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3223 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3164 fDefaultVertexArrayAttribState.resize(attrCount); 3224 fDefaultVertexArrayAttribState.resize(attrCount);
3165 } 3225 }
3166 attribState = &fDefaultVertexArrayAttribState; 3226 attribState = &fDefaultVertexArrayAttribState;
3167 } 3227 }
3168 return attribState; 3228 return attribState;
3169 } 3229 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698