| File: | root/firefox-clang/obj-x86_64-pc-linux-gnu/x86_64-unknown-linux-gnu/debug/build/swgl-632c403fa1e5c7af/out/cs_path_tile_PATH_SSAA4.h |
| Warning: | line 253, column 14 Value stored to 'texel1' during its initialization is never read |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | struct cs_path_tile_PATH_SSAA4_common { |
| 2 | struct Samplers { |
| 3 | sampler2D_impl sGpuBufferF_impl; |
| 4 | int sGpuBufferF_slot; |
| 5 | isampler2D_impl sGpuBufferI_impl; |
| 6 | int sGpuBufferI_slot; |
| 7 | sampler2D_impl sPathEdges_impl; |
| 8 | int sPathEdges_slot; |
| 9 | sampler2D_impl sRenderTasks_impl; |
| 10 | int sRenderTasks_slot; |
| 11 | bool set_slot(int index, int value) { |
| 12 | switch (index) { |
| 13 | case 2: |
| 14 | sGpuBufferF_slot = value; |
| 15 | return true; |
| 16 | case 3: |
| 17 | sGpuBufferI_slot = value; |
| 18 | return true; |
| 19 | case 5: |
| 20 | sPathEdges_slot = value; |
| 21 | return true; |
| 22 | case 1: |
| 23 | sRenderTasks_slot = value; |
| 24 | return true; |
| 25 | } |
| 26 | return false; |
| 27 | } |
| 28 | } samplers; |
| 29 | struct AttribLocations { |
| 30 | int aPosition = NULL_ATTRIB16; |
| 31 | int aData = NULL_ATTRIB16; |
| 32 | void bind_loc(const char* name, int index) { |
| 33 | if (strcmp("aPosition", name) == 0) { aPosition = index; return; } |
| 34 | if (strcmp("aData", name) == 0) { aData = index; return; } |
| 35 | } |
| 36 | int get_loc(const char* name) const { |
| 37 | if (strcmp("aPosition", name) == 0) { return aPosition != NULL_ATTRIB16 ? aPosition : -1; } |
| 38 | if (strcmp("aData", name) == 0) { return aData != NULL_ATTRIB16 ? aData : -1; } |
| 39 | return -1; |
| 40 | } |
| 41 | } attrib_locations; |
| 42 | ivec4_scalar vTileData; |
| 43 | sampler2D sGpuBufferF; |
| 44 | isampler2D sGpuBufferI; |
| 45 | sampler2D sPathEdges; |
| 46 | sampler2D sRenderTasks; |
| 47 | mat4_scalar uTransform; |
| 48 | void bind_textures() { |
| 49 | sGpuBufferF = lookup_sampler(&samplers.sGpuBufferF_impl, samplers.sGpuBufferF_slot); |
| 50 | sGpuBufferI = lookup_isampler(&samplers.sGpuBufferI_impl, samplers.sGpuBufferI_slot); |
| 51 | sPathEdges = lookup_sampler(&samplers.sPathEdges_impl, samplers.sPathEdges_slot); |
| 52 | sRenderTasks = lookup_sampler(&samplers.sRenderTasks_impl, samplers.sRenderTasks_slot); |
| 53 | } |
| 54 | }; |
| 55 | struct cs_path_tile_PATH_SSAA4_vert : VertexShaderImpl, cs_path_tile_PATH_SSAA4_common { |
| 56 | private: |
| 57 | typedef cs_path_tile_PATH_SSAA4_vert Self; |
| 58 | // mat4_scalar uTransform; |
| 59 | vec2 aPosition; |
| 60 | struct RectWithSize_scalar { |
| 61 | vec2_scalar p0; |
| 62 | vec2_scalar size; |
| 63 | RectWithSize_scalar() = default; |
| 64 | RectWithSize_scalar(vec2_scalar p0, vec2_scalar size) : p0(p0), size(size){} |
| 65 | }; |
| 66 | struct RectWithSize { |
| 67 | vec2 p0; |
| 68 | vec2 size; |
| 69 | RectWithSize() = default; |
| 70 | RectWithSize(vec2 p0, vec2 size) : p0(p0), size(size){} |
| 71 | RectWithSize(vec2_scalar p0, vec2_scalar size):p0(p0),size(size){ |
| 72 | } |
| 73 | IMPLICIT RectWithSize(RectWithSize_scalar s):p0(s.p0),size(s.size){ |
| 74 | } |
| 75 | friend RectWithSize if_then_else(I32 c, RectWithSize t, RectWithSize e) { return RectWithSize( |
| 76 | if_then_else(c, t.p0, e.p0), if_then_else(c, t.size, e.size)); |
| 77 | }}; |
| 78 | struct RectWithEndpoint_scalar { |
| 79 | vec2_scalar p0; |
| 80 | vec2_scalar p1; |
| 81 | RectWithEndpoint_scalar() = default; |
| 82 | RectWithEndpoint_scalar(vec2_scalar p0, vec2_scalar p1) : p0(p0), p1(p1){} |
| 83 | }; |
| 84 | struct RectWithEndpoint { |
| 85 | vec2 p0; |
| 86 | vec2 p1; |
| 87 | RectWithEndpoint() = default; |
| 88 | RectWithEndpoint(vec2 p0, vec2 p1) : p0(p0), p1(p1){} |
| 89 | RectWithEndpoint(vec2_scalar p0, vec2_scalar p1):p0(p0),p1(p1){ |
| 90 | } |
| 91 | IMPLICIT RectWithEndpoint(RectWithEndpoint_scalar s):p0(s.p0),p1(s.p1){ |
| 92 | } |
| 93 | friend RectWithEndpoint if_then_else(I32 c, RectWithEndpoint t, RectWithEndpoint e) { return RectWithEndpoint( |
| 94 | if_then_else(c, t.p0, e.p0), if_then_else(c, t.p1, e.p1)); |
| 95 | }}; |
| 96 | // sampler2D sRenderTasks; |
| 97 | struct RenderTaskData_scalar { |
| 98 | RectWithEndpoint_scalar task_rect; |
| 99 | vec4_scalar user_data; |
| 100 | RenderTaskData_scalar() = default; |
| 101 | RenderTaskData_scalar(RectWithEndpoint_scalar task_rect, vec4_scalar user_data) : task_rect(task_rect), user_data(user_data){} |
| 102 | }; |
| 103 | struct RenderTaskData { |
| 104 | RectWithEndpoint task_rect; |
| 105 | vec4 user_data; |
| 106 | RenderTaskData() = default; |
| 107 | RenderTaskData(RectWithEndpoint task_rect, vec4 user_data) : task_rect(task_rect), user_data(user_data){} |
| 108 | RenderTaskData(RectWithEndpoint_scalar task_rect, vec4_scalar user_data):task_rect(task_rect),user_data(user_data){ |
| 109 | } |
| 110 | IMPLICIT RenderTaskData(RenderTaskData_scalar s):task_rect(s.task_rect),user_data(s.user_data){ |
| 111 | } |
| 112 | friend RenderTaskData if_then_else(I32 c, RenderTaskData t, RenderTaskData e) { return RenderTaskData( |
| 113 | if_then_else(c, t.task_rect, e.task_rect), if_then_else(c, t.user_data, e.user_data)); |
| 114 | }}; |
| 115 | struct PictureTask_scalar { |
| 116 | RectWithEndpoint_scalar task_rect; |
| 117 | float device_pixel_scale; |
| 118 | vec2_scalar content_origin; |
| 119 | PictureTask_scalar() = default; |
| 120 | PictureTask_scalar(RectWithEndpoint_scalar task_rect, float device_pixel_scale, vec2_scalar content_origin) : task_rect(task_rect), device_pixel_scale(device_pixel_scale), content_origin(content_origin){} |
| 121 | }; |
| 122 | struct PictureTask { |
| 123 | RectWithEndpoint task_rect; |
| 124 | Float device_pixel_scale; |
| 125 | vec2 content_origin; |
| 126 | PictureTask() = default; |
| 127 | PictureTask(RectWithEndpoint task_rect, Float device_pixel_scale, vec2 content_origin) : task_rect(task_rect), device_pixel_scale(device_pixel_scale), content_origin(content_origin){} |
| 128 | PictureTask(RectWithEndpoint_scalar task_rect, float device_pixel_scale, vec2_scalar content_origin):task_rect(task_rect),device_pixel_scale(device_pixel_scale),content_origin(content_origin){ |
| 129 | } |
| 130 | IMPLICIT PictureTask(PictureTask_scalar s):task_rect(s.task_rect),device_pixel_scale(s.device_pixel_scale),content_origin(s.content_origin){ |
| 131 | } |
| 132 | friend PictureTask if_then_else(I32 c, PictureTask t, PictureTask e) { return PictureTask( |
| 133 | if_then_else(c, t.task_rect, e.task_rect), if_then_else(c, t.device_pixel_scale, e.device_pixel_scale), if_then_else(c, t.content_origin, e.content_origin)); |
| 134 | }}; |
| 135 | struct ClipArea_scalar { |
| 136 | RectWithEndpoint_scalar task_rect; |
| 137 | float device_pixel_scale; |
| 138 | vec2_scalar screen_origin; |
| 139 | ClipArea_scalar() = default; |
| 140 | ClipArea_scalar(RectWithEndpoint_scalar task_rect, float device_pixel_scale, vec2_scalar screen_origin) : task_rect(task_rect), device_pixel_scale(device_pixel_scale), screen_origin(screen_origin){} |
| 141 | }; |
| 142 | struct ClipArea { |
| 143 | RectWithEndpoint task_rect; |
| 144 | Float device_pixel_scale; |
| 145 | vec2 screen_origin; |
| 146 | ClipArea() = default; |
| 147 | ClipArea(RectWithEndpoint task_rect, Float device_pixel_scale, vec2 screen_origin) : task_rect(task_rect), device_pixel_scale(device_pixel_scale), screen_origin(screen_origin){} |
| 148 | ClipArea(RectWithEndpoint_scalar task_rect, float device_pixel_scale, vec2_scalar screen_origin):task_rect(task_rect),device_pixel_scale(device_pixel_scale),screen_origin(screen_origin){ |
| 149 | } |
| 150 | IMPLICIT ClipArea(ClipArea_scalar s):task_rect(s.task_rect),device_pixel_scale(s.device_pixel_scale),screen_origin(s.screen_origin){ |
| 151 | } |
| 152 | friend ClipArea if_then_else(I32 c, ClipArea t, ClipArea e) { return ClipArea( |
| 153 | if_then_else(c, t.task_rect, e.task_rect), if_then_else(c, t.device_pixel_scale, e.device_pixel_scale), if_then_else(c, t.screen_origin, e.screen_origin)); |
| 154 | }}; |
| 155 | // sampler2D sGpuBufferF; |
| 156 | // isampler2D sGpuBufferI; |
| 157 | // sampler2D sPathEdges; |
| 158 | struct PathTile_scalar { |
| 159 | vec4_scalar rect; |
| 160 | ivec2_scalar edges; |
| 161 | int32_t backdrop; |
| 162 | int32_t path_address; |
| 163 | PathTile_scalar() = default; |
| 164 | PathTile_scalar(vec4_scalar rect, ivec2_scalar edges, int32_t backdrop, int32_t path_address) : rect(rect), edges(edges), backdrop(backdrop), path_address(path_address){} |
| 165 | }; |
| 166 | struct PathTile { |
| 167 | vec4 rect; |
| 168 | ivec2 edges; |
| 169 | I32 backdrop; |
| 170 | I32 path_address; |
| 171 | PathTile() = default; |
| 172 | PathTile(vec4 rect, ivec2 edges, I32 backdrop, I32 path_address) : rect(rect), edges(edges), backdrop(backdrop), path_address(path_address){} |
| 173 | PathTile(vec4_scalar rect, ivec2_scalar edges, int32_t backdrop, int32_t path_address):rect(rect),edges(edges),backdrop(backdrop),path_address(path_address){ |
| 174 | } |
| 175 | IMPLICIT PathTile(PathTile_scalar s):rect(s.rect),edges(s.edges),backdrop(s.backdrop),path_address(s.path_address){ |
| 176 | } |
| 177 | friend PathTile if_then_else(I32 c, PathTile t, PathTile e) { return PathTile( |
| 178 | if_then_else(c, t.rect, e.rect), if_then_else(c, t.edges, e.edges), if_then_else(c, t.backdrop, e.backdrop), if_then_else(c, t.path_address, e.path_address)); |
| 179 | }}; |
| 180 | struct PathInfo_scalar { |
| 181 | int32_t render_task_address; |
| 182 | int32_t fill_rule; |
| 183 | float opacity; |
| 184 | PathInfo_scalar() = default; |
| 185 | PathInfo_scalar(int32_t render_task_address, int32_t fill_rule, float opacity) : render_task_address(render_task_address), fill_rule(fill_rule), opacity(opacity){} |
| 186 | }; |
| 187 | struct PathInfo { |
| 188 | I32 render_task_address; |
| 189 | I32 fill_rule; |
| 190 | Float opacity; |
| 191 | PathInfo() = default; |
| 192 | PathInfo(I32 render_task_address, I32 fill_rule, Float opacity) : render_task_address(render_task_address), fill_rule(fill_rule), opacity(opacity){} |
| 193 | PathInfo(int32_t render_task_address, int32_t fill_rule, float opacity):render_task_address(render_task_address),fill_rule(fill_rule),opacity(opacity){ |
| 194 | } |
| 195 | IMPLICIT PathInfo(PathInfo_scalar s):render_task_address(s.render_task_address),fill_rule(s.fill_rule),opacity(s.opacity){ |
| 196 | } |
| 197 | friend PathInfo if_then_else(I32 c, PathInfo t, PathInfo e) { return PathInfo( |
| 198 | if_then_else(c, t.render_task_address, e.render_task_address), if_then_else(c, t.fill_rule, e.fill_rule), if_then_else(c, t.opacity, e.opacity)); |
| 199 | }}; |
| 200 | struct PathPrimInfo_scalar { |
| 201 | int32_t z_id; |
| 202 | vec4_scalar color; |
| 203 | vec4_scalar scissor; |
| 204 | PathPrimInfo_scalar() = default; |
| 205 | PathPrimInfo_scalar(int32_t z_id, vec4_scalar color, vec4_scalar scissor) : z_id(z_id), color(color), scissor(scissor){} |
| 206 | }; |
| 207 | struct PathPrimInfo { |
| 208 | I32 z_id; |
| 209 | vec4 color; |
| 210 | vec4 scissor; |
| 211 | PathPrimInfo() = default; |
| 212 | PathPrimInfo(I32 z_id, vec4 color, vec4 scissor) : z_id(z_id), color(color), scissor(scissor){} |
| 213 | PathPrimInfo(int32_t z_id, vec4_scalar color, vec4_scalar scissor):z_id(z_id),color(color),scissor(scissor){ |
| 214 | } |
| 215 | IMPLICIT PathPrimInfo(PathPrimInfo_scalar s):z_id(s.z_id),color(s.color),scissor(s.scissor){ |
| 216 | } |
| 217 | friend PathPrimInfo if_then_else(I32 c, PathPrimInfo t, PathPrimInfo e) { return PathPrimInfo( |
| 218 | if_then_else(c, t.z_id, e.z_id), if_then_else(c, t.color, e.color), if_then_else(c, t.scissor, e.scissor)); |
| 219 | }}; |
| 220 | vec2 vUv; |
| 221 | // ivec4_scalar vTileData; |
| 222 | ivec4_scalar aData; |
| 223 | PathTile_scalar decode_path_tile(ivec4_scalar data) { |
| 224 | PathTile_scalar tile; |
| 225 | vec2_scalar offset = make_vec2(make_float((((data).x)>>(10))&(1023)), make_float(((data).x)&(1023))); |
| 226 | float extend_x = make_float((((data).x)>>(20))&(1023)); |
| 227 | (tile).rect = (make_vec4((offset).x, (offset).y, (((offset).x)+(1.f))+(extend_x), ((offset).y)+(1.f)))*(16.f); |
| 228 | int32_t edge_count = (((data).z)>>(16))&(65535); |
| 229 | (tile).edges = make_ivec2((data).y, ((data).y)+(edge_count)); |
| 230 | (tile).backdrop = (((data).z)&(65535))-(128); |
| 231 | (tile).path_address = (data).w; |
| 232 | return tile; |
| 233 | } |
| 234 | ivec2_scalar get_gpu_buffer_uv(int32_t address) { |
| 235 | return make_ivec2((make_uint(address))%(1024u), (make_uint(address))/(1024u)); |
| 236 | } |
| 237 | ivec4_scalar fetch_from_gpu_buffer_1i(int32_t address) { |
| 238 | ivec2_scalar uv = get_gpu_buffer_uv(address); |
| 239 | return texelFetch(sGpuBufferI, uv, 0); |
| 240 | } |
| 241 | PathInfo_scalar fetch_path_info(int32_t address) { |
| 242 | ivec4_scalar data = fetch_from_gpu_buffer_1i(address); |
| 243 | PathInfo_scalar path; |
| 244 | (path).render_task_address = (data).x; |
| 245 | (path).fill_rule = (data).y; |
| 246 | (path).opacity = (make_float((data).z))/(65535.f); |
| 247 | return path; |
| 248 | } |
| 249 | RectWithEndpoint_scalar fetch_render_task_rect(int32_t index) { |
| 250 | ivec2_scalar uv = make_ivec2(make_int((2u)*((make_uint(index))%((1024u)/(2u)))), make_int((make_uint(index))/((1024u)/(2u)))); |
| 251 | auto sRenderTasks_uv_fetch = texelFetchPtr(sRenderTasks, uv, 0, 1, 0, 0); |
| 252 | vec4_scalar texel0 = texelFetchUnchecked(sRenderTasks, sRenderTasks_uv_fetch, 0, 0); |
| 253 | vec4_scalar texel1 = texelFetchUnchecked(sRenderTasks, sRenderTasks_uv_fetch, 1, 0); |
Value stored to 'texel1' during its initialization is never read | |
| 254 | RectWithEndpoint_scalar task_rect = RectWithEndpoint_scalar((texel0).sel(X,Y), (texel0).sel(Z,W)); |
| 255 | return task_rect; |
| 256 | } |
| 257 | ALWAYS_INLINE__attribute__((always_inline)) inline void main(void) { |
| 258 | PathTile_scalar tile = decode_path_tile(aData); |
| 259 | PathInfo_scalar path = fetch_path_info((tile).path_address); |
| 260 | RectWithEndpoint_scalar task_rect = fetch_render_task_rect((path).render_task_address); |
| 261 | vec2_scalar task_size = ((task_rect).p1)-((task_rect).p0); |
| 262 | vec2_scalar p0 = min(((tile).rect).sel(X,Y), task_size); |
| 263 | vec2_scalar p1 = min(((tile).rect).sel(Z,W), task_size); |
| 264 | vec2 pos = mix(p0, p1, (aPosition).sel(X,Y)); |
| 265 | vUv = (pos)-(((tile).rect).sel(X,Y)); |
| 266 | vTileData = make_ivec4((tile).edges, (tile).backdrop, (path).fill_rule); |
| 267 | gl_Position = (uTransform)*(make_vec4(((task_rect).p0)+(pos), 0.f, 1.f)); |
| 268 | } |
| 269 | static void set_uniform_1i(VertexShaderImpl* impl, int index, int value) { |
| 270 | Self* self = (Self*)impl; |
| 271 | if (self->samplers.set_slot(index, value)) return; |
| 272 | switch (index) { |
| 273 | case 2: |
| 274 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sGpuBufferF |
| 275 | break; |
| 276 | case 3: |
| 277 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sGpuBufferI |
| 278 | break; |
| 279 | case 5: |
| 280 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sPathEdges |
| 281 | break; |
| 282 | case 1: |
| 283 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sRenderTasks |
| 284 | break; |
| 285 | case 4: |
| 286 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // uTransform |
| 287 | break; |
| 288 | } |
| 289 | } |
| 290 | static void set_uniform_4fv(VertexShaderImpl* impl, int index, const float *value) { |
| 291 | Self* self = (Self*)impl; |
| 292 | switch (index) { |
| 293 | case 2: |
| 294 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sGpuBufferF |
| 295 | break; |
| 296 | case 3: |
| 297 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sGpuBufferI |
| 298 | break; |
| 299 | case 5: |
| 300 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sPathEdges |
| 301 | break; |
| 302 | case 1: |
| 303 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sRenderTasks |
| 304 | break; |
| 305 | case 4: |
| 306 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // uTransform |
| 307 | break; |
| 308 | } |
| 309 | } |
| 310 | static void set_uniform_matrix4fv(VertexShaderImpl* impl, int index, const float *value) { |
| 311 | Self* self = (Self*)impl; |
| 312 | switch (index) { |
| 313 | case 2: |
| 314 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sGpuBufferF |
| 315 | break; |
| 316 | case 3: |
| 317 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sGpuBufferI |
| 318 | break; |
| 319 | case 5: |
| 320 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sPathEdges |
| 321 | break; |
| 322 | case 1: |
| 323 | assert(0)(static_cast <bool> (0) ? void (0) : __assert_fail ("0" , __builtin_FILE (), __builtin_LINE (), __extension__ __PRETTY_FUNCTION__ )); // sRenderTasks |
| 324 | break; |
| 325 | case 4: |
| 326 | self->uTransform = mat4_scalar::load_from_ptr(value); |
| 327 | break; |
| 328 | } |
| 329 | } |
| 330 | static void load_attribs(VertexShaderImpl* impl, VertexAttrib *attribs, uint32_t start, int instance, int count) {Self* self = (Self*)impl; |
| 331 | load_attrib(self->aPosition, attribs[self->attrib_locations.aPosition], start, instance, count); |
| 332 | load_flat_attrib(self->aData, attribs[self->attrib_locations.aData], start, instance, count); |
| 333 | } |
| 334 | public: |
| 335 | struct InterpOutputs { |
| 336 | vec2_scalar vUv; |
| 337 | }; |
| 338 | private: |
| 339 | ALWAYS_INLINE__attribute__((always_inline)) inline void store_interp_outputs(char* dest_ptr, size_t stride) { |
| 340 | for(int n = 0; n < 4; n++) { |
| 341 | auto* dest = reinterpret_cast<InterpOutputs*>(dest_ptr); |
| 342 | dest->vUv = get_nth(vUv, n); |
| 343 | dest_ptr += stride; |
| 344 | } |
| 345 | } |
| 346 | static void run(VertexShaderImpl* impl, char* interps, size_t interp_stride) { |
| 347 | Self* self = (Self*)impl; |
| 348 | self->main(); |
| 349 | self->store_interp_outputs(interps, interp_stride); |
| 350 | } |
| 351 | static void init_batch(VertexShaderImpl* impl) { |
| 352 | Self* self = (Self*)impl; self->bind_textures(); } |
| 353 | public: |
| 354 | cs_path_tile_PATH_SSAA4_vert() { |
| 355 | set_uniform_1i_func = &set_uniform_1i; |
| 356 | set_uniform_4fv_func = &set_uniform_4fv; |
| 357 | set_uniform_matrix4fv_func = &set_uniform_matrix4fv; |
| 358 | init_batch_func = &init_batch; |
| 359 | load_attribs_func = &load_attribs; |
| 360 | run_primitive_func = &run; |
| 361 | } |
| 362 | }; |
| 363 | |
| 364 | |
| 365 | struct cs_path_tile_PATH_SSAA4_frag : FragmentShaderImpl, cs_path_tile_PATH_SSAA4_vert { |
| 366 | private: |
| 367 | typedef cs_path_tile_PATH_SSAA4_frag Self; |
| 368 | #define oFragColorgl_FragColor gl_FragColor |
| 369 | // vec4 oFragColor; |
| 370 | struct RectWithSize_scalar { |
| 371 | vec2_scalar p0; |
| 372 | vec2_scalar size; |
| 373 | RectWithSize_scalar() = default; |
| 374 | RectWithSize_scalar(vec2_scalar p0, vec2_scalar size) : p0(p0), size(size){} |
| 375 | }; |
| 376 | struct RectWithSize { |
| 377 | vec2 p0; |
| 378 | vec2 size; |
| 379 | RectWithSize() = default; |
| 380 | RectWithSize(vec2 p0, vec2 size) : p0(p0), size(size){} |
| 381 | RectWithSize(vec2_scalar p0, vec2_scalar size):p0(p0),size(size){ |
| 382 | } |
| 383 | IMPLICIT RectWithSize(RectWithSize_scalar s):p0(s.p0),size(s.size){ |
| 384 | } |
| 385 | friend RectWithSize if_then_else(I32 c, RectWithSize t, RectWithSize e) { return RectWithSize( |
| 386 | if_then_else(c, t.p0, e.p0), if_then_else(c, t.size, e.size)); |
| 387 | }}; |
| 388 | struct RectWithEndpoint_scalar { |
| 389 | vec2_scalar p0; |
| 390 | vec2_scalar p1; |
| 391 | RectWithEndpoint_scalar() = default; |
| 392 | RectWithEndpoint_scalar(vec2_scalar p0, vec2_scalar p1) : p0(p0), p1(p1){} |
| 393 | }; |
| 394 | struct RectWithEndpoint { |
| 395 | vec2 p0; |
| 396 | vec2 p1; |
| 397 | RectWithEndpoint() = default; |
| 398 | RectWithEndpoint(vec2 p0, vec2 p1) : p0(p0), p1(p1){} |
| 399 | RectWithEndpoint(vec2_scalar p0, vec2_scalar p1):p0(p0),p1(p1){ |
| 400 | } |
| 401 | IMPLICIT RectWithEndpoint(RectWithEndpoint_scalar s):p0(s.p0),p1(s.p1){ |
| 402 | } |
| 403 | friend RectWithEndpoint if_then_else(I32 c, RectWithEndpoint t, RectWithEndpoint e) { return RectWithEndpoint( |
| 404 | if_then_else(c, t.p0, e.p0), if_then_else(c, t.p1, e.p1)); |
| 405 | }}; |
| 406 | // sampler2D sGpuBufferF; |
| 407 | // isampler2D sGpuBufferI; |
| 408 | // sampler2D sPathEdges; |
| 409 | vec2 vUv; |
| 410 | // ivec4_scalar vTileData; |
| 411 | Float ssaa_sample(vec2_scalar offset, vec2 edge, Float cross_at_origin, Float y_min, Float y_max, float winding) { |
| 412 | Bool in_y_range = ((y_min)<=((offset).y))&&((y_max)>=((offset).y)); |
| 413 | Float cross = ((cross_at_origin)+(((edge).x)*((offset).y)))-(((edge).y)*((offset).x)); |
| 414 | return if_then_else((in_y_range)&&((cross)>=(0.f)), winding, 0.f); |
| 415 | } |
| 416 | Float path_even_odd(Float winding_number) { |
| 417 | return (1.f)-(abs__glsl_abs((mod(abs__glsl_abs(winding_number), 2.f))-(1.f))); |
| 418 | } |
| 419 | Float path_non_zero(Float winding_number) { |
| 420 | return min(abs__glsl_abs(winding_number), 1.f); |
| 421 | } |
| 422 | Float path_tile_coverage(vec2 uv, ivec2_scalar edges, int32_t backdrop, int32_t fill_rule) { |
| 423 | vec4 wn = make_vec4(make_float(backdrop)); |
| 424 | int32_t end = min((edges).y, ((edges).x)+(512)); |
| 425 | for ( int32_t edge_idx = (edges).x; |
| 426 | (edge_idx)<(end); edge_idx++) { |
| 427 | ivec2_scalar edge_uv = make_ivec2(make_int((make_uint(edge_idx))%(1024u)), make_int((make_uint(edge_idx))/(1024u))); |
| 428 | vec4_scalar edge = (texelFetch(sPathEdges, edge_uv, 0))*((255.f)/(15.f)); |
| 429 | vec2_scalar p0 = (edge).sel(X,Y); |
| 430 | vec2_scalar p1 = (edge).sel(Z,W); |
| 431 | if (((p0).y)==((p1).y)) { |
| 432 | { |
| 433 | continue; |
| 434 | } |
| 435 | } |
| 436 | bool downwards = ((p1).y)>((p0).y); |
| 437 | float s = downwards ? 1.f : -(1.f); |
| 438 | vec2 upper = (downwards ? p0 : p1)-(uv); |
| 439 | vec2 lower = (downwards ? p1 : p0)-(uv); |
| 440 | Float y_min = -((lower).y); |
| 441 | Float y_max = -((upper).y); |
| 442 | auto _c2_ = ((y_min)<=((3.f)/(8.f)))&&((y_max)>=((-(3.f))/(8.f))); |
| 443 | { |
| 444 | vec2_scalar const a = make_vec2((1.f)/(8.f), (-(3.f))/(8.f)); |
| 445 | vec2_scalar const b = make_vec2((-(3.f))/(8.f), (-(1.f))/(8.f)); |
| 446 | vec2_scalar const c = make_vec2((3.f)/(8.f), (1.f)/(8.f)); |
| 447 | vec2_scalar const d = make_vec2((-(1.f))/(8.f), (3.f)/(8.f)); |
| 448 | vec2 v = (lower)-(upper); |
| 449 | Float cross_at_origin = (((v).x)*((upper).y))-(((upper).x)*((v).y)); |
| 450 | (wn).x = if_then_else(_c2_,(wn).x+ssaa_sample(a, v, cross_at_origin, y_min, y_max, s),(wn).x); |
| 451 | (wn).y = if_then_else(_c2_,(wn).y+ssaa_sample(b, v, cross_at_origin, y_min, y_max, s),(wn).y); |
| 452 | (wn).z = if_then_else(_c2_,(wn).z+ssaa_sample(c, v, cross_at_origin, y_min, y_max, s),(wn).z); |
| 453 | (wn).w = if_then_else(_c2_,(wn).w+ssaa_sample(d, v, cross_at_origin, y_min, y_max, s),(wn).w); |
| 454 | } |
| 455 | } |
| 456 | Float mask; |
| 457 | if (((fill_rule)&(1))==(0)) { |
| 458 | { |
| 459 | mask = (((path_even_odd((wn).x))+(path_even_odd((wn).y)))+(path_even_odd((wn).z)))+(path_even_odd((wn).w)); |
| 460 | } |
| 461 | } else { |
| 462 | mask = (((path_non_zero((wn).x))+(path_non_zero((wn).y)))+(path_non_zero((wn).z)))+(path_non_zero((wn).w)); |
| 463 | } |
| 464 | mask *= 0.25f; |
| 465 | if (((fill_rule)&(2))!=(0)) { |
| 466 | { |
| 467 | mask = (1.f)-(mask); |
| 468 | } |
| 469 | } |
| 470 | return mask; |
| 471 | } |
| 472 | ALWAYS_INLINE__attribute__((always_inline)) inline void main(void) { |
| 473 | Float mask = path_tile_coverage(vUv, (vTileData).sel(X,Y), (vTileData).z, (vTileData).w); |
| 474 | oFragColorgl_FragColor = make_vec4(make_vec3((1.f)-(mask)), mask); |
| 475 | } |
| 476 | void swgl_drawSpanRGBA8() { |
| 477 | swgl_commitPathTileRGBA8(sPathEdges, vUv, vTileData, 4)do { int drawn = 0; if (4 == 8) { drawn = blend_key ? blendPathTile <8, true>(sPathEdges, vUv, vTileData, swgl_OutRGBA8, swgl_SpanLength ) : blendPathTile<8, false>(sPathEdges, vUv, vTileData, swgl_OutRGBA8, swgl_SpanLength); } else { drawn = blend_key ? blendPathTile<4, true>(sPathEdges, vUv, vTileData, swgl_OutRGBA8 , swgl_SpanLength) : blendPathTile<4, false>(sPathEdges , vUv, vTileData, swgl_OutRGBA8, swgl_SpanLength); } swgl_OutRGBA8 += drawn; swgl_SpanLength -= drawn; } while (0); |
| 478 | } |
| 479 | void swgl_drawSpanR8() { |
| 480 | swgl_commitPathTileR8(sPathEdges, vUv, vTileData, 4)do { int drawn = 0; if (4 == 8) { drawn = blend_key ? blendPathTile <8, true>(sPathEdges, vUv, vTileData, swgl_OutR8, swgl_SpanLength ) : blendPathTile<8, false>(sPathEdges, vUv, vTileData, swgl_OutR8, swgl_SpanLength); } else { drawn = blend_key ? blendPathTile <4, true>(sPathEdges, vUv, vTileData, swgl_OutR8, swgl_SpanLength ) : blendPathTile<4, false>(sPathEdges, vUv, vTileData, swgl_OutR8, swgl_SpanLength); } swgl_OutR8 += drawn; swgl_SpanLength -= drawn; } while (0); |
| 481 | } |
| 482 | typedef cs_path_tile_PATH_SSAA4_vert::InterpOutputs InterpInputs; |
| 483 | InterpInputs interp_step; |
| 484 | struct InterpPerspective { |
| 485 | vec2 vUv; |
| 486 | }; |
| 487 | InterpPerspective interp_perspective; |
| 488 | static void read_interp_inputs(FragmentShaderImpl* impl, const void* init_, const void* step_) {Self* self = (Self*)impl;const InterpInputs* init = (const InterpInputs*)init_;const InterpInputs* step = (const InterpInputs*)step_; |
| 489 | self->vUv = init_interp(init->vUv, step->vUv); |
| 490 | self->interp_step.vUv = step->vUv * 4.0f; |
| 491 | } |
| 492 | static void read_perspective_inputs(FragmentShaderImpl* impl, const void* init_, const void* step_) {Self* self = (Self*)impl;const InterpInputs* init = (const InterpInputs*)init_;const InterpInputs* step = (const InterpInputs*)step_; |
| 493 | Float w = 1.0f / self->gl_FragCoord.w; |
| 494 | self->interp_perspective.vUv = init_interp(init->vUv, step->vUv); |
| 495 | self->vUv = self->interp_perspective.vUv * w; |
| 496 | self->interp_step.vUv = step->vUv * 4.0f; |
| 497 | } |
| 498 | ALWAYS_INLINE__attribute__((always_inline)) inline void step_interp_inputs(int steps = 4) { |
| 499 | float chunks = steps * 0.25f; |
| 500 | vUv += interp_step.vUv * chunks; |
| 501 | } |
| 502 | ALWAYS_INLINE__attribute__((always_inline)) inline void step_perspective_inputs(int steps = 4) { |
| 503 | step_perspective(steps); |
| 504 | float chunks = steps * 0.25f; |
| 505 | Float w = 1.0f / gl_FragCoord.w; |
| 506 | interp_perspective.vUv += interp_step.vUv * chunks; |
| 507 | vUv = w * interp_perspective.vUv; |
| 508 | } |
| 509 | static void run(FragmentShaderImpl* impl) { |
| 510 | Self* self = (Self*)impl; |
| 511 | self->main(); |
| 512 | self->step_interp_inputs(); |
| 513 | } |
| 514 | static void skip(FragmentShaderImpl* impl, int steps) { |
| 515 | Self* self = (Self*)impl; |
| 516 | self->step_interp_inputs(steps); |
| 517 | } |
| 518 | static void run_perspective(FragmentShaderImpl* impl) { |
| 519 | Self* self = (Self*)impl; |
| 520 | self->main(); |
| 521 | self->step_perspective_inputs(); |
| 522 | } |
| 523 | static void skip_perspective(FragmentShaderImpl* impl, int steps) { |
| 524 | Self* self = (Self*)impl; |
| 525 | self->step_perspective_inputs(steps); |
| 526 | } |
| 527 | static int draw_span_RGBA8(FragmentShaderImpl* impl) { |
| 528 | Self* self = (Self*)impl; DISPATCH_DRAW_SPAN(self, RGBA8)do { int total = self->swgl_SpanLength; self->swgl_drawSpanRGBA8 (); int drawn = total - self->swgl_SpanLength; if (drawn) self ->step_interp_inputs(drawn); return drawn; } while (0); } |
| 529 | static int draw_span_R8(FragmentShaderImpl* impl) { |
| 530 | Self* self = (Self*)impl; DISPATCH_DRAW_SPAN(self, R8)do { int total = self->swgl_SpanLength; self->swgl_drawSpanR8 (); int drawn = total - self->swgl_SpanLength; if (drawn) self ->step_interp_inputs(drawn); return drawn; } while (0); } |
| 531 | public: |
| 532 | cs_path_tile_PATH_SSAA4_frag() { |
| 533 | init_span_func = &read_interp_inputs; |
| 534 | run_func = &run; |
| 535 | skip_func = &skip; |
| 536 | draw_span_RGBA8_func = &draw_span_RGBA8; |
| 537 | draw_span_R8_func = &draw_span_R8; |
| 538 | enable_perspective(); |
| 539 | init_span_w_func = &read_perspective_inputs; |
| 540 | run_w_func = &run_perspective; |
| 541 | skip_w_func = &skip_perspective; |
| 542 | } |
| 543 | }; |
| 544 | |
| 545 | struct cs_path_tile_PATH_SSAA4_program : ProgramImpl, cs_path_tile_PATH_SSAA4_frag { |
| 546 | int get_uniform(const char *name) const override { |
| 547 | if (strcmp("sGpuBufferF", name) == 0) { return 2; } |
| 548 | if (strcmp("sGpuBufferI", name) == 0) { return 3; } |
| 549 | if (strcmp("sPathEdges", name) == 0) { return 5; } |
| 550 | if (strcmp("sRenderTasks", name) == 0) { return 1; } |
| 551 | if (strcmp("uTransform", name) == 0) { return 4; } |
| 552 | return -1; |
| 553 | } |
| 554 | void bind_attrib(const char* name, int index) override { |
| 555 | attrib_locations.bind_loc(name, index); |
| 556 | } |
| 557 | int get_attrib(const char* name) const override { |
| 558 | return attrib_locations.get_loc(name); |
| 559 | } |
| 560 | size_t interpolants_size() const override { return sizeof(InterpOutputs); } |
| 561 | VertexShaderImpl* get_vertex_shader() override { |
| 562 | return this; |
| 563 | } |
| 564 | FragmentShaderImpl* get_fragment_shader() override { |
| 565 | return this; |
| 566 | } |
| 567 | const char* get_name() const override { return "cs_path_tile_PATH_SSAA4"; } |
| 568 | static ProgramImpl* loader() { return new cs_path_tile_PATH_SSAA4_program; } |
| 569 | }; |
| 570 |