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

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: 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
Mark Kilgard 2015/09/21 17:03:50 for the sake of documentation, I recommend 2*16 in
161 static const GrGLfloat gCenteredSampleLocations[32] = { 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
162 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
163 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5,
164 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5 };
165
160 /////////////////////////////////////////////////////////////////////////////// 166 ///////////////////////////////////////////////////////////////////////////////
161 167
162 // Used in the map of pixel configs to stencil format indices. This value is use d to 168 // 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. 169 // indicate that a stencil format has not yet been set for the given config.
164 static const int kUnknownStencilIndex = -1; 170 static const int kUnknownStencilIndex = -1;
165 // This value is used as the stencil index when no stencil configs are supported with the 171 // This value is used as the stencil index when no stencil configs are supported with the
166 // given pixel config. 172 // given pixel config.
167 static const int kUnsupportedStencilIndex = -2; 173 static const int kUnsupportedStencilIndex = -2;
168 174
169 /////////////////////////////////////////////////////////////////////////////// 175 ///////////////////////////////////////////////////////////////////////////////
(...skipping 1723 matching lines...) Expand 10 before | Expand all | Expand 10 after
1893 if (!flipY) { 1899 if (!flipY) {
1894 dst += rowBytes; 1900 dst += rowBytes;
1895 } else { 1901 } else {
1896 dst -= rowBytes; 1902 dst -= rowBytes;
1897 } 1903 }
1898 } 1904 }
1899 } 1905 }
1900 return true; 1906 return true;
1901 } 1907 }
1902 1908
1909 void GrGLGpu::setProgrammableSampleLocations(GrRenderTarget* rt, bool useSampleL ocations) {
1910 if (0 == rt->numRasterSamples())
1911 return;
Chris Dalton 2015/09/22 08:35:24 Skia style uses braces for one line if's.
1912
1913 GrGLRenderTarget* target = static_cast<GrGLRenderTarget*>(rt->asRenderTarget ());
1914 SkASSERT(0 != target->renderFBOID());
1915
1916 if (useSampleLocations == target->usesProgrammableSampleLocations())
1917 return;
1918
1919 if (GrGLRenderTarget::kProgrammable_SampleLocationsConfig != target->sampleL ocationsConfig()) {
1920 uint32_t rtID = target->getUniqueID();
Mark Kilgard 2015/09/21 17:03:51 is it worth considering using glNamedFramebufferPa
1921 if (fHWBoundRenderTargetUniqueID != rtID) {
1922 fStats.incRenderTargetBinds();
1923 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID()));
1924 fHWBoundRenderTargetUniqueID = SK_InvalidUniqueID;
1925 }
1926
1927 GL_CALL(FramebufferParameteri(GR_GL_FRAMEBUFFER, GR_GL_FRAMEBUFFER_PROGR AMMABLE_SAMPLE_LOCATIONS, true));
1928 target->setSampleLocationsConfig(GrGLRenderTarget::kProgrammable_SampleL ocationsConfig);
1929
1930 float defaultSampleLocations[32];
Mark Kilgard 2015/09/21 17:03:50 worth adding assert(rt->numRasterSamples()*2 == S
1931 for (int i = 0; i < rt->numRasterSamples(); i++) {
1932 GL_CALL(GetMultisamplefv(GR_GL_SAMPLE_LOCATION_NV, i, &defaultSample Locations[i*2]));
Mark Kilgard 2015/09/21 17:03:51 calling a glGetMultisamplefv here many times (as m
1933 }
1934 target->setDefaultSampleLocations(rt->numRasterSamples(), defaultSampleL ocations);
Chris Dalton 2015/09/22 08:35:24 We ought to set this up so it only queries the def
1935 }
1936
1937 GL_CALL(NamedFramebufferSampleLocationsfv(target->renderFBOID(), 0, rt->numR asterSamples(),
1938 useSampleLocations ? gCenteredSamp leLocations
1939 : target->defau ltSampleLocations()));
1940 target->flagAsUsingProgrammableSampleLocations(useSampleLocations);
1941 }
1942
1903 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound) { 1943 void GrGLGpu::flushRenderTarget(GrGLRenderTarget* target, const SkIRect* bound) {
1904 1944
1905 SkASSERT(target); 1945 SkASSERT(target);
1906 1946
1907 uint32_t rtID = target->getUniqueID(); 1947 uint32_t rtID = target->getUniqueID();
1908 if (fHWBoundRenderTargetUniqueID != rtID) { 1948 if (fHWBoundRenderTargetUniqueID != rtID) {
1909 fStats.incRenderTargetBinds(); 1949 fStats.incRenderTargetBinds();
1910 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID())); 1950 GL_CALL(BindFramebuffer(GR_GL_FRAMEBUFFER, target->renderFBOID()));
1911 #ifdef SK_DEBUG 1951 #ifdef SK_DEBUG
1912 // don't do this check in Chromium -- this is causing 1952 // don't do this check in Chromium -- this is causing
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after
2143 GrStencilSettings::kFront_Face); 2183 GrStencilSettings::kFront_Face);
2144 } 2184 }
2145 } 2185 }
2146 fHWStencilSettings = stencilSettings; 2186 fHWStencilSettings = stencilSettings;
2147 } 2187 }
2148 } 2188 }
2149 2189
2150 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) { 2190 void GrGLGpu::flushHWAAState(GrRenderTarget* rt, bool useHWAA) {
2151 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled()); 2191 SkASSERT(!useHWAA || rt->isStencilBufferMultisampled());
2152 2192
2193 if (rt->hasMixedSamples()) {
2194 if (useHWAA) {
2195 setProgrammableSampleLocations(rt, false);
2196 } else {
2197 setProgrammableSampleLocations(rt, true);
2198 }
2199 useHWAA = true;
Chris Dalton 2015/09/22 08:35:24 I still think it's desirable to disable multisampl
2200 }
2201
2153 if (this->glCaps().multisampleDisableSupport()) { 2202 if (this->glCaps().multisampleDisableSupport()) {
2154 if (useHWAA) { 2203 if (useHWAA) {
2155 if (kYes_TriState != fMSAAEnabled) { 2204 if (kYes_TriState != fMSAAEnabled) {
2156 GL_CALL(Enable(GR_GL_MULTISAMPLE)); 2205 GL_CALL(Enable(GR_GL_MULTISAMPLE));
2157 fMSAAEnabled = kYes_TriState; 2206 fMSAAEnabled = kYes_TriState;
2158 } 2207 }
2159 } else { 2208 } else {
2160 if (kNo_TriState != fMSAAEnabled) { 2209 if (kNo_TriState != fMSAAEnabled) {
2161 GL_CALL(Disable(GR_GL_MULTISAMPLE)); 2210 GL_CALL(Disable(GR_GL_MULTISAMPLE));
2162 fMSAAEnabled = kNo_TriState; 2211 fMSAAEnabled = kNo_TriState;
(...skipping 997 matching lines...) Expand 10 before | Expand all | Expand 10 after
3160 this->setVertexArrayID(gpu, 0); 3209 this->setVertexArrayID(gpu, 0);
3161 } 3210 }
3162 int attrCount = gpu->glCaps().maxVertexAttributes(); 3211 int attrCount = gpu->glCaps().maxVertexAttributes();
3163 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3212 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3164 fDefaultVertexArrayAttribState.resize(attrCount); 3213 fDefaultVertexArrayAttribState.resize(attrCount);
3165 } 3214 }
3166 attribState = &fDefaultVertexArrayAttribState; 3215 attribState = &fDefaultVertexArrayAttribState;
3167 } 3216 }
3168 return attribState; 3217 return attribState;
3169 } 3218 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698