blob: 5ce2a73cca73c5fb00c352314d9ad5de8ea1d803 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_GRAPHICS_LIB_COMPUTE_SPINEL_INCLUDE_SPINEL_SPINEL_TYPES_H_
#define SRC_GRAPHICS_LIB_COMPUTE_SPINEL_INCLUDE_SPINEL_SPINEL_TYPES_H_
//
//
//
#include <stdbool.h>
#include <stdint.h>
//
//
//
#ifdef __cplusplus
extern "C" {
#endif
//
// clang-format off
//
typedef struct spinel_context * spinel_context_t;
typedef struct spinel_path_builder * spinel_path_builder_t;
typedef struct spinel_raster_builder * spinel_raster_builder_t;
typedef struct spinel_composition * spinel_composition_t;
typedef struct spinel_styling * spinel_styling_t;
typedef struct spinel_swapchain * spinel_swapchain_t;
typedef uint32_t spinel_layer_id; // TODO(allanmac): slated for removal
typedef uint32_t spinel_group_id; // TODO(allanmac): slated for removal
typedef uint32_t spinel_styling_cmd_t;
typedef uint32_t spinel_handle_t;
//
//
//
typedef struct spinel_path { spinel_handle_t handle; } spinel_path_t;
typedef struct spinel_raster { spinel_handle_t handle; } spinel_raster_t;
typedef struct spinel_transform_weakref { uint32_t weakref[2]; } spinel_transform_weakref_t;
typedef struct spinel_clip_weakref { uint32_t weakref[2]; } spinel_clip_weakref_t;
//
//
//
#define SPN_PATH_INVALID ((spinel_path_t) { .handle = UINT32_MAX })
#define SPN_RASTER_INVALID ((spinel_raster_t){ .handle = UINT32_MAX })
#define SPN_TRANSFORM_WEAKREF_INVALID ((spinel_transform_weakref_t){ .weakref = { UINT32_MAX, UINT32_MAX } })
#define SPN_CLIP_WEAKREF_INVALID ((spinel_clip_weakref_t) { .weakref = { UINT32_MAX, UINT32_MAX } })
//
// clang-format on
//
//
// TRANSFORMS
//
// Spinel supports a projective transformation matrix with the
// requirement that w2 is implicitly 1.
//
// A---------B----+
// | sx shx | tx |
// | shy sy | ty |
// C---------D----+
// | w0 w1 | 1 |
// +---------+----+
//
// The layout of the transform is defined by the spinel_transform_t struct.
//
// It's the responsibility of the host to ensure that the transforms
// are properly scaled either via initializing a transform stack with
// the transform returned by `spinel_context_get_limits()`.
//
typedef struct spinel_transform
{
float sx;
float shx;
float tx;
float shy;
float sy;
float ty;
float w0;
float w1;
} spinel_transform_t;
//
// RASTERIZATION CLIP
//
// The coordinate clip rectangle is used by `raster_builder_add()`.
//
typedef struct spinel_clip
{
float x0;
float y0;
float x1;
float y1;
} spinel_clip_t;
//
// PIXEL CLIP
//
// The coordinate clip rectangle is used by `raster_builder_add()`.
//
typedef struct spinel_pixel_clip
{
uint32_t x0;
uint32_t y0;
uint32_t x1;
uint32_t y1;
} spinel_pixel_clip_t;
//
// TXTY LAYOUT: { tx, ty }
//
// FIXME(allanmac): It may be necessary to make tx/ty floats.
//
typedef struct spinel_txty
{
int32_t tx;
int32_t ty;
} spinel_txty_t;
//
// EXTENT 2D
//
typedef struct spinel_extent_2d
{
uint32_t width;
uint32_t height;
} spinel_extent_2d_t;
//
// LIMITS
//
// .global_transform - Mandatory global transform
// .tile - Tile size in pixels
// .extent - Max rendering extent size
//
typedef struct spinel_context_limits
{
spinel_transform_t global_transform;
spinel_extent_2d_t tile;
spinel_extent_2d_t extent;
} spinel_context_limits_t;
//
// STYLING CREATE
//
typedef struct spinel_styling_create_info
{
uint32_t layer_count;
uint32_t cmd_count;
} spinel_styling_create_info_t;
//
// SWAPCHAIN CREATE
//
// .extent - size of surface
// .count - number of surfaces
//
typedef struct spinel_swapchain_create_info
{
spinel_extent_2d_t extent;
uint32_t count;
} spinel_swapchain_create_info_t;
//
// SWAPCHAIN SUBMIT
//
// Submits a composition and styling and platform-specific extensions to the
// swapchain.
//
typedef struct spinel_swapchain_submit
{
void * ext;
spinel_styling_t styling;
spinel_composition_t composition;
} spinel_swapchain_submit_t;
//
//
//
#ifdef __cplusplus
}
#endif
//
//
//
#endif // SRC_GRAPHICS_LIB_COMPUTE_SPINEL_INCLUDE_SPINEL_SPINEL_TYPES_H_