blob: 4ade864da50ea7f2318aa5534a7f0f1f1f61fcbe [file] [log] [blame]
// Copyright 2016 Google Inc. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Module Overview: Starboard Blitter API
//
// The Blitter API provides support for issuing simple blit-style draw commands
// to either an offscreen surface or to a Starboard |SbWindow| object. Blitter
// is jargon that means "BLock Transfer," which might be abbreviated as BLT and,
// hence, the word "blit."
//
// This API is designed to allow implementations make use of GPU hardware
// acceleration, if it is available. Draw commands exist for solid-color
// rectangles and rasterization/blitting of rectangular images onto
// rectangular target patches.
//
// # Threading Concerns
//
// Note that in general the Blitter API is not thread safe, except for all
// |SbBlitterDevice|-related functions. All functions that are not required to
// internally ensure any thread safety guarantees are prefaced with a comment
// indicating that they are not thread safe.
//
// Functions which claim to not be thread safe can still be used from multiple
// threads, but manual synchronization must be performed in order to ensure
// their parameters are not referenced at the same time on another thread by
// another function.
//
// ## Examples
//
// - Multiple threads should not issue commands to the same |SbBlitterContext|
// object unless they are manually synchronized.
// - Multiple threads should not issue draw calls to the same render target,
// even if the draw calls are made within separate contexts. In this case,
// be sure to manually synchronize through the use of syncrhonization
// primitives and use of the |SbBlitterFlushContext()| command.
// - Multiple threads can operate on the swap chain, but they must perform
// manual synchronization.
#ifndef STARBOARD_BLITTER_H_
#define STARBOARD_BLITTER_H_
#include "starboard/configuration.h"
#include "starboard/export.h"
#include "starboard/types.h"
#include "starboard/window.h"
#if SB_HAS(BLITTER)
#ifdef __cplusplus
extern "C" {
#endif
// A |SbBlitterDevice| object represents a process' connection to a blitter
// device, such as a GPU. It is through this device that all subsequent Blitter
// API functionality can be accessed.
typedef struct SbBlitterDevicePrivate SbBlitterDevicePrivate;
typedef SbBlitterDevicePrivate* SbBlitterDevice;
#define kSbBlitterInvalidDevice ((SbBlitterDevice)NULL)
// A |SbBlitterSwapChain| represents the (potentially back buffered) output
// display device. A |SbBlitterRenderTarget| can be retrieved from a
// |SbBlitterSwapChain|, providing a target for draw commands. The
// |SbBlitterSwapChain| object also exposes the ability to flip back buffers.
typedef struct SbBlitterSwapChainPrivate SbBlitterSwapChainPrivate;
typedef SbBlitterSwapChainPrivate* SbBlitterSwapChain;
#define kSbBlitterInvalidSwapChain ((SbBlitterSwapChain)NULL)
// A |SbBlitterRenderTarget| may be obtained from either a |SbBlitterSwapChain|
// if it represents a primary display output, or through a |SbBlitterSurface| if
// it represents an offscreen rendering target. A |SbBlitterRenderTarget| must
// be specified within a |SbBlitterContext| before making a draw call.
typedef struct SbBlitterRenderTargetPrivate SbBlitterRenderTargetPrivate;
typedef SbBlitterRenderTargetPrivate* SbBlitterRenderTarget;
#define kSbBlitterInvalidRenderTarget ((SbBlitterRenderTarget)NULL)
// A |SbBlitterPixelData| object represents a buffer of pixels stored in
// CPU-accessible memory. In order to upload pixel data from the CPU to the GPU,
// clients should first create a |SbBlitterPixelData| object, fill in the pixel
// data, and then re-submit the filled in |SbBlitterPixelData| object to the
// Blitter API in order to obtain a |SbBlitterSurface| object that can be
// referenced by draw calls.
typedef struct SbBlitterPixelDataPrivate SbBlitterPixelDataPrivate;
typedef SbBlitterPixelDataPrivate* SbBlitterPixelData;
#define kSbBlitterInvalidPixelData ((SbBlitterPixelData)NULL)
// A |SbBlitterSurface| object represents a device-side surface of pixel data
// that can be used as either the source or the target of device draw calls.
// Note that depending on how the surface is created, it may not be able to
// offer the ability to obtain a |SbBlitterRenderTarget|. |SbBlitterSurface|
// objects may be populated by data either by the CPU via |SbBlitterPixelData|
// objects, or via the device by using this |SbBlitterSurface|'s
// |SbBlitterRenderTarget| object as the target of draw calls.
typedef struct SbBlitterSurfacePrivate SbBlitterSurfacePrivate;
typedef SbBlitterSurfacePrivate* SbBlitterSurface;
#define kSbBlitterInvalidSurface ((SbBlitterSurface)NULL)
// |SbBlitterContext| objects represent a stateful communications channel with a
// device. All state changes and draw calls are made through a specific
// |SbBlitterContext| object. Every draw call made on a |SbBlitterContext| is
// submitted to the device with the |SbBlitterContext|'s current state applied
// to it.
//
// Draw calls may be submitted to the device as they are made on the
// |SbBlitterContext|. However, they are not guaranteed to be submitted until
// the |SbBlitterContext| object is flushed. That is, until you call
// |SbBlitterFlushContext|, you are not guaranteed that any API calls you have
// made have been received or acted on by the graphics device.
typedef struct SbBlitterContextPrivate SbBlitterContextPrivate;
typedef SbBlitterContextPrivate* SbBlitterContext;
#define kSbBlitterInvalidContext ((SbBlitterContext)NULL)
// A simple 32-bit color representation that is a parameter to many Blitter
// functions.
typedef uint32_t SbBlitterColor;
// Defines the set of pixel formats that can be used with the Blitter API
// |SbBlitterPixelData| objects. Note that not all of these formats are
// guaranteed to be supported by a particular device, so before using these
// formats in pixel data creation commands, it should be checked that they are
// supported first (e.g. via |SbBlitterIsPixelFormatSupportedByPixelData()|).
// |SbBlitterPixelDataFormat| specifies specific orderings of the color
// channels, and when doing so, byte-order is used, e.g. "RGBA" implies that a
// value for red is stored in the byte with the lowest memory address. All
// pixel values are assumed to be in premultiplied alpha format.
typedef enum SbBlitterPixelDataFormat {
// 32-bit pixels with 8-bits per channel, the alpha component in the byte
// with the lowest address and blue in the byte with the highest address.
kSbBlitterPixelDataFormatARGB8,
// 32-bit pixels with 8-bits per channel, the blue component in the byte
// with the lowest address and alpha in the byte with the highest address.
kSbBlitterPixelDataFormatBGRA8,
// 32-bit pixels with 8-bits per channel, the red component in the byte
// with the lowest address and alpha in the byte with the highest address.
kSbBlitterPixelDataFormatRGBA8,
// 8-bit pixels that contain only a single alpha channel. When rendered,
// surfaces in this format will have |(R, G, B)| values of |(255, 255, 255)|.
kSbBlitterPixelDataFormatA8,
// Constant that indicates how many unique pixel formats Starboard supports.
kSbBlitterNumPixelDataFormats,
kSbBlitterInvalidPixelDataFormat = kSbBlitterNumPixelDataFormats,
} SbBlitterPixelDataFormat;
// Enumeration that describes the color format of surfaces. Note that
// |SbBlitterSurfaceFormat| does not differentiate between permutations of the
// color channel ordering (e.g. RGBA vs ARGB) since client code will never
// be able to access surface pixels directly. This is the main difference
// between |SbBlitterPixelDataFormat|, which does explicitly dictate an
// ordering.
typedef enum SbBlitterSurfaceFormat {
// 32-bit RGBA color, with 8 bits per channel.
kSbBlitterSurfaceFormatRGBA8,
// 8-bit alpha-only color.
kSbBlitterSurfaceFormatA8,
// Constant that indicates how many unique surface formats Starboard supports.
kSbBlitterNumSurfaceFormats,
kSbBlitterInvalidSurfaceFormat = kSbBlitterNumSurfaceFormats,
} SbBlitterSurfaceFormat;
// Defines a rectangle via a point |(x, y)| and a size |(width, height)|. This
// structure is used as a parameter type in various blit calls.
typedef struct SbBlitterRect {
int x;
int y;
int width;
int height;
} SbBlitterRect;
// |SbBlitterSurfaceInfo| collects information about surfaces that can be
// queried from them at any time.
typedef struct SbBlitterSurfaceInfo {
int width;
int height;
SbBlitterSurfaceFormat format;
} SbBlitterSurfaceInfo;
// A convenience function to create a |SbBlitterColor| object from separate
// 8-bit RGBA components.
static SB_C_FORCE_INLINE SbBlitterColor SbBlitterColorFromRGBA(uint8_t r,
uint8_t g,
uint8_t b,
uint8_t a) {
return (r << 24) | (g << 16) | (b << 8) | a;
}
// Extract red from a |SbBlitterColor| object.
static SB_C_FORCE_INLINE uint8_t SbBlitterRFromColor(SbBlitterColor color) {
return (color & 0xFF000000) >> 24;
}
// Extract green from a |SbBlitterColor| object.
static SB_C_FORCE_INLINE uint8_t SbBlitterGFromColor(SbBlitterColor color) {
return (color & 0x00FF0000) >> 16;
}
// Extract blue from a |SbBlitterColor| object.
static SB_C_FORCE_INLINE uint8_t SbBlitterBFromColor(SbBlitterColor color) {
return (color & 0x0000FF00) >> 8;
}
// Extract alpha from a |SbBlitterColor| object.
static SB_C_FORCE_INLINE uint8_t SbBlitterAFromColor(SbBlitterColor color) {
return (color & 0x000000FF) >> 0;
}
// A convenience function to return the number of bytes per pixel for a given
// pixel format.
static SB_C_FORCE_INLINE int SbBlitterBytesPerPixelForFormat(
SbBlitterPixelDataFormat format) {
switch (format) {
case kSbBlitterPixelDataFormatARGB8:
return 4;
case kSbBlitterPixelDataFormatBGRA8:
return 4;
case kSbBlitterPixelDataFormatRGBA8:
return 4;
case kSbBlitterPixelDataFormatA8:
return 1;
default:
return 0;
}
}
// This function maps SbBlitterPixelDataFormat values to their corresponding
// |SbBlitterSurfaceFormat| value. Note that many |SbBlitterPixelDataFormat|s
// correspond to the same |SbBlitterSurfaceFormat|, so this function is not
// invertible. When creating a |SbBlitterSurface| object from a
// |SbBlitterPixelData| object, the |SbBlitterSurface|'s format will be computed
// from the |SbBlitterPixelData| object by using this function.
static SB_C_FORCE_INLINE SbBlitterSurfaceFormat
SbBlitterPixelDataFormatToSurfaceFormat(SbBlitterPixelDataFormat pixel_format) {
switch (pixel_format) {
case kSbBlitterPixelDataFormatARGB8:
return kSbBlitterSurfaceFormatRGBA8;
case kSbBlitterPixelDataFormatBGRA8:
return kSbBlitterSurfaceFormatRGBA8;
case kSbBlitterPixelDataFormatRGBA8:
return kSbBlitterSurfaceFormatRGBA8;
case kSbBlitterPixelDataFormatA8:
return kSbBlitterSurfaceFormatA8;
default:
return kSbBlitterInvalidSurfaceFormat;
}
}
// Convenience function to setup a rectangle with the specified parameters.
static SB_C_FORCE_INLINE SbBlitterRect SbBlitterMakeRect(int x,
int y,
int width,
int height) {
SbBlitterRect rect;
rect.x = x;
rect.y = y;
rect.width = width;
rect.height = height;
return rect;
}
// Checks whether a blitter device is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsDeviceValid(SbBlitterDevice device) {
return device != kSbBlitterInvalidDevice;
}
// Checks whether a swap chain is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsSwapChainValid(
SbBlitterSwapChain swap_chain) {
return swap_chain != kSbBlitterInvalidSwapChain;
}
// Checks whether a render target is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsRenderTargetValid(
SbBlitterRenderTarget render_target) {
return render_target != kSbBlitterInvalidRenderTarget;
}
// Checks whether a pixel data object is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsPixelDataValid(
SbBlitterPixelData pixel_data) {
return pixel_data != kSbBlitterInvalidPixelData;
}
// Checks whether a surface is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsSurfaceValid(
SbBlitterSurface surface) {
return surface != kSbBlitterInvalidSurface;
}
// Checks whether a blitter context is invalid.
static SB_C_FORCE_INLINE bool SbBlitterIsContextValid(
SbBlitterContext context) {
return context != kSbBlitterInvalidContext;
}
// Creates and returns an |SbBlitterDevice| based on the Blitter API
// implementation's decision of which device should be the default. The returned
// |SbBlitterDevice| represents a connection to a device (like a GPU).
//
// On many platforms there is always one single obvious choice for a device
// to use, and that is the one that this function will return. For example,
// if this is called on a platform that has a single GPU, this call should
// return an object that represents that GPU. On a platform that has no GPU,
// an object representing a software CPU implementation may be returned.
//
// Only one default device can exist within a process at a time.
// This function is thread-safe.
//
// Returns |kSbBlitterInvalidDevice| on failure.
SB_EXPORT SbBlitterDevice SbBlitterCreateDefaultDevice();
// Destroys |device|, cleaning up all resources associated with it.
// This function is thread-safe, but it should not be called if |device| is
// still being accessed elsewhere.
//
// The return value indicates whether the destruction succeeded.
//
// |device|: The SbBlitterDevice object to be destroyed.
SB_EXPORT bool SbBlitterDestroyDevice(SbBlitterDevice device);
// Creates and returns an |SbBlitterSwapChain| that can then be used to send
// graphics to the display. This function links |device| to |window|'s output,
// and drawing to the returned swap chain will result in |device| being used
// to render to |window|.
//
// This function must be called from the thread that called |SbWindowCreate()|
// to create |window|.
//
// Returns |kSbBlitterInvalidSwapChain| on failure.
SB_EXPORT SbBlitterSwapChain
SbBlitterCreateSwapChainFromWindow(SbBlitterDevice device, SbWindow window);
// Destroys |swap_chain|, cleaning up all resources associated with it.
// This function is not thread-safe and must be called on the same thread
// that called |SbBlitterCreateSwapChainFromWindow()|.
//
// The return value indicates whether the destruction succeeded.
//
// |swap_chain|: The SbBlitterSwapChain to be destroyed.
SB_EXPORT bool SbBlitterDestroySwapChain(SbBlitterSwapChain swap_chain);
// Returns the |SbBlitterRenderTarget| object that is owned by |swap_chain|.
// The returned object can be used to provide a target to blitter draw calls
// that draw directly to the display buffer. This function is not thread-safe.
//
// Returns |kSbBlitterInvalidRenderTarget| on failure.
//
// |swap_chain|: The SbBlitterSwapChain for which the target object is being
// retrieved.
SB_EXPORT SbBlitterRenderTarget
SbBlitterGetRenderTargetFromSwapChain(SbBlitterSwapChain swap_chain);
// Indicates whether |device| supports calls to |SbBlitterCreatePixelData|
// with the specified |pixel_format|. This function is thread-safe.
//
// |device|: The device for which compatibility is being checked.
// |pixel_format|: The SbBlitterPixelDataFormat for which compatibility is
// being checked.
SB_EXPORT bool SbBlitterIsPixelFormatSupportedByPixelData(
SbBlitterDevice device,
SbBlitterPixelDataFormat pixel_format);
// Allocates an |SbBlitterPixelData| object through |device| with |width|,
// |height| and |pixel_format|. |pixel_format| must be supported by |device|
// (see |SbBlitterIsPixelFormatSupportedByPixelData()|).
//
// This function is thread-safe.
//
// Calling this function results in the allocation of CPU-accessible
// (though perhaps blitter-device-resident) memory to store pixel data
// of the requested size/format. An |SbBlitterPixelData| object should
// eventually be passed either into a call to
// |SbBlitterCreateSurfaceFromPixelData()| or into a call to
// |SbBlitterDestroyPixelData()|.
//
// Returns |kSbBlitterInvalidPixelData| upon failure.
SB_EXPORT SbBlitterPixelData
SbBlitterCreatePixelData(SbBlitterDevice device,
int width,
int height,
SbBlitterPixelDataFormat pixel_format);
// Destroys |pixel_data|. Note that this function does not need to be called
// and should not be called if |SbBlitterCreateSurfaceFromPixelData()| has been
// called on |pixel_data| before.
//
// This function is thread-safe.
//
// The return value indicates whether the destruction succeeded.
//
// |pixel_data|: The object to be destroyed.
SB_EXPORT bool SbBlitterDestroyPixelData(SbBlitterPixelData pixel_data);
// Retrieves the pitch (in bytes) for |pixel_data|. This indicates the number of
// bytes per row of pixel data in the image.
//
// This function is not thread-safe.
//
// Returns |-1| in the event of an error.
//
// |pixel_data|: The object for which you are retrieving the pitch.
SB_EXPORT int SbBlitterGetPixelDataPitchInBytes(SbBlitterPixelData pixel_data);
// Retrieves a CPU-accessible pointer to the pixel data represented by
// |pixel_data|. This pixel data can be modified by the CPU to initialize it
// on the CPU before calling |SbBlitterCreateSurfaceFromPixelData()|.
//
// Note that the pointer returned here is valid as long as |pixel_data| is
// valid, which means it is valid until either
// |SbBlitterCreateSurfaceFromPixelData()| or |SbBlitterDestroyPixelData()| is
// called.
//
// This function is not thread-safe.
//
// Returns |NULL| in the event of an error.
SB_EXPORT void* SbBlitterGetPixelDataPointer(SbBlitterPixelData pixel_data);
// Creates an |SbBlitterSurface| object on |device|. Note that |device| must
// match the device that was used to create the |SbBlitterPixelData| object
// provided via the |pixel_data| parameter.
//
// This function also destroys the input |pixel_data| object. As a result,
// |pixel_data| should not be accessed again after a call to this function.
//
// The returned object cannot be used as a render target (e.g. calling
// |SbBlitterGetRenderTargetFromSurface()| on it will return
// |kSbBlitterInvalidRenderTarget|).
//
// This function is thread-safe with respect to |device|, but |pixel_data|
// should not be modified on another thread while this function is called.
//
// Returns |kSbBlitterInvalidSurface| in the event of an error.
SB_EXPORT SbBlitterSurface
SbBlitterCreateSurfaceFromPixelData(SbBlitterDevice device,
SbBlitterPixelData pixel_data);
// Indicates whether the |device| supports calls to
// |SbBlitterCreateRenderTargetSurface()| with |surface_format|.
//
// This function is thread-safe.
//
// |device|: The device being checked for compatibility.
// |surface_format|: The surface format being checked for compatibility.
SB_EXPORT bool SbBlitterIsSurfaceFormatSupportedByRenderTargetSurface(
SbBlitterDevice device,
SbBlitterSurfaceFormat surface_format);
// Creates a new surface with undefined pixel data on |device| with the
// specified |width|, |height| and |surface_format|. One can set the pixel data
// on the resulting surface by getting its associated SbBlitterRenderTarget
// object and then calling |SbBlitterGetRenderTargetFromSurface()|.
//
// This function is thread-safe.
//
// Returns |kSbBlitterInvalidSurface| upon failure.
SB_EXPORT SbBlitterSurface
SbBlitterCreateRenderTargetSurface(SbBlitterDevice device,
int width,
int height,
SbBlitterSurfaceFormat surface_format);
// Destroys the |surface| object, cleaning up all resources associated with it.
//
// This function is not thread safe.
//
// The return value indicates whether the destruction succeeded.
//
// |surface|: The object to be destroyed.
SB_EXPORT bool SbBlitterDestroySurface(SbBlitterSurface surface);
// Returns the |SbBlitterRenderTarget| object owned by |surface|. The returned
// object can be used as a target for draw calls.
//
// This function returns |kSbBlitterInvalidRenderTarget| if |surface| is not
// able to provide a render target or on any other error.
//
// This function is not thread-safe.
SB_EXPORT SbBlitterRenderTarget
SbBlitterGetRenderTargetFromSurface(SbBlitterSurface surface);
// Retrieves an |SbBlitterSurfaceInfo| structure, which describes immutable
// parameters of the |surface|, such as its width, height and pixel format.
// The results are set on the output parameter |surface_info|, which cannot
// be |NULL|.
//
// The return value indicates whether the information was retrieved
// successfully.
//
// This function is not thread-safe.
SB_EXPORT bool SbBlitterGetSurfaceInfo(SbBlitterSurface surface,
SbBlitterSurfaceInfo* surface_info);
// Indicates whether the combination of parameter values is valid for calls
// to |SbBlitterDownloadSurfacePixels()|.
//
// This function is not thread-safe.
//
// |surface|: The surface being checked.
// |pixel_format|: The pixel format that would be used on the surface.
SB_EXPORT bool SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels(
SbBlitterSurface surface,
SbBlitterPixelDataFormat pixel_format);
// Downloads |surface| pixel data into CPU memory pointed to by
// |out_pixel_data|, formatted according to the requested |pixel_format| and
// the requested |pitch_in_bytes|. Before calling this function, you can call
// |SbBlitterIsPixelFormatSupportedByDownloadSurfacePixels()| to confirm that
// |pixel_format| is, in fact, valid for |surface|.
//
// When this function is called, it first waits for all previously flushed
// graphics commands to be executed by the device before downloading the data.
// Since this function waits for the pipeline to empty, it should be used
// sparingly, such as within in debug or test environments.
//
// The return value indicates whether the pixel data was downloaded
// successfully.
//
// The returned alpha format is premultiplied.
//
// This function is not thread-safe.
//
// |out_pixel_data|: A pointer to a region of memory with a size of
// surface_height * |pitch_in_bytes| bytes.
SB_EXPORT bool SbBlitterDownloadSurfacePixels(
SbBlitterSurface surface,
SbBlitterPixelDataFormat pixel_format,
int pitch_in_bytes,
void* out_pixel_data);
// Flips the |swap_chain| by making the buffer previously accessible to
// draw commands via |SbBlitterGetRenderTargetFromSwapChain()| visible on the
// display, while another buffer in an initially undefined state is set up
// as the new draw command target. Note that you do not need to call
// |SbBlitterGetRenderTargetFromSwapChain()| again after flipping, the swap
// chain's render target always refers to its current back buffer.
//
// This function stalls the calling thread until the next vertical refresh.
// In addition, to ensure consistency with the Starboard Player API when
// rendering punch-out video, calls to |SbPlayerSetBounds()| do not take effect
// until this method is called.
//
// The return value indicates whether the flip succeeded.
//
// This function is not thread-safe.
//
// |swap_chain|: The SbBlitterSwapChain to be flipped.
SB_EXPORT bool SbBlitterFlipSwapChain(SbBlitterSwapChain swap_chain);
// Returns the maximum number of contexts that |device| can support in
// parallel. Note that devices often support only a single context.
//
// This function is thread-safe.
//
// This function returns |-1| upon failure.
//
// |device|: The SbBlitterDevice for which the maximum number of contexts is
// returned.
SB_EXPORT int SbBlitterGetMaxContexts(SbBlitterDevice device);
// Creates an |SbBlitterContext| object on |device|. The returned context can be
// used to set up draw state and issue draw calls.
//
// Note that there is a limit on the number of contexts that can exist
// simultaneously, which can be queried by calling |SbBlitterGetMaxContexts()|.
// (The limit is often |1|.)
//
// |SbBlitterContext| objects keep track of draw state between a series of draw
// calls. Please refer to the |SbBlitterContext()| definition for more
// information about contexts.
//
// This function is thread-safe.
//
// This function returns |kSbBlitterInvalidContext| upon failure. Note that the
// function fails if it has already been used to create the maximum number of
// contexts.
//
// |device|: The |SbBlitterDevice| for which the |SbBlitterContext| object is
// created.
SB_EXPORT SbBlitterContext SbBlitterCreateContext(SbBlitterDevice device);
// Destroys the specified |context|, freeing all its resources.
//
// This function is not thread-safe.
//
// The return value indicates whether the destruction succeeded.
//
// |context|: The object to be destroyed.
SB_EXPORT bool SbBlitterDestroyContext(SbBlitterContext context);
// Flushes all draw calls previously issued to |context|. Calling this function
// guarantees that the device processes all draw calls issued to this point on
// this |context| before processing any subsequent draw calls on any context.
//
// Before calling |SbBlitterFlipSwapChain()|, it is often prudent to call this
// function to ensure that all draw calls are submitted before the flip occurs.
//
// This function is not thread-safe.
//
// The return value indicates whether the flush succeeded.
//
// |context|: The context for which draw calls are being flushed.
SB_EXPORT bool SbBlitterFlushContext(SbBlitterContext context);
// Sets up |render_target| as the render target that all subsequent draw calls
// made on |context| will use.
//
// This function is not thread-safe.
//
// The return value indicates whether the render target was set successfully.
//
// |context|: The object for which the render target is being set.
// |render_target|: The target that the |context| should use for draw calls.
SB_EXPORT bool SbBlitterSetRenderTarget(SbBlitterContext context,
SbBlitterRenderTarget render_target);
// Sets the blending state for the specified |context|. By default, blending
// is disabled on a |SbBlitterContext|.
//
// This function is not thread-safe.
//
// The return value indicates whether the blending state was set successfully.
//
// |context|: The context for which the blending state is being set.
//
// |blending|: The blending state for the |context|.
// If |blending| is |true|, the source alpha of subsequent draw calls
// is used to blend with the destination color. In particular,
//
// Fc = Sc * Sa + Dc * (1 - Sa)
//
// where:
//
// - |Fc| is the final color.
// - |Sc| is the source color.
// - |Sa| is the source alpha.
// - |Dc| is the destination color.
//
// If |blending| is |false|, the source color and source alpha overwrite
// the destination color and alpha.
SB_EXPORT bool SbBlitterSetBlending(SbBlitterContext context, bool blending);
// Sets the context's current color. The current color's default value is
// |SbBlitterColorFromRGBA(255, 255, 255 255)|.
//
// The current color affects the fill rectangle's color in calls to
// |SbBlitterFillRect()|. If |SbBlitterSetModulateBlitsWithColor()| has been
// called to enable blit color modulation, the source blit surface pixel color
// is also modulated by the color before being output.
//
// This function is not thread-safe.
//
// The return value indicates whether the color was set successfully.
//
// |context|: The context for which the color is being set.
// |color|: The context's new color, specified in unpremultiplied alpha format.
SB_EXPORT bool SbBlitterSetColor(SbBlitterContext context,
SbBlitterColor color);
// Sets whether or not blit calls should have their source pixels modulated by
// the current color, which is set using |SbBlitterSetColor()|, before being
// output. This function can apply opacity to blit calls, color alpha-only
// surfaces, and apply other effects.
//
// This function is not thread-safe.
//
// The return value indicates whether the state was set successfully.
//
// |modulate_blits_with_color|: Indicates whether to modulate source pixels
// in blit calls.
SB_EXPORT bool SbBlitterSetModulateBlitsWithColor(
SbBlitterContext context,
bool modulate_blits_with_color);
// Sets the scissor rectangle, which dictates a visibility area that affects
// all draw calls. Only pixels within the scissor rectangle are rendered, and
// all drawing outside of that area is clipped.
//
// When |SbBlitterSetRenderTarget()| is called, that function automatically sets
// the scissor rectangle to the size of the specified render target. If a
// scissor rectangle is specified outside of the extents of the current render
// target bounds, it will be intersected with the render target bounds.
//
// This function is not thread-safe.
//
// Returns whether the scissor was successfully set. It returns an error if
// it is called before a render target has been specified for the context.
SB_EXPORT bool SbBlitterSetScissor(SbBlitterContext context,
SbBlitterRect rect);
// Issues a draw call on |context| that fills the specified rectangle |rect|.
// The rectangle's color is determined by the last call to
// |SbBlitterSetColor()|.
//
// This function is not thread-safe.
//
// The return value indicates whether the draw call succeeded.
//
// |context|: The context on which the draw call will operate.
// |rect|: The rectangle to be filled.
SB_EXPORT bool SbBlitterFillRect(SbBlitterContext context, SbBlitterRect rect);
// Issues a draw call on |context| that blits the area of |source_surface|
// specified by |src_rect| to |context|'s current render target at |dst_rect|.
// The source rectangle must lie within the dimensions of |source_surface|.
// Note that the |source_surface|'s alpha is modulated by |opacity| before
// being drawn. For |opacity|, a value of 0 implies complete invisibility,
// and a value of 255 implies complete opacity.
//
// This function is not thread-safe.
//
// The return value indicates whether the draw call succeeded.
//
// |src_rect|: The area to be block transferred (blitted).
SB_EXPORT bool SbBlitterBlitRectToRect(SbBlitterContext context,
SbBlitterSurface source_surface,
SbBlitterRect src_rect,
SbBlitterRect dst_rect);
// This function functions identically to SbBlitterBlitRectToRect(), except
// it permits values of |src_rect| outside the dimensions of |source_surface|.
// In those regions, the pixel data from |source_surface| will be wrapped.
// Negative values for |src_rect.x| and |src_rect.y| are allowed.
//
// The output is all stretched to fit inside of |dst_rect|.
//
// This function is not thread-safe.
//
// The return value indicates whether the draw call succeeded.
SB_EXPORT bool SbBlitterBlitRectToRectTiled(SbBlitterContext context,
SbBlitterSurface source_surface,
SbBlitterRect src_rect,
SbBlitterRect dst_rect);
// This function achieves the same effect as calling |SbBlitterBlitRectToRect()|
// |num_rects| times with each of the |num_rects| values of |src_rects| and
// |dst_rects|. This function allows for greater efficiency than looped calls
// to |SbBlitterBlitRectToRect()|.
//
// This function is not thread-safe.
//
// The return value indicates whether the draw call succeeded.
SB_EXPORT bool SbBlitterBlitRectsToRects(SbBlitterContext context,
SbBlitterSurface source_surface,
const SbBlitterRect* src_rects,
const SbBlitterRect* dst_rects,
int num_rects);
#ifdef __cplusplus
} // extern "C"
#endif
#endif // SB_HAS(BLITTER)
#endif // STARBOARD_BLITTER_H_