blob: effcb052db1453df9655610e95f807a1446166fb [file] [log] [blame]
Allan MacKinnon4359d522018-06-19 13:57:04 -07001/*
2 * Copyright 2017 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can
5 * be found in the LICENSE file.
6 *
7 */
8
9#ifndef SKC_ONCE_PATH
10#define SKC_ONCE_PATH
11
12//
13//
14//
15
16#include "block.h"
17
18//
19//
20//
21
22union skc_path_header
23{
24 skc_uint4 u32v4;
25
26 struct {
27 skc_uint handle; // host handle
28 skc_uint blocks; // # of S-segment blocks in path
29 skc_uint nodes; // # of S-segment node blocks -- not including header
30 skc_uint prims; // # of path elements: lines, quads, cubics, rat-quads, rat-cubics
31 };
32};
33
34union skc_path_bounds
35{
36 skc_float4 f32v4;
37
38 struct {
39 skc_float x0;
40 skc_float y0;
41 skc_float x1;
42 skc_float y1;
43 };
44};
45
46//
47// This head structure aliases a block.
48//
49// Blocks are at least 16 words.
50//
51
52struct skc_path_head
53{
54 union skc_path_header header; // 4
55 union skc_path_bounds bounds; // 4
56 union skc_tagged_block_id tag_ids[]; // 8+ ids
57};
58
59#define SKC_PATH_HEAD_WORDS 8
60
61#define SKC_PATH_HEAD_OFFSET_HANDLE 0
62#define SKC_PATH_HEAD_OFFSET_BLOCKS 1
63#define SKC_PATH_HEAD_OFFSET_NODES 2
64#define SKC_PATH_HEAD_OFFSET_PRIMS 3
65
66#define SKC_PATH_HEAD_OFFSET_IDS 8
67
68#define SKC_PATH_HEAD_WORDS_CALC (sizeof(struct skc_path_head) / sizeof(skc_uint))
69#define SKC_PATH_HEAD_OFFSET_HANDLE_CALC (SKC_OFFSET_OF(struct skc_path_head,header.handle) / sizeof(skc_uint))
70#define SKC_PATH_HEAD_OFFSET_BLOCKS_CALC (SKC_OFFSET_OF(struct skc_path_head,header.blocks) / sizeof(skc_uint))
71#define SKC_PATH_HEAD_OFFSET_NODES_CALC (SKC_OFFSET_OF(struct skc_path_head,header.nodes) / sizeof(skc_uint))
72#define SKC_PATH_HEAD_OFFSET_PRIMS_CALC (SKC_OFFSET_OF(struct skc_path_head,header.prims) / sizeof(skc_uint))
73#define SKC_PATH_HEAD_OFFSET_IDS_CALC (SKC_OFFSET_OF(struct skc_path_head,tag_ids) / sizeof(skc_uint))
74
75//
76// NOT ALL OPENCL PREPROCESSORS ARE HAPPY WITH CALCULATING OFFSET_OF()
77//
78// - Intel ioc compiler failed in the past
79//
80
81#if !defined(__OPENCL_C_VERSION__)
82SKC_STATIC_ASSERT(SKC_PATH_HEAD_WORDS == SKC_PATH_HEAD_WORDS_CALC);
83SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_HANDLE == SKC_PATH_HEAD_OFFSET_HANDLE_CALC);
84SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_BLOCKS == SKC_PATH_HEAD_OFFSET_BLOCKS_CALC);
85SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_NODES == SKC_PATH_HEAD_OFFSET_NODES_CALC);
86SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_PRIMS == SKC_PATH_HEAD_OFFSET_PRIMS_CALC);
87SKC_STATIC_ASSERT(SKC_PATH_HEAD_OFFSET_IDS == SKC_PATH_HEAD_OFFSET_IDS_CALC);
88#endif
89
90//
91// This node structure aliases a block.
92//
93// Blocks are at least 16 words.
94//
95// The last word in the block points to the next block
96//
97// The tag indicating a 'next' pointer is zero.
98//
99
100#if !defined(__OPENCL_C_VERSION__)
101struct skc_path_node
102{
103 union skc_tagged_block_id tag_ids[];
104};
105#endif
106
107//
108//
109//
110
111#endif
112
113//
114//
115//