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

Commit dd01c63

Browse files
committed
aaron review.
1 parent e1bfaf1 commit dd01c63

File tree

6 files changed

+50
-34
lines changed

6 files changed

+50
-34
lines changed

impeller/entity/contents/filters/gaussian_blur_filter_contents.cc

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include "impeller/entity/texture_downsample.frag.h"
1313
#include "impeller/entity/texture_fill.frag.h"
1414
#include "impeller/entity/texture_fill.vert.h"
15+
#include "impeller/geometry/color.h"
1516
#include "impeller/renderer/render_pass.h"
1617
#include "impeller/renderer/vertex_buffer_builder.h"
1718

@@ -485,7 +486,7 @@ fml::StatusOr<RenderTarget> MakeBlurSubpass(
485486
linear_sampler_descriptor));
486487
GaussianBlurVertexShader::BindFrameInfo(
487488
pass, host_buffer.EmplaceUniform(frame_info));
488-
GaussianBlurFragmentShader::BindBlurInfo(
489+
GaussianBlurFragmentShader::BindKernelSamples(
489490
pass, host_buffer.EmplaceUniform(
490491
LerpHackKernelSamples(GenerateBlurInfo(blur_info))));
491492
return pass.Draw().ok();
@@ -919,13 +920,15 @@ KernelSamples GenerateBlurInfo(BlurParameters parameters) {
919920

920921
// This works by shrinking the kernel size by 2 and relying on lerp to read
921922
// between the samples.
922-
GaussianBlurPipeline::FragmentShader::BlurInfo LerpHackKernelSamples(
923+
GaussianBlurPipeline::FragmentShader::KernelSamples LerpHackKernelSamples(
923924
KernelSamples parameters) {
924-
GaussianBlurPipeline::FragmentShader::BlurInfo result = {};
925+
GaussianBlurPipeline::FragmentShader::KernelSamples result = {};
925926
result.sample_count = ((parameters.sample_count - 1) / 2) + 1;
926927
int32_t middle = result.sample_count / 2;
927928
int32_t j = 0;
928929
FML_DCHECK(result.sample_count <= kGaussianBlurMaxKernelSize);
930+
static_assert(sizeof(result.sample_data) ==
931+
sizeof(std::array<Vector4, kGaussianBlurMaxKernelSize>));
929932

930933
for (int i = 0; i < result.sample_count; i++) {
931934
if (i == middle) {
@@ -939,9 +942,9 @@ GaussianBlurPipeline::FragmentShader::BlurInfo LerpHackKernelSamples(
939942

940943
result.sample_data[i].z = left.coefficient + right.coefficient;
941944

942-
auto uv = (left.uv_offset * left.coefficient +
943-
right.uv_offset * right.coefficient) /
944-
(left.coefficient + right.coefficient);
945+
Point uv = (left.uv_offset * left.coefficient +
946+
right.uv_offset * right.coefficient) /
947+
(left.coefficient + right.coefficient);
945948
result.sample_data[i].x = uv.x;
946949
result.sample_data[i].y = uv.y;
947950
j += 2;

impeller/entity/contents/filters/gaussian_blur_filter_contents.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99
#include "impeller/entity/contents/content_context.h"
1010
#include "impeller/entity/contents/filters/filter_contents.h"
1111
#include "impeller/entity/geometry/geometry.h"
12+
#include "impeller/geometry/color.h"
1213

1314
namespace impeller {
1415

1516
// Comes from gaussian.frag.
1617
static constexpr int32_t kGaussianBlurMaxKernelSize = 50;
1718

19+
static_assert(sizeof(GaussianBlurPipeline::FragmentShader::KernelSamples) ==
20+
sizeof(Vector4) * kGaussianBlurMaxKernelSize + sizeof(Vector4));
21+
1822
struct BlurParameters {
1923
Point blur_uv_offset;
2024
Scalar blur_sigma;
@@ -42,7 +46,7 @@ KernelSamples GenerateBlurInfo(BlurParameters parameters);
4246

4347
/// This will shrink the size of a kernel by roughly half by sampling between
4448
/// samples and relying on linear interpolation between the samples.
45-
GaussianBlurPipeline::FragmentShader::BlurInfo LerpHackKernelSamples(
49+
GaussianBlurPipeline::FragmentShader::KernelSamples LerpHackKernelSamples(
4650
KernelSamples samples);
4751

4852
/// Performs a bidirectional Gaussian blur.

impeller/entity/contents/filters/gaussian_blur_filter_contents_unittests.cc

Lines changed: 28 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "impeller/entity/contents/filters/gaussian_blur_filter_contents.h"
1010
#include "impeller/entity/contents/texture_contents.h"
1111
#include "impeller/entity/entity_playground.h"
12+
#include "impeller/geometry/color.h"
1213
#include "impeller/geometry/geometry_asserts.h"
1314
#include "impeller/renderer/testing/mocks.h"
1415

@@ -51,6 +52,14 @@ fml::StatusOr<float> LowerBoundNewtonianMethod(
5152
return x;
5253
}
5354

55+
Scalar GetCoefficient(const Vector4& vec) {
56+
return vec.z;
57+
}
58+
59+
Vector2 GetUVOffset(const Vector4& vec) {
60+
return vec.xy();
61+
}
62+
5463
fml::StatusOr<Scalar> CalculateSigmaForBlurRadius(
5564
Scalar radius,
5665
const Matrix& effect_transform) {
@@ -508,7 +517,7 @@ TEST(GaussianBlurFilterContentsTest, LerpHackKernelSamplesSimple) {
508517
},
509518
};
510519

511-
GaussianBlurPipeline::FragmentShader::BlurInfo blur_info =
520+
GaussianBlurPipeline::FragmentShader::KernelSamples blur_info =
512521
LerpHackKernelSamples(kernel_samples);
513522
EXPECT_EQ(blur_info.sample_count, 3);
514523

@@ -517,15 +526,15 @@ TEST(GaussianBlurFilterContentsTest, LerpHackKernelSamplesSimple) {
517526
//////////////////////////////////////////////////////////////////////////////
518527
// Check output kernel.
519528

520-
EXPECT_FLOAT_EQ(blur_info.sample_data[0].x, -1.3333333);
521-
EXPECT_FLOAT_EQ(blur_info.sample_data[0].y, 0);
522-
EXPECT_FLOAT_EQ(blur_info.sample_data[0].z, 0.3);
523-
EXPECT_FLOAT_EQ(blur_info.sample_data[1].x, 0);
524-
EXPECT_FLOAT_EQ(blur_info.sample_data[1].y, 0);
525-
EXPECT_FLOAT_EQ(blur_info.sample_data[1].z, 0.4);
526-
EXPECT_FLOAT_EQ(blur_info.sample_data[2].x, 1.3333333);
527-
EXPECT_FLOAT_EQ(blur_info.sample_data[2].y, 0);
528-
EXPECT_FLOAT_EQ(blur_info.sample_data[2].z, 0.3);
529+
EXPECT_POINT_NEAR(GetUVOffset(blur_info.sample_data[0]),
530+
Point(-1.3333333, 0));
531+
EXPECT_FLOAT_EQ(GetCoefficient(blur_info.sample_data[0]), 0.3);
532+
533+
EXPECT_POINT_NEAR(GetUVOffset(blur_info.sample_data[1]), Point(0, 0));
534+
EXPECT_FLOAT_EQ(GetCoefficient(blur_info.sample_data[1]), 0.4);
535+
536+
EXPECT_POINT_NEAR(GetUVOffset(blur_info.sample_data[2]), Point(1.333333, 0));
537+
EXPECT_FLOAT_EQ(GetCoefficient(blur_info.sample_data[2]), 0.3);
529538

530539
//////////////////////////////////////////////////////////////////////////////
531540
// Check output of fast kernel versus original kernel.
@@ -546,11 +555,11 @@ TEST(GaussianBlurFilterContentsTest, LerpHackKernelSamplesSimple) {
546555
}
547556
};
548557
Scalar fast_output =
549-
/*1st*/ lerp(blur_info.sample_data[0].xy(), data[0], data[1]) *
550-
blur_info.sample_data[0].z +
551-
/*2nd*/ data[2] * blur_info.sample_data[1].z +
552-
/*3rd*/ lerp(blur_info.sample_data[2].xy(), data[3], data[4]) *
553-
blur_info.sample_data[2].z;
558+
/*1st*/ lerp(GetUVOffset(blur_info.sample_data[0]), data[0], data[1]) *
559+
GetCoefficient(blur_info.sample_data[0]) +
560+
/*2nd*/ data[2] * GetCoefficient(blur_info.sample_data[1]) +
561+
/*3rd*/ lerp(GetUVOffset(blur_info.sample_data[2]), data[3], data[4]) *
562+
GetCoefficient(blur_info.sample_data[2]);
554563

555564
EXPECT_NEAR(original_output, fast_output, 0.01);
556565
}
@@ -565,7 +574,7 @@ TEST(GaussianBlurFilterContentsTest, LerpHackKernelSamplesComplex) {
565574
.step_size = 1};
566575
KernelSamples kernel_samples = GenerateBlurInfo(parameters);
567576
EXPECT_EQ(kernel_samples.sample_count, 33);
568-
GaussianBlurPipeline::FragmentShader::BlurInfo fast_kernel_samples =
577+
GaussianBlurPipeline::FragmentShader::KernelSamples fast_kernel_samples =
569578
LerpHackKernelSamples(kernel_samples);
570579
EXPECT_EQ(fast_kernel_samples.sample_count, 17);
571580
float data[33];
@@ -602,8 +611,8 @@ TEST(GaussianBlurFilterContentsTest, LerpHackKernelSamplesComplex) {
602611

603612
Scalar fast_output = 0.0;
604613
for (int i = 0; i < fast_kernel_samples.sample_count; i++) {
605-
fast_output += fast_kernel_samples.sample_data[i].z *
606-
sampler(fast_kernel_samples.sample_data[i].xy());
614+
fast_output += GetCoefficient(fast_kernel_samples.sample_data[i]) *
615+
sampler(GetUVOffset(fast_kernel_samples.sample_data[i]));
607616
}
608617

609618
EXPECT_NEAR(output, fast_output, 0.1);
@@ -618,7 +627,7 @@ TEST(GaussianBlurFilterContentsTest, ChopHugeBlurs) {
618627
.blur_radius = blur_radius,
619628
.step_size = 1};
620629
KernelSamples kernel_samples = GenerateBlurInfo(parameters);
621-
GaussianBlurPipeline::FragmentShader::BlurInfo frag_kernel_samples =
630+
GaussianBlurPipeline::FragmentShader::KernelSamples frag_kernel_samples =
622631
LerpHackKernelSamples(kernel_samples);
623632
EXPECT_TRUE(frag_kernel_samples.sample_count <= kGaussianBlurMaxKernelSize);
624633
}

impeller/entity/shaders/filters/gaussian.frag

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,13 @@ uniform f16sampler2D texture_sampler;
1111

1212
layout(constant_id = 0) const float supports_decal = 1.0;
1313

14-
uniform BlurInfo {
14+
uniform KernelSamples {
1515
float sample_count;
1616

1717
// X, Y are uv offset and Z is Coefficient. W is padding.
1818
vec4 sample_data[50];
1919
}
20-
blur_info;
20+
kernel_samples;
2121

2222
f16vec4 Sample(f16sampler2D tex, vec2 coords) {
2323
if (supports_decal == 1.0) {
@@ -33,11 +33,11 @@ out f16vec4 frag_color;
3333
void main() {
3434
f16vec4 total_color = f16vec4(0.0hf);
3535

36-
for (int i = 0; i < int(blur_info.sample_count); i++) {
37-
float16_t coefficient = float16_t(blur_info.sample_data[i].z);
38-
total_color +=
39-
coefficient *
40-
Sample(texture_sampler, v_texture_coords + blur_info.sample_data[i].xy);
36+
for (int i = 0; i < int(kernel_samples.sample_count); i++) {
37+
float16_t coefficient = float16_t(kernel_samples.sample_data[i].z);
38+
total_color += coefficient *
39+
Sample(texture_sampler,
40+
v_texture_coords + kernel_samples.sample_data[i].xy);
4141
}
4242

4343
frag_color = total_color;

impeller/renderer/backend/gles/buffer_bindings_gles.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ bool BufferBindingsGLES::BindUniformBuffer(const ProcTableGLES& gl,
282282
// When binding uniform arrays, the elements must be contiguous. Copy
283283
// the uniforms to a temp buffer to eliminate any padding needed by the
284284
// other backends if the array elements have padding.
285+
std::vector<uint8_t> array_element_buffer_;
285286
if (element_count > 1 && element_stride != member.size) {
286287
array_element_buffer_.resize(member.size * element_count);
287288
for (size_t element_i = 0; element_i < element_count; element_i++) {

impeller/renderer/backend/gles/buffer_bindings_gles.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ class BufferBindingsGLES {
5757
std::vector<VertexAttribPointer> vertex_attrib_arrays_;
5858

5959
std::unordered_map<std::string, GLint> uniform_locations_;
60-
std::vector<uint8_t> array_element_buffer_;
6160

6261
using BindingMap = std::unordered_map<std::string, std::vector<GLint>>;
6362
BindingMap binding_map_ = {};

0 commit comments

Comments
 (0)