| /* |
| * Copyright 2017 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can |
| * be found in the LICENSE file. |
| * |
| */ |
| |
| #ifndef SKC_ONCE_PATH |
| #define SKC_ONCE_PATH |
| |
| // |
| // |
| // |
| |
| #include "block.h" |
| |
| // |
| // |
| // |
| |
| union skc_path_header |
| { |
| skc_uint4 u32v4; |
| |
| struct { |
| skc_uint handle; // host handle |
| skc_uint blocks; // # of S-segment blocks in path |
| skc_uint nodes; // # of S-segment node blocks -- not including header |
| skc_uint prims; // # of path elements: lines, quads, cubics, rat-quads, rat-cubics |
| }; |
| }; |
| |
| union skc_path_bounds |
| { |
| skc_float4 f32v4; |
| |
| struct { |
| skc_float x0; |
| skc_float y0; |
| skc_float x1; |
| skc_float y1; |
| }; |
| }; |
| |
| // |
| // This head structure aliases a block. |
| // |
| // Blocks are at least 16 words. |
| // |
| |
| struct skc_path_head |
| { |
| union skc_path_header header; // 4 |
| union skc_path_bounds bounds; // 4 |
| union skc_tagged_block_id tag_ids[]; // 8+ ids |
| }; |
| |
| #define SKC_PATH_HEAD_WORDS 8 |
| |
| #define SKC_PATH_HEAD_OFFSET_HANDLE 0 |
| #define SKC_PATH_HEAD_OFFSET_BLOCKS 1 |
| #define SKC_PATH_HEAD_OFFSET_NODES 2 |
| #define SKC_PATH_HEAD_OFFSET_PRIMS 3 |
| |
| #define SKC_PATH_HEAD_OFFSET_IDS 8 |
| |
| #define SKC_PATH_HEAD_WORDS_CALC (sizeof(struct skc_path_head) / sizeof(skc_uint)) |
| #define SKC_PATH_HEAD_OFFSET_HANDLE_CALC (SKC_OFFSET_OF(struct skc_path_head,header.handle) / sizeof(skc_uint)) |
| #define SKC_PATH_HEAD_OFFSET_BLOCKS_CALC (SKC_OFFSET_OF(struct skc_path_head,header.blocks) / sizeof(skc_uint)) |
| #define SKC_PATH_HEAD_OFFSET_NODES_CALC (SKC_OFFSET_OF(struct skc_path_head,header.nodes) / sizeof(skc_uint)) |
| #define SKC_PATH_HEAD_OFFSET_PRIMS_CALC (SKC_OFFSET_OF(struct skc_path_head,header.prims) / sizeof(skc_uint)) |
| #define SKC_PATH_HEAD_OFFSET_IDS_CALC (SKC_OFFSET_OF(struct skc_path_head,tag_ids) / sizeof(skc_uint)) |
| |
| // |
| // NOT ALL OPENCL PREPROCESSORS ARE HAPPY WITH CALCULATING OFFSET_OF() |
| // |
| // - Intel ioc compiler failed in the past |
| // |
| |
| #if !defined(__OPENCL_C_VERSION__) |
| SKC_STATIC_ASSERT(SKC_PATH_HEAD_WORDS == SKC_PATH_HEAD_WORDS_CALC); |
| SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_HANDLE == SKC_PATH_HEAD_OFFSET_HANDLE_CALC); |
| SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_BLOCKS == SKC_PATH_HEAD_OFFSET_BLOCKS_CALC); |
| SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_NODES == SKC_PATH_HEAD_OFFSET_NODES_CALC); |
| SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_PRIMS == SKC_PATH_HEAD_OFFSET_PRIMS_CALC); |
| SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_IDS == SKC_PATH_HEAD_OFFSET_IDS_CALC); |
| #endif |
| |
| // |
| // This node structure aliases a block. |
| // |
| // Blocks are at least 16 words. |
| // |
| // The last word in the block points to the next block |
| // |
| // The tag indicating a 'next' pointer is zero. |
| // |
| |
| #if !defined(__OPENCL_C_VERSION__) |
| struct skc_path_node |
| { |
| union skc_tagged_block_id tag_ids[]; |
| }; |
| #endif |
| |
| // |
| // |
| // |
| |
| #endif |
| |
| // |
| // |
| // |