Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit 9335c28

Browse files
Ethan NicholasSkia Commit-Bot
authored andcommitted
added support for sk_Dimensions to SkSL
Bug: skia: Change-Id: I5f6a9941822b7b4a3ad85b22b1bcd31d58320f90 Reviewed-on: https://skia-review.googlesource.com/146640 Reviewed-by: Brian Salomon <bsalomon@google.com> Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
1 parent b85fc3b commit 9335c28

23 files changed

+176
-107
lines changed

src/gpu/gl/GrGLProgram.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,13 @@ void GrGLProgram::setFragmentData(const GrPipeline& pipeline, int* nextTexSample
127127
void GrGLProgram::setRenderTargetState(const GrPrimitiveProcessor& primProc,
128128
const GrRenderTargetProxy* proxy) {
129129
GrRenderTarget* rt = proxy->peekRenderTarget();
130-
// Load the RT height uniform if it is needed to y-flip gl_FragCoord.
131-
if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
132-
fRenderTargetState.fRenderTargetSize.fHeight != rt->height()) {
133-
fProgramDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, SkIntToScalar(rt->height()));
130+
// Load the RT dimension uniform if it is needed
131+
if (fBuiltinUniformHandles.fRTDimensionsUni.isValid() &&
132+
(fRenderTargetState.fRenderTargetSize.fWidth != rt->width() ||
133+
fRenderTargetState.fRenderTargetSize.fHeight != rt->height())) {
134+
fProgramDataManager.set2f(fBuiltinUniformHandles.fRTDimensionsUni,
135+
SkIntToScalar(rt->width()),
136+
SkIntToScalar(rt->height()));
134137
}
135138

136139
// set RT adjustment

src/gpu/gl/builders/GrGLProgramBuilder.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,12 @@ void GrGLProgramBuilder::computeCountsAndStrides(GrGLuint programID,
159159
SkASSERT(fInstanceStride == primProc.debugOnly_instanceStride());
160160
}
161161

162+
void GrGLProgramBuilder::addInputVars(const SkSL::Program::Inputs& inputs) {
163+
if (inputs.fRTDimensions) {
164+
this->addRTDimensionsUniform(SKSL_RTDIMENSIONS_NAME);
165+
}
166+
}
167+
162168
GrGLProgram* GrGLProgramBuilder::finalize() {
163169
TRACE_EVENT0("skia", TRACE_FUNC);
164170

@@ -204,9 +210,7 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
204210
if (GR_GL_GET_ERROR(this->gpu()->glInterface()) == GR_GL_NO_ERROR) {
205211
cached = this->checkLinkStatus(programID);
206212
if (cached) {
207-
if (inputs.fRTHeight) {
208-
this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
209-
}
213+
this->addInputVars(inputs);
210214
this->computeCountsAndStrides(programID, primProc, false);
211215
}
212216
} else {
@@ -231,9 +235,7 @@ GrGLProgram* GrGLProgramBuilder::finalize() {
231235
return nullptr;
232236
}
233237
inputs = fs->fInputs;
234-
if (inputs.fRTHeight) {
235-
this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
236-
}
238+
this->addInputVars(inputs);
237239
if (!this->compileAndAttachShaders(glsl.c_str(), glsl.size(), programID,
238240
GR_GL_FRAGMENT_SHADER, &shadersToDelete, settings,
239241
inputs)) {

src/gpu/gl/builders/GrGLProgramBuilder.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class GrGLProgramBuilder : public GrGLSLProgramBuilder {
4848
GrGLProgramBuilder(GrGLGpu*, const GrPipeline&, const GrPrimitiveProcessor&,
4949
GrProgramDesc*);
5050

51+
void addInputVars(const SkSL::Program::Inputs& inputs);
5152
bool compileAndAttachShaders(const char* glsl,
5253
int length,
5354
GrGLuint programId,

src/gpu/glsl/GrGLSLProgramBuilder.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,12 +371,12 @@ void GrGLSLProgramBuilder::appendUniformDecls(GrShaderFlags visibility, SkString
371371
this->uniformHandler()->appendUniformDecls(visibility, out);
372372
}
373373

374-
void GrGLSLProgramBuilder::addRTHeightUniform(const char* name) {
375-
SkASSERT(!fUniformHandles.fRTHeightUni.isValid());
374+
void GrGLSLProgramBuilder::addRTDimensionsUniform(const char* name) {
375+
SkASSERT(!fUniformHandles.fRTDimensionsUni.isValid());
376376
GrGLSLUniformHandler* uniformHandler = this->uniformHandler();
377-
fUniformHandles.fRTHeightUni =
377+
fUniformHandles.fRTDimensionsUni =
378378
uniformHandler->internalAddUniformArray(kFragment_GrShaderFlag,
379-
kHalf_GrSLType, kDefault_GrSLPrecision,
379+
kFloat2_GrSLType, kDefault_GrSLPrecision,
380380
name, false, 0, nullptr);
381381
}
382382

src/gpu/glsl/GrGLSLProgramBuilder.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,9 @@ class GrGLSLProgramBuilder {
4949
return this->uniformHandler()->samplerSwizzle(handle);
5050
}
5151

52-
// Used to add a uniform for the RenderTarget height (used for frag position) without mangling
53-
// the name of the uniform inside of a stage.
54-
void addRTHeightUniform(const char* name);
52+
// Used to add a uniform for the RenderTarget height (used for sk_Dimensions and sk_FragCoord)
53+
// without mangling the name of the uniform inside of a stage.
54+
void addRTDimensionsUniform(const char* name);
5555

5656
// Generates a name for a variable. The generated string will be name prefixed by the prefix
5757
// char (unless the prefix is '\0'). It also will mangle the name to be stage-specific unless

src/gpu/glsl/GrGLSLUniformHandler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ class GrGLSLProgramBuilder;
2020
// Handles for program uniforms (other than per-effect uniforms)
2121
struct GrGLSLBuiltinUniformHandles {
2222
GrGLSLProgramDataManager::UniformHandle fRTAdjustmentUni;
23-
// We use the render target height to provide a y-down frag coord when specifying
23+
// Render target dimensions, used to implement sk_Dimensions and to calculate sk_FragCoord when
2424
// origin_upper_left is not supported.
25-
GrGLSLProgramDataManager::UniformHandle fRTHeightUni;
25+
GrGLSLProgramDataManager::UniformHandle fRTDimensionsUni;
2626
};
2727

2828
class GrGLSLUniformHandler {

src/gpu/mtl/GrMtlPipelineState.mm

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,11 @@
145145
GrRenderTarget* rt = proxy->peekRenderTarget();
146146

147147
// Load the RT height uniform if it is needed to y-flip gl_FragCoord.
148-
if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
149-
fRenderTargetState.fRenderTargetSize.fHeight != rt->height()) {
150-
fDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, SkIntToScalar(rt->height()));
148+
if (fBuiltinUniformHandles.fRTDimensionsUni.isValid() &&
149+
(fRenderTargetState.fRenderTargetSize.fWidth != rt->width() ||
150+
fRenderTargetState.fRenderTargetSize.fHeight != rt->height())) {
151+
fDataManager.set2f(fBuiltinUniformHandles.fRTDimensionsUni, SkIntToScalar(rt->width()),
152+
SkIntToScalar(rt->height()));
151153
}
152154

153155
// set RT adjustment

src/gpu/mtl/GrMtlPipelineStateBuilder.mm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@
7070
if (shaderLibrary == nil) {
7171
return nil;
7272
}
73-
if (inputs.fRTHeight) {
74-
this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
73+
if (inputs.fRTDimensions) {
74+
this->addRTDimensionsUniform(SKSL_RTDIMENSIONS_NAME);
7575
}
7676
if (inputs.fFlipY) {
7777
desc->setSurfaceOriginKey(GrGLSLFragmentShaderBuilder::KeyForSurfaceOrigin(

src/gpu/vk/GrVkPipelineState.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -350,9 +350,11 @@ void GrVkPipelineState::setRenderTargetState(const GrRenderTargetProxy* proxy) {
350350
GrRenderTarget* rt = proxy->peekRenderTarget();
351351

352352
// Load the RT height uniform if it is needed to y-flip gl_FragCoord.
353-
if (fBuiltinUniformHandles.fRTHeightUni.isValid() &&
354-
fRenderTargetState.fRenderTargetSize.fHeight != rt->height()) {
355-
fDataManager.set1f(fBuiltinUniformHandles.fRTHeightUni, SkIntToScalar(rt->height()));
353+
if (fBuiltinUniformHandles.fRTDimensionsUni.isValid() &&
354+
(fRenderTargetState.fRenderTargetSize.fWidth != rt->width() ||
355+
fRenderTargetState.fRenderTargetSize.fHeight != rt->height())) {
356+
fDataManager.set2f(fBuiltinUniformHandles.fRTDimensionsUni, SkIntToScalar(rt->height()),
357+
SkIntToScalar(rt->width()));
356358
}
357359

358360
// set RT adjustment

src/gpu/vk/GrVkPipelineStateBuilder.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,8 +75,8 @@ bool GrVkPipelineStateBuilder::createVkShaderModule(VkShaderStageFlagBits stage,
7575
if (!result) {
7676
return false;
7777
}
78-
if (inputs.fRTHeight) {
79-
this->addRTHeightUniform(SKSL_RTHEIGHT_NAME);
78+
if (inputs.fRTDimensions) {
79+
this->addRTDimensionsUniform(SKSL_RTDIMENSIONS_NAME);
8080
}
8181
if (inputs.fFlipY) {
8282
desc->setSurfaceOriginKey(GrGLSLFragmentShaderBuilder::KeyForSurfaceOrigin(

0 commit comments

Comments
 (0)