From 4864a7fe0fcf59b2885e0d189b80a2a17207e41f Mon Sep 17 00:00:00 2001 From: Tatsuyuki Ishi Date: Tue, 23 Mar 2021 20:54:49 +0900 Subject: [PATCH] Create chunks over the x axis in addition to y axis This allows more coalescing with image loads/stores, since all of our images are stored with a tiled layout. --- piet-gpu/shader/kernel4.comp | 31 ++++++++++++++++++++----------- piet-gpu/shader/kernel4.spv | Bin 38328 -> 38764 bytes 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/piet-gpu/shader/kernel4.comp b/piet-gpu/shader/kernel4.comp index b9f59dc..deb2fb8 100644 --- a/piet-gpu/shader/kernel4.comp +++ b/piet-gpu/shader/kernel4.comp @@ -13,9 +13,12 @@ #include "mem.h" #include "setup.h" -#define CHUNK 8 -#define CHUNK_DY (TILE_HEIGHT_PX / CHUNK) -layout(local_size_x = TILE_WIDTH_PX, local_size_y = CHUNK_DY) in; +#define CHUNK_X 2 +#define CHUNK_Y 4 +#define CHUNK CHUNK_X * CHUNK_Y +#define CHUNK_DX (TILE_WIDTH_PX / CHUNK_X) +#define CHUNK_DY (TILE_HEIGHT_PX / CHUNK_Y) +layout(local_size_x = CHUNK_DX, local_size_y = CHUNK_DY) in; layout(set = 0, binding = 1) readonly buffer ConfigBuf { Config conf; @@ -84,10 +87,14 @@ uint packsRGB(vec4 rgba) { return packUnorm4x8(rgba.wzyx); } +uvec2 chunk_offset(uint i) { + return uvec2(i % CHUNK_X * CHUNK_DX, i / CHUNK_X * CHUNK_DY); +} + vec4[CHUNK] fillImage(uvec2 xy, CmdImage cmd_img) { vec4 rgba[CHUNK]; for (uint i = 0; i < CHUNK; i++) { - ivec2 uv = ivec2(xy.x, xy.y + i * CHUNK_DY) + cmd_img.offset; + ivec2 uv = ivec2(xy + chunk_offset(i)) + cmd_img.offset; #ifdef ENABLE_IMAGE_INDICES vec4 fg_rgba = imageLoad(images[cmd_img.index], uv); #else @@ -108,7 +115,7 @@ void main() { Alloc cmd_alloc = slice_mem(conf.ptcl_alloc, tile_ix * PTCL_INITIAL_ALLOC, PTCL_INITIAL_ALLOC); CmdRef cmd_ref = CmdRef(cmd_alloc.offset); - uvec2 xy_uint = uvec2(gl_GlobalInvocationID.x, gl_LocalInvocationID.y + TILE_HEIGHT_PX * gl_WorkGroupID.y); + uvec2 xy_uint = uvec2(gl_LocalInvocationID.x + TILE_WIDTH_PX * gl_WorkGroupID.x, gl_LocalInvocationID.y + TILE_HEIGHT_PX * gl_WorkGroupID.y); vec2 xy = vec2(xy_uint); vec3 rgb[CHUNK]; float mask[CHUNK]; @@ -120,7 +127,7 @@ void main() { rgb[i] = vec3(0.5); #ifdef ENABLE_IMAGE_INDICES if (xy_uint.x < 1024 && xy_uint.y < 1024) { - rgb[i] = imageLoad(images[gl_WorkGroupID.x / 64], ivec2(xy_uint.x, xy_uint.y + CHUNK_DY * i)/4).rgb; + rgb[i] = imageLoad(images[gl_WorkGroupID.x / 64], ivec2(xy_uint + chunk_offset(i))/4).rgb; } #endif mask[i] = 1.0; @@ -144,7 +151,7 @@ void main() { vec2 line_vec = seg.vector; for (uint k = 0; k < CHUNK; k++) { vec2 dpos = xy + vec2(0.5, 0.5) - seg.origin; - dpos.y += float(k * CHUNK_DY); + dpos += vec2(chunk_offset(k)); float t = clamp(dot(line_vec, dpos) / dot(line_vec, line_vec), 0.0, 1.0); df[k] = min(df[k], length(line_vec * t - dpos)); } @@ -163,7 +170,7 @@ void main() { do { TileSeg seg = TileSeg_read(new_alloc(tile_seg_ref.offset, TileSeg_size), tile_seg_ref); for (uint k = 0; k < CHUNK; k++) { - vec2 my_xy = vec2(xy.x, xy.y + float(k * CHUNK_DY)); + vec2 my_xy = xy + vec2(chunk_offset(k)); vec2 start = seg.origin - my_xy; vec2 end = start + seg.vector; vec2 window = clamp(vec2(start.y, end.y), 0.0, 1.0); @@ -227,7 +234,8 @@ void main() { clip_tos = m.alloc; uint base_ix = (clip_tos.offset >> 2) + gl_LocalInvocationID.x + TILE_WIDTH_PX * gl_LocalInvocationID.y; for (uint k = 0; k < CHUNK; k++) { - write_mem(clip_tos, base_ix + k * TILE_WIDTH_PX * CHUNK_DY, blend_stack[blend_slot][k]); + uvec2 offset = chunk_offset(k); + write_mem(clip_tos, base_ix + offset.x + offset.y * TILE_WIDTH_PX, blend_stack[blend_slot][k]); } blend_spill++; } @@ -242,7 +250,8 @@ void main() { if (blend_sp == blend_spill) { uint base_ix = (clip_tos.offset >> 2) + gl_LocalInvocationID.x + TILE_WIDTH_PX * gl_LocalInvocationID.y; for (uint k = 0; k < CHUNK; k++) { - blend_stack[blend_slot][k] = read_mem(clip_tos, base_ix + k * TILE_WIDTH_PX * CHUNK_DY); + uvec2 offset = chunk_offset(k); + blend_stack[blend_slot][k] = read_mem(clip_tos, base_ix + offset.x + offset.y * TILE_WIDTH_PX); } clip_tos.offset = read_mem(clip_tos, (clip_tos.offset >> 2) + CLIP_LINK_OFFSET); blend_spill--; @@ -262,6 +271,6 @@ void main() { } for (uint i = 0; i < CHUNK; i++) { - imageStore(image, ivec2(xy_uint.x, xy_uint.y + CHUNK_DY * i), vec4(tosRGB(rgb[i]), 1.0)); + imageStore(image, ivec2(xy_uint + chunk_offset(i)), vec4(tosRGB(rgb[i]), 1.0)); } } diff --git a/piet-gpu/shader/kernel4.spv b/piet-gpu/shader/kernel4.spv index 5f776e438a537827e3b267d839191e0790d3e4c0..dd5304724ef3c9a4f5b57cac5e861647d8701fb0 100644 GIT binary patch literal 38764 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 bwS1=1r&jJw_mTBImtFzep68j^^X&fsOhOwF literal 38328 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 aY_Cnt_Sx(1OWWUp&(Fd3=XomjJpF%NTH1{O