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

Unified Diff: src/gpu/gl/GrGLProgramDesc.cpp

Issue 1846963004: Infer sampler precision from pixel config (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: comments Created 4 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: src/gpu/gl/GrGLProgramDesc.cpp
diff --git a/src/gpu/gl/GrGLProgramDesc.cpp b/src/gpu/gl/GrGLProgramDesc.cpp
index 68020a92d5977accaa513eabb52944a6ffffdec9..dde0a3e619cf8b634784f9634a82d2bb0cd5a731 100644
--- a/src/gpu/gl/GrGLProgramDesc.cpp
+++ b/src/gpu/gl/GrGLProgramDesc.cpp
@@ -17,24 +17,27 @@
#include "glsl/GrGLSLFragmentShaderBuilder.h"
#include "glsl/GrGLSLCaps.h"
-static uint8_t texture_target_key(GrGLenum target) {
- switch (target) {
- case GR_GL_TEXTURE_2D:
- return 0;
- case GR_GL_TEXTURE_EXTERNAL:
- return 1;
- case GR_GL_TEXTURE_RECTANGLE:
- return 2;
- default:
- SkFAIL("Unexpected texture target.");
- return 0;
- }
+static uint8_t sampler_type_key_4_bits(GrSLType samplerType) {
+ static constexpr int kFirstSamplerType = kSampler2D_GrSLType;
+ static constexpr int kLastSamplerType = kSampler2DRect_GrSLType;
+
+ SkASSERT(samplerType >= kFirstSamplerType && samplerType <= kLastSamplerType);
+ return samplerType - kFirstSamplerType;
+
+ GR_STATIC_ASSERT(kLastSamplerType - kFirstSamplerType < (1 << 4));
+}
+
+static uint8_t precision_key_nonzero_2_bits(GrShaderType shaderType, GrSLPrecision precision,
+ const GrShaderCaps& caps) {
+ return 1 + caps.effectiveFloatPrecision(shaderType, precision);
+
+ GR_STATIC_ASSERT(1 + kLast_GrSLPrecision < (1 << 2));
}
static void add_texture_key(GrProcessorKeyBuilder* b, const GrProcessor& proc,
const GrGLSLCaps& caps) {
int numTextures = proc.numTextures();
- // Need two bytes per key (swizzle and target).
+ // Need two bytes per key (swizzle, sampler type, and precision).
int word32Count = (proc.numTextures() + 1) / 2;
if (0 == word32Count) {
return;
@@ -44,7 +47,18 @@ static void add_texture_key(GrProcessorKeyBuilder* b, const GrProcessor& proc,
const GrTextureAccess& access = proc.textureAccess(i);
GrGLTexture* texture = static_cast<GrGLTexture*>(access.getTexture());
k16[i] = SkToU16(caps.configTextureSwizzle(texture->config()).asKey() |
- (texture_target_key(texture->target()) << 8));
+ (sampler_type_key_4_bits(texture->samplerType()) << 8));
+ if (caps.usesPrecisionModifiers()) {
+ GrSLPrecision p = GrPixelConfigPrecision(texture->config());
+ if (access.getVisibility() & kFragment_GrShaderFlag) {
+ k16[i] |= precision_key_nonzero_2_bits(kFragment_GrShaderType, p, caps) << 12;
+ }
+ if (access.getVisibility() & (kVertex_GrShaderFlag | kGeometry_GrShaderFlag)) {
+ SkASSERT(precision_key_nonzero_2_bits(kVertex_GrShaderType, p, caps) ==
+ precision_key_nonzero_2_bits(kGeometry_GrShaderType, p, caps));
+ k16[i] |= precision_key_nonzero_2_bits(kVertex_GrShaderType, p, caps) << 14;
+ }
+ }
}
// zero the last 16 bits if the number of textures is odd.
if (numTextures & 0x1) {

Powered by Google App Engine
This is Rietveld 408576698