/*
* 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
//
//
//