Skip to content

Commit 8928181

Browse files
committed
Use texture layers for render target allocations, remove render phases.
Instead of splitting the scene into multiple phases, use texture layers to allocate slices as needed for each pass of the render frame. These are pooled and only allocated when the frame render target configuration changes. Previously, the code asserted if it was unable to fit the render tasks into a single render target for a single tile. Now, this (pathological) case is handled correctly. This makes the upcoming dynamic primitive cache support a lot simpler to add. It also means that we don't use a ping-pong allocation style, which typically performs badly on mobile / tiled rendering architectures.
1 parent f13e95b commit 8928181

16 files changed

+371
-318
lines changed

webrender/res/prim_shared.glsl

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434

3535
#define MAX_STOPS_PER_ANGLE_GRADIENT 8
3636

37+
uniform sampler2DArray sCache;
38+
3739
#ifdef WR_VERTEX_SHADER
3840

3941
#define VECS_PER_LAYER 13
@@ -121,7 +123,7 @@ Layer fetch_layer(int index) {
121123

122124
struct Tile {
123125
vec4 screen_origin_task_origin;
124-
vec4 size;
126+
vec4 size_target_index;
125127
};
126128

127129
Tile fetch_tile(int index) {
@@ -130,7 +132,7 @@ Tile fetch_tile(int index) {
130132
ivec2 uv = get_fetch_uv(index, VECS_PER_TILE);
131133

132134
tile.screen_origin_task_origin = texelFetchOffset(sRenderTasks, uv, 0, ivec2(0, 0));
133-
tile.size = texelFetchOffset(sRenderTasks, uv, 0, ivec2(1, 0));
135+
tile.size_target_index = texelFetchOffset(sRenderTasks, uv, 0, ivec2(1, 0));
134136

135137
return tile;
136138
}
@@ -425,7 +427,7 @@ VertexInfo write_vertex(vec4 instance_rect,
425427

426428
vec2 clamped_pos = clamp(device_pos,
427429
vec2(tile.screen_origin_task_origin.xy),
428-
vec2(tile.screen_origin_task_origin.xy + tile.size.xy));
430+
vec2(tile.screen_origin_task_origin.xy + tile.size_target_index.xy));
429431

430432
vec4 local_clamped_pos = layer.inv_transform * vec4(clamped_pos / uDevicePixelRatio, world_pos.z, 1);
431433
local_clamped_pos.xyz /= local_clamped_pos.w;
@@ -479,11 +481,11 @@ TransformVertexInfo write_transform_vertex(vec4 instance_rect,
479481

480482
vec2 min_pos_clamped = clamp(min_pos * uDevicePixelRatio,
481483
vec2(tile.screen_origin_task_origin.xy),
482-
vec2(tile.screen_origin_task_origin.xy + tile.size.xy));
484+
vec2(tile.screen_origin_task_origin.xy + tile.size_target_index.xy));
483485

484486
vec2 max_pos_clamped = clamp(max_pos * uDevicePixelRatio,
485487
vec2(tile.screen_origin_task_origin.xy),
486-
vec2(tile.screen_origin_task_origin.xy + tile.size.xy));
488+
vec2(tile.screen_origin_task_origin.xy + tile.size_target_index.xy));
487489

488490
vec2 clamped_pos = mix(min_pos_clamped,
489491
max_pos_clamped,

webrender/res/ps_blend.fs.glsl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5-
uniform sampler2D sCache;
6-
75
vec3 rgbToHsv(vec3 c) {
86
float value = max(max(c.r, c.g), c.b);
97

webrender/res/ps_blend.glsl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5-
varying vec2 vUv;
5+
varying vec3 vUv;
66
flat varying float vAmount;
77
flat varying int vOp;

webrender/res/ps_blend.vs.glsl

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,13 @@ void main(void) {
1313
src.screen_origin_task_origin.xy;
1414

1515
vec2 local_pos = mix(dest_origin,
16-
dest_origin + src.size.xy,
16+
dest_origin + src.size_target_index.xy,
1717
aPosition.xy);
1818

19-
vec2 st0 = vec2(src.screen_origin_task_origin.zw) / 2048.0;
20-
vec2 st1 = vec2(src.screen_origin_task_origin.zw + src.size.xy) / 2048.0;
21-
vUv = mix(st0, st1, aPosition.xy);
19+
vec2 texture_size = vec2(textureSize(sCache, 0));
20+
vec2 st0 = src.screen_origin_task_origin.zw / texture_size;
21+
vec2 st1 = (src.screen_origin_task_origin.zw + src.size_target_index.xy) / texture_size;
22+
vUv = vec3(mix(st0, st1, aPosition.xy), src.size_target_index.z);
2223

2324
vOp = blend.src_id_target_id_op_amount.z;
2425
vAmount = blend.src_id_target_id_op_amount.w / 65535.0;

webrender/res/ps_composite.fs.glsl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
* License, v. 2.0. If a copy of the MPL was not distributed with this
55
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
66

7-
uniform sampler2D sCache;
8-
97
float gauss(float x, float sigma) {
108
if (sigma == 0.0)
119
return 1.0;

webrender/res/ps_composite.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* License, v. 2.0. If a copy of the MPL was not distributed with this
33
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
44

5-
varying vec2 vUv0;
6-
varying vec2 vUv1;
5+
varying vec3 vUv0;
6+
varying vec3 vUv1;
77
flat varying vec4 vUv1Rect;
88
flat varying int vOp;

webrender/res/ps_composite.vs.glsl

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,21 @@ void main(void) {
1010
Tile dest = fetch_tile(composite.src0_src1_target_id_op.z);
1111

1212
vec2 local_pos = mix(dest.screen_origin_task_origin.zw,
13-
dest.screen_origin_task_origin.zw + dest.size.xy,
13+
dest.screen_origin_task_origin.zw + dest.size_target_index.xy,
1414
aPosition.xy);
1515

16-
vec2 st0 = vec2(src0.screen_origin_task_origin.zw) / 2048.0;
17-
vec2 st1 = vec2(src0.screen_origin_task_origin.zw + src0.size.xy) / 2048.0;
18-
vUv0 = mix(st0, st1, aPosition.xy);
16+
vec2 texture_size = vec2(textureSize(sCache, 0));
17+
vec2 st0 = src0.screen_origin_task_origin.zw / texture_size;
18+
vec2 st1 = (src0.screen_origin_task_origin.zw + src0.size_target_index.xy) / texture_size;
19+
vUv0 = vec3(mix(st0, st1, aPosition.xy), src0.size_target_index.z);
1920

20-
st0 = vec2(src1.screen_origin_task_origin.zw) / 2048.0;
21-
st1 = vec2(src1.screen_origin_task_origin.zw + src1.size.xy) / 2048.0;
21+
st0 = vec2(src1.screen_origin_task_origin.zw) / texture_size;
22+
st1 = vec2(src1.screen_origin_task_origin.zw + src1.size_target_index.xy) / texture_size;
2223
vec2 local_virtual_pos = mix(dest.screen_origin_task_origin.xy,
23-
dest.screen_origin_task_origin.xy + dest.size.xy,
24+
dest.screen_origin_task_origin.xy + dest.size_target_index.xy,
2425
aPosition.xy);
25-
vec2 f = (local_virtual_pos - src1.screen_origin_task_origin.xy) / src1.size.xy;
26-
vUv1 = mix(st0, st1, f);
26+
vec2 f = (local_virtual_pos - src1.screen_origin_task_origin.xy) / src1.size_target_index.xy;
27+
vUv1 = vec3(mix(st0, st1, f), src1.size_target_index.z);
2728
vUv1Rect = vec4(st0, st1);
2829

2930
vOp = composite.src0_src1_target_id_op.w;

webrender/src/debug_render.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
use debug_font_data;
66
use device::{Device, ProgramId, VAOId, TextureId, VertexFormat};
7-
use device::{TextureFilter, VertexUsageHint};
7+
use device::{TextureFilter, VertexUsageHint, TextureTarget};
88
use euclid::{Matrix4D, Point2D, Size2D, Rect};
99
use gleam::gl;
1010
use internal_types::{ORTHO_NEAR_PLANE, ORTHO_FAR_PLANE, TextureSampler};
@@ -36,7 +36,7 @@ impl DebugRenderer {
3636
let line_vao = device.create_vao(VertexFormat::DebugColor, None);
3737
let tri_vao = device.create_vao(VertexFormat::DebugColor, None);
3838

39-
let font_texture_id = device.create_texture_ids(1)[0];
39+
let font_texture_id = device.create_texture_ids(1, TextureTarget::Default)[0];
4040
device.init_texture(font_texture_id,
4141
debug_font_data::BMP_WIDTH,
4242
debug_font_data::BMP_HEIGHT,

0 commit comments

Comments
 (0)