/*
 * 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_BLOCK
#define SKC_ONCE_BLOCK

//
//
//

#include "types.h"
#include "macros.h"

//
// Hard requirements:
//
//   - A TTXB "block pool" extent that is at least 1GB.
//
//   - A virtual surface of at least 8K x 8K
//
//   - A physical surface of __don't really care__ because it's
//     advantageous to tile the physical surface into sub-surface
//     rectangles so that multiple linear (smaller) TTCK sorts are
//     simultaneously performed.
//
//
//      EXTENT                 TTXB BITS
//     SIZE (MB) +-------------------------------------+
//               |  22    23    24    25    26  * 27 * |
//          +----+-------------------------------------+
//          |  8 |  128   256   512  1024  2048  4096  |
//     TTXB | 16 |  256   512  1024  2048  4096  8192  |
//    WORDS | 32 |  512  1024  2048  4096  8192 16384  |
//          | 64 | 1024  2048  4096  8192 16384 32768  |
//          +----+-------------------------------------+
//
//
//    SUB-SURFACE                        X/Y BITS
//     TILE SIZE +------------------------------------------------------+
//               |   5     6     7     8     9    10    11    12    13  |
//          +----+------------------------------------------------------+
//          |  3 |  256   512  1024  2048  4096  8192 16384 32768 65536 |
//     TILE |  4 |  512  1024  2048  4096  8192 16384 32768 65536  128K |
//     SIDE |  5 | 1024  2048  4096  8192 16384 32768 65536  128K  256K |
//     BITS |  6 | 2048  4096  8192 16384 32768 65536  128K  256K  512K |
//          |  7 | 4096  8192 16384 32768 65536  128K  256K  512K 1024K |
//          +----+------------------------------------------------------+
//      TILES^2  | 1024  4096 16384 65536  256K    1M    4M   16M   64M |
//               +------------------------------------------------------+
//
// The following values should be pretty future-proof across all GPUs:
//
//   - 27 bits of block id space implies a max of 4GB-32GB of
//     rasterized paths depending on the size of the TTXB block.
//     This could enable interesting use cases.
//
//   - A minimum block size is 16 words (64 bytes) and a maximum of 32
//     words (128 bytes) greatly simplifies portability. It's unlikely
//     that a large GPU can service a tile larger than 32x32 pixels.
//     Additionally, on smaller devices, rectangular tiles will have a
//     minimum height of 16 pixels.  Note that a minimum subblock size
//     is probably 8 words (32 bytes).
//
//   - A virtual rasterization surface that's from +/-32768K to
//     +/-128K depending on the target's rasterization tile size.
//
//   - A physical sub-surface tile (or entire surface) from 4Kx4K to
//     16Kx16K depending on the target's rasterization tile size.
//
//   - Support for a minimum of 256K layers. If necessary, this can
//     convseratively raised to 1m or 2m layers by either implementing
//     surface tiling or when the target supports large raster tiles.
//
//   - Keys that (optionally) only require a 32-bit high word
//     comparison.
//
//
// TAGGED BLOCK ID
//
//  0     5                  31
//  |     |         ID        |
//  | TAG | SUBBLOCK | BLOCK  |
//  +-----+----------+--------+
//  |  5  |     N    | 27 - N |
//
// There are 27 bits of subblocks and 5 bits of tag.
//
//
// TTRK (64-bit COMPARE)
//
//  0                                         63
//  | TTSB ID |   X  |   Y  | RASTER COHORT ID |
//  +---------+------+------+------------------+
//  |    27   |  12  |  12  |        13        |
//
//
// TTRK (32-BIT COMPARE)
//
//  0                                               63
//  | TTSB ID | N/A |   X  |   Y  | RASTER COHORT ID |
//  +---------+-----+------+------+------------------+
//  |    27   |  5  |  12  |  12  |        8         |
//
//
// TTSK v2:
//
//  0                                     63
//  | TTSB ID | IS_PREFIX |  N/A |  X |  Y |
//  +---------+-----------+------+----+----+
//  |    27   |   1 (=0)  |  12  | 12 | 12 |
//
//
// TTPK v2:
//
//  0                                       63
//  | TTPB ID | IS_PREFIX | SPAN |  X  |  Y  |
//  +---------+-----------+------+-----+-----+
//  |    27   |   1 (=1)  |  12  | 12  | 12  |
//
//
// TTCK (32-BIT COMPARE) v1:
//
//  0                                                           63
//  | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER |  X  |  Y  |
//  +----------------------+--------+--------+-------+-----+-----+
//  |          30          |    1   |    1   |   18  |  7  |  7  |
//
//
// TTCK (32-BIT COMPARE) v2:
//
//  0                                                           63
//  | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER |  X  |  Y  |
//  +----------------------+--------+--------+-------+-----+-----+
//  |          30          |    1   |    1   |   15  |  9  |  8  |
//
//
// TTCK (64-BIT COMPARE) -- achieves 4K x 4K with an 8x16 tile:
//
//  0                                                           63
//  | PAYLOAD/TTSB/TTPB ID | PREFIX | ESCAPE | LAYER |  X  |  Y  |
//  +----------------------+--------+--------+-------+-----+-----+
//  |          27          |    1   |    1   |   18  |  9  |  8  |
//
//

#define SKC_TAGGED_BLOCK_ID_BITS_ID   27 // this size is cast in stone
#define SKC_TAGGED_BLOCK_ID_BITS_TAG   5 // which leaves 5 bits of tag

//
//
//

typedef enum skc_block_id_tag {

  SKC_BLOCK_ID_TAG_PATH_LINE,      // 0 -- 4  segments
  SKC_BLOCK_ID_TAG_PATH_QUAD,      // 1 -- 6  segments
  SKC_BLOCK_ID_TAG_PATH_CUBIC,     // 2 -- 8  segments
  SKC_BLOCK_ID_TAG_PATH_RAT_QUAD,  // 3 -- 8  segments : 6 + w0 + na
  SKC_BLOCK_ID_TAG_PATH_RAT_CUBIC, // 4 -- 10 segments : 8 + w0 + w1
  SKC_BLOCK_ID_TAG_PATH_COUNT,     // 5 -- this represents the end of path tags
  SKC_BLOCK_ID_TAG_PATH_NEXT = SKC_BLOCK_ID_TAG_PATH_COUNT,

  //
  // TAGS [6-30] ARE AVAILABLE
  //

  SKC_BLOCK_ID_TAG_INVALID = (1u << SKC_TAGGED_BLOCK_ID_BITS_TAG) - 1, // all 1's
  SKC_BLOCK_ID_TAG_COUNT,

} skc_block_id_tag;

//
//
//

#define SKC_TAGGED_BLOCK_ID_INVALID  SKC_UINT_MAX // all 1's

//
//
//

typedef skc_uint skc_block_id_t;

//
//
//

typedef skc_uint skc_tagged_block_id_t;

union skc_tagged_block_id
{
  skc_uint   u32;

#if !defined(__OPENCL_C_VERSION__)
  struct {
    skc_uint tag : SKC_TAGGED_BLOCK_ID_BITS_TAG;
    skc_uint id  : SKC_TAGGED_BLOCK_ID_BITS_ID;
  };
#else
  //
  // OPENCL BIT-FIELD EXTRACT/INSERT
  //
#endif
};

//
//
//

#define SKC_TAGGED_BLOCK_ID_MASK_TAG     SKC_BITS_TO_MASK(SKC_TAGGED_BLOCK_ID_BITS_TAG)

#define SKC_TAGGED_BLOCK_ID_GET_TAG(bst) ((bst) &  SKC_TAGGED_BLOCK_ID_MASK_TAG)
#define SKC_TAGGED_BLOCK_ID_GET_ID(bst)  ((bst) >> SKC_TAGGED_BLOCK_ID_BITS_TAG)

//
//
//

#endif

//
//
//
