Show More
Commit Description:
Tweak calculations....
Commit Description:
Tweak calculations.
Prevent a negative number of visitors and separate visitors from donors.
References:
File last commit:
Show/Diff file:
Action:
FNA/lib/FNA3D/include/FNA3D.h
1530 lines | 45.8 KiB | text/x-c | CLexer
1530 lines | 45.8 KiB | text/x-c | CLexer
r690 | /* FNA3D - 3D Graphics Library for FNA | |||
* | ||||
* Copyright (c) 2020-2022 Ethan Lee | ||||
* | ||||
* This software is provided 'as-is', without any express or implied warranty. | ||||
* In no event will the authors be held liable for any damages arising from | ||||
* the use of this software. | ||||
* | ||||
* Permission is granted to anyone to use this software for any purpose, | ||||
* including commercial applications, and to alter it and redistribute it | ||||
* freely, subject to the following restrictions: | ||||
* | ||||
* 1. The origin of this software must not be misrepresented; you must not | ||||
* claim that you wrote the original software. If you use this software in a | ||||
* product, an acknowledgment in the product documentation would be | ||||
* appreciated but is not required. | ||||
* | ||||
* 2. Altered source versions must be plainly marked as such, and must not be | ||||
* misrepresented as being the original software. | ||||
* | ||||
* 3. This notice may not be removed or altered from any source distribution. | ||||
* | ||||
* Ethan "flibitijibibo" Lee <flibitijibibo@flibitijibibo.com> | ||||
* | ||||
*/ | ||||
#ifndef FNA3D_H | ||||
#define FNA3D_H | ||||
#ifdef _WIN32 | ||||
#define FNA3DAPI __declspec(dllexport) | ||||
#define FNA3DCALL __cdecl | ||||
#else | ||||
#define FNA3DAPI | ||||
#define FNA3DCALL | ||||
#endif | ||||
/* -Wpedantic nameless union/struct silencing */ | ||||
#ifndef FNA3DNAMELESS | ||||
#ifdef __GNUC__ | ||||
#define FNA3DNAMELESS __extension__ | ||||
#else | ||||
#define FNA3DNAMELESS | ||||
#endif /* __GNUC__ */ | ||||
#endif /* FNA3DNAMELESS */ | ||||
#include <stdint.h> | ||||
#ifdef __cplusplus | ||||
extern "C" { | ||||
#endif /* __cplusplus */ | ||||
/* Type Declarations */ | ||||
typedef struct FNA3D_Device FNA3D_Device; | ||||
typedef struct FNA3D_Texture FNA3D_Texture; | ||||
typedef struct FNA3D_Buffer FNA3D_Buffer; | ||||
typedef struct FNA3D_Renderbuffer FNA3D_Renderbuffer; | ||||
typedef struct FNA3D_Effect FNA3D_Effect; | ||||
typedef struct FNA3D_Query FNA3D_Query; | ||||
/* Enumerations, should match XNA 4.0 */ | ||||
typedef enum FNA3D_PresentInterval | ||||
{ | ||||
/* For the default presentation interval, we try to use an OS-provided | ||||
* feature (if available) to sync when meeting the target framerate | ||||
* while tearing if the program misses vblank. | ||||
*/ | ||||
FNA3D_PRESENTINTERVAL_DEFAULT, | ||||
FNA3D_PRESENTINTERVAL_ONE, | ||||
FNA3D_PRESENTINTERVAL_TWO, | ||||
FNA3D_PRESENTINTERVAL_IMMEDIATE | ||||
} FNA3D_PresentInterval; | ||||
typedef enum FNA3D_DisplayOrientation | ||||
{ | ||||
FNA3D_DISPLAYORIENTATION_DEFAULT, | ||||
FNA3D_DISPLAYORIENTATION_LANDSCAPELEFT, | ||||
FNA3D_DISPLAYORIENTATION_LANDSCAPERIGHT, | ||||
FNA3D_DISPLAYORIENTATION_PORTRAIT | ||||
} FNA3D_DisplayOrientation; | ||||
typedef enum FNA3D_RenderTargetUsage | ||||
{ | ||||
FNA3D_RENDERTARGETUSAGE_DISCARDCONTENTS, | ||||
FNA3D_RENDERTARGETUSAGE_PRESERVECONTENTS, | ||||
FNA3D_RENDERTARGETUSAGE_PLATFORMCONTENTS | ||||
} FNA3D_RenderTargetUsage; | ||||
typedef enum FNA3D_ClearOptions | ||||
{ | ||||
FNA3D_CLEAROPTIONS_TARGET = 1, | ||||
FNA3D_CLEAROPTIONS_DEPTHBUFFER = 2, | ||||
FNA3D_CLEAROPTIONS_STENCIL = 4 | ||||
} FNA3D_ClearOptions; | ||||
typedef enum FNA3D_PrimitiveType | ||||
{ | ||||
FNA3D_PRIMITIVETYPE_TRIANGLELIST, | ||||
FNA3D_PRIMITIVETYPE_TRIANGLESTRIP, | ||||
FNA3D_PRIMITIVETYPE_LINELIST, | ||||
FNA3D_PRIMITIVETYPE_LINESTRIP, | ||||
FNA3D_PRIMITIVETYPE_POINTLIST_EXT | ||||
} FNA3D_PrimitiveType; | ||||
typedef enum FNA3D_IndexElementSize | ||||
{ | ||||
FNA3D_INDEXELEMENTSIZE_16BIT, | ||||
FNA3D_INDEXELEMENTSIZE_32BIT | ||||
} FNA3D_IndexElementSize; | ||||
typedef enum FNA3D_SurfaceFormat | ||||
{ | ||||
FNA3D_SURFACEFORMAT_COLOR, | ||||
FNA3D_SURFACEFORMAT_BGR565, | ||||
FNA3D_SURFACEFORMAT_BGRA5551, | ||||
FNA3D_SURFACEFORMAT_BGRA4444, | ||||
FNA3D_SURFACEFORMAT_DXT1, | ||||
FNA3D_SURFACEFORMAT_DXT3, | ||||
FNA3D_SURFACEFORMAT_DXT5, | ||||
FNA3D_SURFACEFORMAT_NORMALIZEDBYTE2, | ||||
FNA3D_SURFACEFORMAT_NORMALIZEDBYTE4, | ||||
FNA3D_SURFACEFORMAT_RGBA1010102, | ||||
FNA3D_SURFACEFORMAT_RG32, | ||||
FNA3D_SURFACEFORMAT_RGBA64, | ||||
FNA3D_SURFACEFORMAT_ALPHA8, | ||||
FNA3D_SURFACEFORMAT_SINGLE, | ||||
FNA3D_SURFACEFORMAT_VECTOR2, | ||||
FNA3D_SURFACEFORMAT_VECTOR4, | ||||
FNA3D_SURFACEFORMAT_HALFSINGLE, | ||||
FNA3D_SURFACEFORMAT_HALFVECTOR2, | ||||
FNA3D_SURFACEFORMAT_HALFVECTOR4, | ||||
FNA3D_SURFACEFORMAT_HDRBLENDABLE, | ||||
FNA3D_SURFACEFORMAT_COLORBGRA_EXT, | ||||
FNA3D_SURFACEFORMAT_COLORSRGB_EXT, | ||||
FNA3D_SURFACEFORMAT_DXT5SRGB_EXT, | ||||
FNA3D_SURFACEFORMAT_BC7_EXT, | ||||
FNA3D_SURFACEFORMAT_BC7SRGB_EXT, | ||||
} FNA3D_SurfaceFormat; | ||||
typedef enum FNA3D_DepthFormat | ||||
{ | ||||
FNA3D_DEPTHFORMAT_NONE, | ||||
FNA3D_DEPTHFORMAT_D16, | ||||
FNA3D_DEPTHFORMAT_D24, | ||||
FNA3D_DEPTHFORMAT_D24S8 | ||||
} FNA3D_DepthFormat; | ||||
typedef enum FNA3D_CubeMapFace | ||||
{ | ||||
FNA3D_CUBEMAPFACE_POSITIVEX, | ||||
FNA3D_CUBEMAPFACE_NEGATIVEX, | ||||
FNA3D_CUBEMAPFACE_POSITIVEY, | ||||
FNA3D_CUBEMAPFACE_NEGATIVEY, | ||||
FNA3D_CUBEMAPFACE_POSITIVEZ, | ||||
FNA3D_CUBEMAPFACE_NEGATIVEZ | ||||
} FNA3D_CubeMapFace; | ||||
typedef enum FNA3D_BufferUsage | ||||
{ | ||||
FNA3D_BUFFERUSAGE_NONE, | ||||
FNA3D_BUFFERUSAGE_WRITEONLY | ||||
} FNA3D_BufferUsage; | ||||
typedef enum FNA3D_SetDataOptions | ||||
{ | ||||
FNA3D_SETDATAOPTIONS_NONE, | ||||
FNA3D_SETDATAOPTIONS_DISCARD, | ||||
FNA3D_SETDATAOPTIONS_NOOVERWRITE | ||||
} FNA3D_SetDataOptions; | ||||
typedef enum FNA3D_Blend | ||||
{ | ||||
FNA3D_BLEND_ONE, | ||||
FNA3D_BLEND_ZERO, | ||||
FNA3D_BLEND_SOURCECOLOR, | ||||
FNA3D_BLEND_INVERSESOURCECOLOR, | ||||
FNA3D_BLEND_SOURCEALPHA, | ||||
FNA3D_BLEND_INVERSESOURCEALPHA, | ||||
FNA3D_BLEND_DESTINATIONCOLOR, | ||||
FNA3D_BLEND_INVERSEDESTINATIONCOLOR, | ||||
FNA3D_BLEND_DESTINATIONALPHA, | ||||
FNA3D_BLEND_INVERSEDESTINATIONALPHA, | ||||
FNA3D_BLEND_BLENDFACTOR, | ||||
FNA3D_BLEND_INVERSEBLENDFACTOR, | ||||
FNA3D_BLEND_SOURCEALPHASATURATION | ||||
} FNA3D_Blend; | ||||
typedef enum FNA3D_BlendFunction | ||||
{ | ||||
FNA3D_BLENDFUNCTION_ADD, | ||||
FNA3D_BLENDFUNCTION_SUBTRACT, | ||||
FNA3D_BLENDFUNCTION_REVERSESUBTRACT, | ||||
FNA3D_BLENDFUNCTION_MAX, | ||||
FNA3D_BLENDFUNCTION_MIN | ||||
} FNA3D_BlendFunction; | ||||
typedef enum FNA3D_ColorWriteChannels | ||||
{ | ||||
FNA3D_COLORWRITECHANNELS_NONE = 0, | ||||
FNA3D_COLORWRITECHANNELS_RED = 1, | ||||
FNA3D_COLORWRITECHANNELS_GREEN = 2, | ||||
FNA3D_COLORWRITECHANNELS_BLUE = 4, | ||||
FNA3D_COLORWRITECHANNELS_ALPHA = 8, | ||||
FNA3D_COLORWRITECHANNELS_ALL = 15 | ||||
} FNA3D_ColorWriteChannels; | ||||
typedef enum FNA3D_StencilOperation | ||||
{ | ||||
FNA3D_STENCILOPERATION_KEEP, | ||||
FNA3D_STENCILOPERATION_ZERO, | ||||
FNA3D_STENCILOPERATION_REPLACE, | ||||
FNA3D_STENCILOPERATION_INCREMENT, | ||||
FNA3D_STENCILOPERATION_DECREMENT, | ||||
FNA3D_STENCILOPERATION_INCREMENTSATURATION, | ||||
FNA3D_STENCILOPERATION_DECREMENTSATURATION, | ||||
FNA3D_STENCILOPERATION_INVERT | ||||
} FNA3D_StencilOperation; | ||||
typedef enum FNA3D_CompareFunction | ||||
{ | ||||
FNA3D_COMPAREFUNCTION_ALWAYS, | ||||
FNA3D_COMPAREFUNCTION_NEVER, | ||||
FNA3D_COMPAREFUNCTION_LESS, | ||||
FNA3D_COMPAREFUNCTION_LESSEQUAL, | ||||
FNA3D_COMPAREFUNCTION_EQUAL, | ||||
FNA3D_COMPAREFUNCTION_GREATEREQUAL, | ||||
FNA3D_COMPAREFUNCTION_GREATER, | ||||
FNA3D_COMPAREFUNCTION_NOTEQUAL | ||||
} FNA3D_CompareFunction; | ||||
typedef enum FNA3D_CullMode | ||||
{ | ||||
FNA3D_CULLMODE_NONE, | ||||
FNA3D_CULLMODE_CULLCLOCKWISEFACE, | ||||
FNA3D_CULLMODE_CULLCOUNTERCLOCKWISEFACE | ||||
} FNA3D_CullMode; | ||||
typedef enum FNA3D_FillMode | ||||
{ | ||||
FNA3D_FILLMODE_SOLID, | ||||
FNA3D_FILLMODE_WIREFRAME | ||||
} FNA3D_FillMode; | ||||
typedef enum FNA3D_TextureAddressMode | ||||
{ | ||||
FNA3D_TEXTUREADDRESSMODE_WRAP, | ||||
FNA3D_TEXTUREADDRESSMODE_CLAMP, | ||||
FNA3D_TEXTUREADDRESSMODE_MIRROR | ||||
} FNA3D_TextureAddressMode; | ||||
typedef enum FNA3D_TextureFilter | ||||
{ | ||||
FNA3D_TEXTUREFILTER_LINEAR, | ||||
FNA3D_TEXTUREFILTER_POINT, | ||||
FNA3D_TEXTUREFILTER_ANISOTROPIC, | ||||
FNA3D_TEXTUREFILTER_LINEAR_MIPPOINT, | ||||
FNA3D_TEXTUREFILTER_POINT_MIPLINEAR, | ||||
FNA3D_TEXTUREFILTER_MINLINEAR_MAGPOINT_MIPLINEAR, | ||||
FNA3D_TEXTUREFILTER_MINLINEAR_MAGPOINT_MIPPOINT, | ||||
FNA3D_TEXTUREFILTER_MINPOINT_MAGLINEAR_MIPLINEAR, | ||||
FNA3D_TEXTUREFILTER_MINPOINT_MAGLINEAR_MIPPOINT | ||||
} FNA3D_TextureFilter; | ||||
typedef enum FNA3D_VertexElementFormat | ||||
{ | ||||
FNA3D_VERTEXELEMENTFORMAT_SINGLE, | ||||
FNA3D_VERTEXELEMENTFORMAT_VECTOR2, | ||||
FNA3D_VERTEXELEMENTFORMAT_VECTOR3, | ||||
FNA3D_VERTEXELEMENTFORMAT_VECTOR4, | ||||
FNA3D_VERTEXELEMENTFORMAT_COLOR, | ||||
FNA3D_VERTEXELEMENTFORMAT_BYTE4, | ||||
FNA3D_VERTEXELEMENTFORMAT_SHORT2, | ||||
FNA3D_VERTEXELEMENTFORMAT_SHORT4, | ||||
FNA3D_VERTEXELEMENTFORMAT_NORMALIZEDSHORT2, | ||||
FNA3D_VERTEXELEMENTFORMAT_NORMALIZEDSHORT4, | ||||
FNA3D_VERTEXELEMENTFORMAT_HALFVECTOR2, | ||||
FNA3D_VERTEXELEMENTFORMAT_HALFVECTOR4 | ||||
} FNA3D_VertexElementFormat; | ||||
typedef enum FNA3D_VertexElementUsage | ||||
{ | ||||
FNA3D_VERTEXELEMENTUSAGE_POSITION, | ||||
FNA3D_VERTEXELEMENTUSAGE_COLOR, | ||||
FNA3D_VERTEXELEMENTUSAGE_TEXTURECOORDINATE, | ||||
FNA3D_VERTEXELEMENTUSAGE_NORMAL, | ||||
FNA3D_VERTEXELEMENTUSAGE_BINORMAL, | ||||
FNA3D_VERTEXELEMENTUSAGE_TANGENT, | ||||
FNA3D_VERTEXELEMENTUSAGE_BLENDINDICES, | ||||
FNA3D_VERTEXELEMENTUSAGE_BLENDWEIGHT, | ||||
FNA3D_VERTEXELEMENTUSAGE_DEPTH, | ||||
FNA3D_VERTEXELEMENTUSAGE_FOG, | ||||
FNA3D_VERTEXELEMENTUSAGE_POINTSIZE, | ||||
FNA3D_VERTEXELEMENTUSAGE_SAMPLE, | ||||
FNA3D_VERTEXELEMENTUSAGE_TESSELATEFACTOR | ||||
} FNA3D_VertexElementUsage; | ||||
/* Structures, should match XNA 4.0 */ | ||||
typedef struct FNA3D_Color | ||||
{ | ||||
uint8_t r; | ||||
uint8_t g; | ||||
uint8_t b; | ||||
uint8_t a; | ||||
} FNA3D_Color; | ||||
typedef struct FNA3D_Rect | ||||
{ | ||||
int32_t x; | ||||
int32_t y; | ||||
int32_t w; | ||||
int32_t h; | ||||
} FNA3D_Rect; | ||||
typedef struct FNA3D_Vec4 | ||||
{ | ||||
float x; | ||||
float y; | ||||
float z; | ||||
float w; | ||||
} FNA3D_Vec4; | ||||
typedef struct FNA3D_Viewport | ||||
{ | ||||
int32_t x; | ||||
int32_t y; | ||||
int32_t w; | ||||
int32_t h; | ||||
float minDepth; | ||||
float maxDepth; | ||||
} FNA3D_Viewport; | ||||
typedef struct FNA3D_PresentationParameters | ||||
{ | ||||
int32_t backBufferWidth; | ||||
int32_t backBufferHeight; | ||||
FNA3D_SurfaceFormat backBufferFormat; | ||||
int32_t multiSampleCount; | ||||
void* deviceWindowHandle; | ||||
uint8_t isFullScreen; | ||||
FNA3D_DepthFormat depthStencilFormat; | ||||
FNA3D_PresentInterval presentationInterval; | ||||
FNA3D_DisplayOrientation displayOrientation; | ||||
FNA3D_RenderTargetUsage renderTargetUsage; | ||||
} FNA3D_PresentationParameters; | ||||
typedef struct FNA3D_BlendState | ||||
{ | ||||
FNA3D_Blend colorSourceBlend; | ||||
FNA3D_Blend colorDestinationBlend; | ||||
FNA3D_BlendFunction colorBlendFunction; | ||||
FNA3D_Blend alphaSourceBlend; | ||||
FNA3D_Blend alphaDestinationBlend; | ||||
FNA3D_BlendFunction alphaBlendFunction; | ||||
FNA3D_ColorWriteChannels colorWriteEnable; | ||||
FNA3D_ColorWriteChannels colorWriteEnable1; | ||||
FNA3D_ColorWriteChannels colorWriteEnable2; | ||||
FNA3D_ColorWriteChannels colorWriteEnable3; | ||||
FNA3D_Color blendFactor; | ||||
int32_t multiSampleMask; | ||||
} FNA3D_BlendState; | ||||
typedef struct FNA3D_DepthStencilState | ||||
{ | ||||
uint8_t depthBufferEnable; | ||||
uint8_t depthBufferWriteEnable; | ||||
FNA3D_CompareFunction depthBufferFunction; | ||||
uint8_t stencilEnable; | ||||
int32_t stencilMask; | ||||
int32_t stencilWriteMask; | ||||
uint8_t twoSidedStencilMode; | ||||
FNA3D_StencilOperation stencilFail; | ||||
FNA3D_StencilOperation stencilDepthBufferFail; | ||||
FNA3D_StencilOperation stencilPass; | ||||
FNA3D_CompareFunction stencilFunction; | ||||
FNA3D_StencilOperation ccwStencilFail; | ||||
FNA3D_StencilOperation ccwStencilDepthBufferFail; | ||||
FNA3D_StencilOperation ccwStencilPass; | ||||
FNA3D_CompareFunction ccwStencilFunction; | ||||
int32_t referenceStencil; | ||||
} FNA3D_DepthStencilState; | ||||
typedef struct FNA3D_RasterizerState | ||||
{ | ||||
FNA3D_FillMode fillMode; | ||||
FNA3D_CullMode cullMode; | ||||
float depthBias; | ||||
float slopeScaleDepthBias; | ||||
uint8_t scissorTestEnable; | ||||
uint8_t multiSampleAntiAlias; | ||||
} FNA3D_RasterizerState; | ||||
typedef struct FNA3D_SamplerState | ||||
{ | ||||
FNA3D_TextureFilter filter; | ||||
FNA3D_TextureAddressMode addressU; | ||||
FNA3D_TextureAddressMode addressV; | ||||
FNA3D_TextureAddressMode addressW; | ||||
float mipMapLevelOfDetailBias; | ||||
int32_t maxAnisotropy; | ||||
int32_t maxMipLevel; | ||||
} FNA3D_SamplerState; | ||||
typedef struct FNA3D_VertexElement | ||||
{ | ||||
int32_t offset; | ||||
FNA3D_VertexElementFormat vertexElementFormat; | ||||
FNA3D_VertexElementUsage vertexElementUsage; | ||||
int32_t usageIndex; | ||||
} FNA3D_VertexElement; | ||||
typedef struct FNA3D_VertexDeclaration | ||||
{ | ||||
int32_t vertexStride; | ||||
int32_t elementCount; | ||||
FNA3D_VertexElement *elements; | ||||
} FNA3D_VertexDeclaration; | ||||
typedef struct FNA3D_VertexBufferBinding | ||||
{ | ||||
FNA3D_Buffer *vertexBuffer; | ||||
FNA3D_VertexDeclaration vertexDeclaration; | ||||
int32_t vertexOffset; | ||||
int32_t instanceFrequency; | ||||
} FNA3D_VertexBufferBinding; | ||||
typedef struct FNA3D_RenderTargetBinding | ||||
{ | ||||
/* Basic target information */ | ||||
#define FNA3D_RENDERTARGET_TYPE_2D 0 | ||||
#define FNA3D_RENDERTARGET_TYPE_CUBE 1 | ||||
uint8_t type; | ||||
FNA3DNAMELESS union | ||||
{ | ||||
struct | ||||
{ | ||||
int32_t width; | ||||
int32_t height; | ||||
} twod; | ||||
struct | ||||
{ | ||||
int32_t size; | ||||
FNA3D_CubeMapFace face; | ||||
} cube; | ||||
}; | ||||
/* If this is >1, you MUST call ResolveTarget after rendering! */ | ||||
int32_t levelCount; | ||||
/* If this is >1, colorBuffer MUST be non-NULL! */ | ||||
int32_t multiSampleCount; | ||||
/* Destination texture. This MUST be non-NULL! */ | ||||
FNA3D_Texture *texture; | ||||
/* If this is non-NULL, you MUST call ResolveTarget after rendering! */ | ||||
FNA3D_Renderbuffer *colorBuffer; | ||||
} FNA3D_RenderTargetBinding; | ||||
/* Version API */ | ||||
#define FNA3D_ABI_VERSION 0 | ||||
#define FNA3D_MAJOR_VERSION 22 | ||||
#define FNA3D_MINOR_VERSION 12 | ||||
#define FNA3D_PATCH_VERSION 0 | ||||
#define FNA3D_COMPILED_VERSION ( \ | ||||
(FNA3D_ABI_VERSION * 100 * 100 * 100) + \ | ||||
(FNA3D_MAJOR_VERSION * 100 * 100) + \ | ||||
(FNA3D_MINOR_VERSION * 100) + \ | ||||
(FNA3D_PATCH_VERSION) \ | ||||
) | ||||
FNA3DAPI uint32_t FNA3D_LinkedVersion(void); | ||||
/* Functions */ | ||||
/* Logging */ | ||||
typedef void (FNA3DCALL * FNA3D_LogFunc)(const char *msg); | ||||
/* Reroutes FNA3D's logging to custom logging functions. | ||||
* | ||||
* info: Basic logs that might be useful to have stored for support. | ||||
* warn: Something went wrong, but it's really just annoying, not fatal. | ||||
* error: You better have this stored somewhere because it's crashing now! | ||||
*/ | ||||
FNA3DAPI void FNA3D_HookLogFunctions( | ||||
FNA3D_LogFunc info, | ||||
FNA3D_LogFunc warn, | ||||
FNA3D_LogFunc error | ||||
); | ||||
/* Init/Quit */ | ||||
/* Selects the most suitable graphics rendering backend for the system, then | ||||
* provides the application with context-sensitive bitflags for the OS window. | ||||
* | ||||
* Returns a bitflag value, typically SDL_WindowFlags masks. | ||||
*/ | ||||
FNA3DAPI uint32_t FNA3D_PrepareWindowAttributes(void); | ||||
/* After your device is created, call this to check for high-DPI support. | ||||
* | ||||
* Note that this will NOT work if it's called after the window is created but | ||||
* before the device! Not all platforms create drawable surfaces at the same | ||||
* time as the window! | ||||
* | ||||
* window: The OS window handle, typically an SDL_Window*. | ||||
* w: Filled with the width of the window's drawable canvas. | ||||
* h: Filled with the height of the window's drawable canvas. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetDrawableSize(void* window, int32_t *w, int32_t *h); | ||||
/* Creates a rendering context for use on the calling thread. | ||||
* | ||||
* presentationParameters: The initial device/backbuffer settings. | ||||
* debugMode: Enable debugging and backend validation features | ||||
* at the cost of reduced overall performance. | ||||
* | ||||
* Returns a device ready for use. Be sure to only call device functions from | ||||
* the thread that it was created on! | ||||
*/ | ||||
FNA3DAPI FNA3D_Device* FNA3D_CreateDevice( | ||||
FNA3D_PresentationParameters *presentationParameters, | ||||
uint8_t debugMode | ||||
); | ||||
/* Destroys a rendering context previously returned by FNA3D_CreateDevice. */ | ||||
FNA3DAPI void FNA3D_DestroyDevice(FNA3D_Device *device); | ||||
/* Presentation */ | ||||
/* Presents the backbuffer to the window. | ||||
* | ||||
* sourceRectangle: The region of the buffer to present (or NULL). | ||||
* destinationRectangle: The region of the window to update (or NULL). | ||||
* overrideWindowHandle: The OS window handle (not really "overridden"). | ||||
*/ | ||||
FNA3DAPI void FNA3D_SwapBuffers( | ||||
FNA3D_Device *device, | ||||
FNA3D_Rect *sourceRectangle, | ||||
FNA3D_Rect *destinationRectangle, | ||||
void* overrideWindowHandle | ||||
); | ||||
/* Drawing */ | ||||
/* Clears the active draw buffers of any previous contents. | ||||
* | ||||
* options: Bitflags to specify color/depth/stencil buffers for clearing. | ||||
* color: The new value of the cleared color buffer. It is STRONGLY | ||||
* recommended to use 0.0f and 1.0f for all color channels! | ||||
* depth: The new value of the cleared depth buffer. | ||||
* stencil: The new value of the cleared stencil buffer. | ||||
*/ | ||||
FNA3DAPI void FNA3D_Clear( | ||||
FNA3D_Device *device, | ||||
FNA3D_ClearOptions options, | ||||
FNA3D_Vec4 *color, | ||||
float depth, | ||||
int32_t stencil | ||||
); | ||||
/* Draws data from vertex/index buffers. | ||||
* | ||||
* primitiveType: The primitive topology of the vertex data. | ||||
* baseVertex: The starting offset to read from the vertex buffer. | ||||
* minVertexIndex: The lowest index value expected from the index buffer. | ||||
* numVertices: The highest offset expected from the index buffer. | ||||
* startIndex: The starting offset to read from the index buffer. | ||||
* primitiveCount: The number of primitives to draw. | ||||
* indices: The index buffer to bind for this draw call. | ||||
* indexElementSize: The size of the index type for this index buffer. | ||||
*/ | ||||
FNA3DAPI void FNA3D_DrawIndexedPrimitives( | ||||
FNA3D_Device *device, | ||||
FNA3D_PrimitiveType primitiveType, | ||||
int32_t baseVertex, | ||||
int32_t minVertexIndex, | ||||
int32_t numVertices, | ||||
int32_t startIndex, | ||||
int32_t primitiveCount, | ||||
FNA3D_Buffer *indices, | ||||
FNA3D_IndexElementSize indexElementSize | ||||
); | ||||
/* Draws data from vertex/index buffers with instancing enabled. | ||||
* | ||||
* primitiveType: The primitive topology of the vertex data. | ||||
* baseVertex: The starting offset to read from the vertex buffer. | ||||
* minVertexIndex: The lowest index value expected from the index buffer. | ||||
* numVertices: The highest offset expected from the index buffer. | ||||
* startIndex: The starting offset to read from the index buffer. | ||||
* primitiveCount: The number of primitives to draw. | ||||
* instanceCount: The number of instances that will be drawn. | ||||
* indices: The index buffer to bind for this draw call. | ||||
* indexElementSize: The size of the index type for this index buffer. | ||||
*/ | ||||
FNA3DAPI void FNA3D_DrawInstancedPrimitives( | ||||
FNA3D_Device *device, | ||||
FNA3D_PrimitiveType primitiveType, | ||||
int32_t baseVertex, | ||||
int32_t minVertexIndex, | ||||
int32_t numVertices, | ||||
int32_t startIndex, | ||||
int32_t primitiveCount, | ||||
int32_t instanceCount, | ||||
FNA3D_Buffer *indices, | ||||
FNA3D_IndexElementSize indexElementSize | ||||
); | ||||
/* Draws data from vertex buffers. | ||||
* primitiveType: The primitive topology of the vertex data. | ||||
* vertexStart: The starting offset to read from the vertex buffer. | ||||
* primitiveCount: The number of primitives to draw. | ||||
*/ | ||||
FNA3DAPI void FNA3D_DrawPrimitives( | ||||
FNA3D_Device *device, | ||||
FNA3D_PrimitiveType primitiveType, | ||||
int32_t vertexStart, | ||||
int32_t primitiveCount | ||||
); | ||||
/* Mutable Render States */ | ||||
/* Sets the view dimensions for rendering, relative to the active render target. | ||||
* It is required to call this at least once after calling SetRenderTargets, as | ||||
* the renderer may need to adjust these dimensions to fit the backend's | ||||
* potentially goofy coordinate systems. | ||||
* | ||||
* viewport: The new view dimensions for future draw calls. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetViewport(FNA3D_Device *device, FNA3D_Viewport *viewport); | ||||
/* Sets the scissor box for rendering, relative to the active render target. | ||||
* It is required to call this at least once after calling SetRenderTargets, as | ||||
* the renderer may need to adjust these dimensions to fit the backend's | ||||
* potentially goofy coordinate systems. | ||||
* | ||||
* scissor: The new scissor box for future draw calls. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetScissorRect(FNA3D_Device *device, FNA3D_Rect *scissor); | ||||
/* Gets the blending factor used for current draw calls. | ||||
* | ||||
* blendFactor: Filled with color being used as the device blend factor. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetBlendFactor( | ||||
FNA3D_Device *device, | ||||
FNA3D_Color *blendFactor | ||||
); | ||||
/* Sets the blending factor used for future draw calls. | ||||
* | ||||
* blendFactor: The color to use as the device blend factor. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetBlendFactor( | ||||
FNA3D_Device *device, | ||||
FNA3D_Color *blendFactor | ||||
); | ||||
/* Gets the mask from which multisample fragment data is sampled from. | ||||
* | ||||
* Returns the coverage mask used to determine sample locations. | ||||
*/ | ||||
FNA3DAPI int32_t FNA3D_GetMultiSampleMask(FNA3D_Device *device); | ||||
/* Sets the mask with which multisample fragment data will be sampled from. | ||||
* | ||||
* mask: The new coverage mask to use for determining sample locations. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetMultiSampleMask(FNA3D_Device *device, int32_t mask); | ||||
/* Gets the reference value used for certain types of stencil testing. | ||||
* | ||||
* Returns the stencil reference value. | ||||
*/ | ||||
FNA3DAPI int32_t FNA3D_GetReferenceStencil(FNA3D_Device *device); | ||||
/* Sets the reference value used for certain types of stencil testing. | ||||
* | ||||
* ref: The new stencil reference value. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetReferenceStencil(FNA3D_Device *device, int32_t ref); | ||||
/* Immutable Render States */ | ||||
/* Applies a blending state to use for future draw calls. This only needs to be | ||||
* called when the state actually changes. Redundant calls may negatively affect | ||||
* performance! | ||||
* | ||||
* blendState: The new parameters to use for color blending. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetBlendState( | ||||
FNA3D_Device *device, | ||||
FNA3D_BlendState *blendState | ||||
); | ||||
/* Applies depth/stencil states to use for future draw calls. This only needs to | ||||
* be called when the states actually change. Redundant calls may negatively | ||||
* affect performance! | ||||
* | ||||
* depthStencilState: The new parameters to use for depth/stencil work. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetDepthStencilState( | ||||
FNA3D_Device *device, | ||||
FNA3D_DepthStencilState *depthStencilState | ||||
); | ||||
/* Applies the rasterizing state to use for future draw calls. | ||||
* It's generally a good idea to call this for each draw call, but if you really | ||||
* wanted to you could try reducing it to when the state changes and when the | ||||
* render target state changes. | ||||
* | ||||
* rasterizerState: The new parameters to use for rasterization work. | ||||
*/ | ||||
FNA3DAPI void FNA3D_ApplyRasterizerState( | ||||
FNA3D_Device *device, | ||||
FNA3D_RasterizerState *rasterizerState | ||||
); | ||||
/* Updates a sampler slot with new texture/sampler data for future draw calls. | ||||
* This should only be called on slots that have modified texture/sampler state. | ||||
* Redundant calls may negatively affect performance! | ||||
* | ||||
* index: The sampler slot to update. | ||||
* texture: The texture bound to this sampler. | ||||
* sampler: The new parameters to use for this slot's texture sampling. | ||||
*/ | ||||
FNA3DAPI void FNA3D_VerifySampler( | ||||
FNA3D_Device *device, | ||||
int32_t index, | ||||
FNA3D_Texture *texture, | ||||
FNA3D_SamplerState *sampler | ||||
); | ||||
/* Updates a vertex sampler slot with new texture/sampler data for future draw | ||||
* calls. This should only be called on slots that have modified texture/sampler | ||||
* state. Redundant calls may negatively affect performance! | ||||
* | ||||
* index: The vertex sampler slot to update. | ||||
* texture: The texture bound to this sampler. | ||||
* sampler: The new parameters to use for this slot's texture sampling. | ||||
*/ | ||||
FNA3DAPI void FNA3D_VerifyVertexSampler( | ||||
FNA3D_Device *device, | ||||
int32_t index, | ||||
FNA3D_Texture *texture, | ||||
FNA3D_SamplerState *sampler | ||||
); | ||||
/* Updates the vertex attribute state to read from a set of vertex buffers. This | ||||
* should be the very last thing you call before making a draw call, as this | ||||
* does all the final prep work for the shader program before it's ready to use. | ||||
* | ||||
* bindings: The vertex buffers and their attribute data. | ||||
* numBindings: The number of elements in the bindings array. | ||||
* bindingsUpdated: If the bindings array hasn't changed since the last | ||||
* update, this can be false. We'll only update the shader | ||||
* state, updating vertex attribute data only if we 100% | ||||
* have to, for a tiny performance improvement. | ||||
* baseVertex: This should be the same as the `baseVertex` parameter | ||||
* from your Draw*Primitives call, if applicable. Not every | ||||
* rendering backend has native base vertex support, so we | ||||
* work around it by passing this here. | ||||
*/ | ||||
FNA3DAPI void FNA3D_ApplyVertexBufferBindings( | ||||
FNA3D_Device *device, | ||||
FNA3D_VertexBufferBinding *bindings, | ||||
int32_t numBindings, | ||||
uint8_t bindingsUpdated, | ||||
int32_t baseVertex | ||||
); | ||||
/* Render Targets */ | ||||
/* Sets the color/depth/stencil buffers to write future draw calls to. | ||||
* | ||||
* renderTargets: The targets to write to, or NULL for the backbuffer. | ||||
* numRenderTargets: The size of the renderTargets array (can be 0). | ||||
* depthStencilBuffer: The depth/stencil renderbuffer (can be NULL). | ||||
* depthFormat: The format of the depth/stencil renderbuffer. | ||||
* preserveTargetContents: | ||||
* Set this to 1 to store the color/depth/stencil contents | ||||
* for future use. Most of the time you'll want to | ||||
* keep this at 0 to not waste GPU bandwidth. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetRenderTargets( | ||||
FNA3D_Device *device, | ||||
FNA3D_RenderTargetBinding *renderTargets, | ||||
int32_t numRenderTargets, | ||||
FNA3D_Renderbuffer *depthStencilBuffer, | ||||
FNA3D_DepthFormat depthFormat, | ||||
uint8_t preserveTargetContents | ||||
); | ||||
/* After unsetting a render target, call this to resolve multisample targets or | ||||
* generate mipmap data for the final texture. | ||||
* | ||||
* target: The render target to resolve once rendering is complete. | ||||
*/ | ||||
FNA3DAPI void FNA3D_ResolveTarget( | ||||
FNA3D_Device *device, | ||||
FNA3D_RenderTargetBinding *target | ||||
); | ||||
/* Backbuffer Functions */ | ||||
/* After modifying the OS window state, call this to reset the backbuffer to | ||||
* match your window changes. | ||||
* | ||||
* presentationParameters: The new settings for the backbuffer. | ||||
*/ | ||||
FNA3DAPI void FNA3D_ResetBackbuffer( | ||||
FNA3D_Device *device, | ||||
FNA3D_PresentationParameters *presentationParameters | ||||
); | ||||
/* Read the backbuffer's contents directly into client memory. This function is | ||||
* basically one giant CPU/GPU sync point, do NOT ever call this during any | ||||
* performance-critical situation! Just use it for screenshots. | ||||
* | ||||
* x: The x offset of the backbuffer region to read. | ||||
* y: The y offset of the backbuffer region to read. | ||||
* w: The width of the backbuffer region to read. | ||||
* h: The height of the backbuffer region to read. | ||||
* data: The pointer to read the backbuffer data into. | ||||
* dataLength: The size of the backbuffer data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_ReadBackbuffer( | ||||
FNA3D_Device *device, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Gets the current dimensions of the backbuffer. | ||||
* | ||||
* w: Filled with the backbuffer's width. | ||||
* h: Filled with the backbuffer's height. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetBackbufferSize( | ||||
FNA3D_Device *device, | ||||
int32_t *w, | ||||
int32_t *h | ||||
); | ||||
/* Gets the current pixel format of the backbuffer. | ||||
* | ||||
* Returns the backbuffer's pixel format. | ||||
*/ | ||||
FNA3DAPI FNA3D_SurfaceFormat FNA3D_GetBackbufferSurfaceFormat( | ||||
FNA3D_Device *device | ||||
); | ||||
/* Gets the format of the backbuffer's depth/stencil buffer. | ||||
* | ||||
* Returns the backbuffer's depth/stencil format. | ||||
*/ | ||||
FNA3DAPI FNA3D_DepthFormat FNA3D_GetBackbufferDepthFormat(FNA3D_Device *device); | ||||
/* Gets the multisample sample count of the backbuffer. | ||||
* | ||||
* Returns the backbuffer's multisample sample count. | ||||
*/ | ||||
FNA3DAPI int32_t FNA3D_GetBackbufferMultiSampleCount(FNA3D_Device *device); | ||||
/* Textures */ | ||||
/* Creates a 2D texture to be applied to VerifySampler. | ||||
* | ||||
* format: The pixel format of the texture data. | ||||
* width: The width of the texture image. | ||||
* height: The height of the texture image. | ||||
* levelCount: The number of mipmap levels to allocate. | ||||
* isRenderTarget: Set this to 1 when using this with SetRenderTargets. | ||||
* | ||||
* Returns an allocated FNA3D_Texture* object. Note that the contents of the | ||||
* texture are undefined, so you must call SetData at least once before drawing! | ||||
*/ | ||||
FNA3DAPI FNA3D_Texture* FNA3D_CreateTexture2D( | ||||
FNA3D_Device *device, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t width, | ||||
int32_t height, | ||||
int32_t levelCount, | ||||
uint8_t isRenderTarget | ||||
); | ||||
/* Creates a 3D texture to be applied to VerifySampler. | ||||
* | ||||
* format: The pixel format of the texture data. | ||||
* width: The width of the texture image. | ||||
* height: The height of the texture image. | ||||
* depth: The depth of the texture image. | ||||
* levelCount: The number of mipmap levels to allocate. | ||||
* | ||||
* Returns an allocated FNA3D_Texture* object. Note that the contents of the | ||||
* texture are undefined, so you must call SetData at least once before drawing! | ||||
*/ | ||||
FNA3DAPI FNA3D_Texture* FNA3D_CreateTexture3D( | ||||
FNA3D_Device *device, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t width, | ||||
int32_t height, | ||||
int32_t depth, | ||||
int32_t levelCount | ||||
); | ||||
/* Creates a texture cube to be applied to VerifySampler. | ||||
* | ||||
* format: The pixel format of the texture data. | ||||
* size: The length of a single edge of the texture cube. | ||||
* levelCount: The number of mipmap levels to allocate. | ||||
* isRenderTarget: Set this to 1 when using this with SetRenderTargets. | ||||
* | ||||
* Returns an allocated FNA3D_Texture* object. Note that the contents of the | ||||
* texture are undefined, so you must call SetData at least once before drawing! | ||||
*/ | ||||
FNA3DAPI FNA3D_Texture* FNA3D_CreateTextureCube( | ||||
FNA3D_Device *device, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t size, | ||||
int32_t levelCount, | ||||
uint8_t isRenderTarget | ||||
); | ||||
/* Sends a texture to be destroyed by the renderer. Note that we call it | ||||
* "AddDispose" because it may not be immediately destroyed by the renderer if | ||||
* this is not called from the main thread (for example, if a garbage collector | ||||
* deletes the resource instead of the programmer). | ||||
* | ||||
* texture: The FNA3D_Texture to be destroyed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_AddDisposeTexture( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture | ||||
); | ||||
/* Uploads image data to a 2D texture object. | ||||
* | ||||
* texture: The texture to be updated. | ||||
* x: The x offset of the subregion being updated. | ||||
* y: The y offset of the subregion being updated. | ||||
* w: The width of the subregion being updated. | ||||
* h: The height of the subregion being updated. | ||||
* level: The mipmap level being updated. | ||||
* data: A pointer to the image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetTextureData2D( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Uploads image data to a 3D texture object. | ||||
* | ||||
* texture: The texture to be updated. | ||||
* x: The x offset of the subregion being updated. | ||||
* y: The y offset of the subregion being updated. | ||||
* z: The z offset of the subregion being updated. | ||||
* w: The width of the subregion being updated. | ||||
* h: The height of the subregion being updated. | ||||
* d: The depth of the subregion being updated. | ||||
* level: The mipmap level being updated. | ||||
* data: A pointer to the image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetTextureData3D( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t z, | ||||
int32_t w, | ||||
int32_t h, | ||||
int32_t d, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Uploads image data to a single face of a texture cube object. | ||||
* | ||||
* texture: The texture to be updated. | ||||
* x: The x offset of the subregion being updated. | ||||
* y: The y offset of the subregion being updated. | ||||
* w: The width of the subregion being updated. | ||||
* h: The height of the subregion being updated. | ||||
* cubeMapFace: The face of the cube being updated. | ||||
* level: The mipmap level being updated. | ||||
* data: A pointer to the image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetTextureDataCube( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
FNA3D_CubeMapFace cubeMapFace, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Uploads YUV image data to three ALPHA8 texture objects. | ||||
* | ||||
* y: The texture storing the Y data. | ||||
* u: The texture storing the U (Cb) data. | ||||
* v: The texture storing the V (Cr) data. | ||||
* yWidth: The width of the Y plane. | ||||
* yHeight: The height of the Y plane. | ||||
* uvWidth: The width of the U/V planes. | ||||
* uvHeight: The height of the U/V planes. | ||||
* data: A pointer to the raw YUV image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetTextureDataYUV( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *y, | ||||
FNA3D_Texture *u, | ||||
FNA3D_Texture *v, | ||||
int32_t yWidth, | ||||
int32_t yHeight, | ||||
int32_t uvWidth, | ||||
int32_t uvHeight, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Pulls image data from a 2D texture into client memory. Like any GetData, | ||||
* this is generally asking for a massive CPU/GPU sync point, don't call this | ||||
* unless there's absolutely no other way to use the image data! | ||||
* | ||||
* texture: The texture object being read. | ||||
* x: The x offset of the subregion being read. | ||||
* y: The y offset of the subregion being read. | ||||
* w: The width of the subregion being read. | ||||
* h: The height of the subregion being read. | ||||
* level: The mipmap level being read. | ||||
* data: The pointer being filled with the image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetTextureData2D( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Pulls image data from a 3D texture into client memory. Like any GetData, | ||||
* this is generally asking for a massive CPU/GPU sync point, don't call this | ||||
* unless there's absolutely no other way to use the image data! | ||||
* | ||||
* texture: The texture object being read. | ||||
* x: The x offset of the subregion being read. | ||||
* y: The y offset of the subregion being read. | ||||
* z: The z offset of the subregion being read. | ||||
* w: The width of the subregion being read. | ||||
* h: The height of the subregion being read. | ||||
* d: The depth of the subregion being read. | ||||
* level: The mipmap level being read. | ||||
* data: The pointer being filled with the image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetTextureData3D( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t z, | ||||
int32_t w, | ||||
int32_t h, | ||||
int32_t d, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Pulls image data from a single face of a texture cube object into client | ||||
* memory. Like any GetData, this is generally asking for a massive CPU/GPU sync | ||||
* point, don't call this unless there's absolutely no other way to use the | ||||
* image data! | ||||
* | ||||
* texture: The texture object being read. | ||||
* x: The x offset of the subregion being read. | ||||
* y: The y offset of the subregion being read. | ||||
* w: The width of the subregion being read. | ||||
* h: The height of the subregion being read. | ||||
* cubeMapFace: The face of the cube being read. | ||||
* level: The mipmap level being read. | ||||
* data: The pointer being filled with the image data. | ||||
* dataLength: The size of the image data in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetTextureDataCube( | ||||
FNA3D_Device *device, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
FNA3D_CubeMapFace cubeMapFace, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Renderbuffers */ | ||||
/* Creates a color buffer to be used by SetRenderTargets/ResolveTarget. | ||||
* | ||||
* width: The width of the color buffer. | ||||
* height: The height of the color buffer. | ||||
* format: The pixel format of the color buffer. | ||||
* multiSampleCount: The MSAA value for the color buffer. | ||||
* texture: The texture that this buffer will be resolving to. | ||||
* | ||||
* Returns a color FNA3D_Renderbuffer object. | ||||
*/ | ||||
FNA3DAPI FNA3D_Renderbuffer* FNA3D_GenColorRenderbuffer( | ||||
FNA3D_Device *device, | ||||
int32_t width, | ||||
int32_t height, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t multiSampleCount, | ||||
FNA3D_Texture *texture | ||||
); | ||||
/* Creates a depth/stencil buffer to be used by SetRenderTargets. | ||||
* | ||||
* width: The width of the depth/stencil buffer. | ||||
* height: The height of the depth/stencil buffer. | ||||
* format: The storage format of the depth/stencil buffer. | ||||
* multiSampleCount: The MSAA value for the depth/stencil buffer. | ||||
* | ||||
* Returns a depth/stencil FNA3D_Renderbuffer object. | ||||
*/ | ||||
FNA3DAPI FNA3D_Renderbuffer* FNA3D_GenDepthStencilRenderbuffer( | ||||
FNA3D_Device *device, | ||||
int32_t width, | ||||
int32_t height, | ||||
FNA3D_DepthFormat format, | ||||
int32_t multiSampleCount | ||||
); | ||||
/* Sends a renderbuffer to be destroyed by the renderer. Note that we call it | ||||
* "AddDispose" because it may not be immediately destroyed by the renderer if | ||||
* this is not called from the main thread (for example, if a garbage collector | ||||
* deletes the resource instead of the programmer). | ||||
* | ||||
* renderbuffer: The FNA3D_Renderbuffer to be destroyed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_AddDisposeRenderbuffer( | ||||
FNA3D_Device *device, | ||||
FNA3D_Renderbuffer *renderbuffer | ||||
); | ||||
/* Vertex Buffers */ | ||||
/* Creates a vertex buffer to be used by Draw*Primitives. | ||||
* | ||||
* dynamic: Set to 1 if this buffer will be updated frequently. | ||||
* usage: Set to WRITEONLY if you do not intend to call GetData. | ||||
* sizeInBytes: The length of the vertex buffer. | ||||
* | ||||
* Returns an allocated FNA3D_Buffer* object. Note that the contents of the | ||||
* buffer are undefined, so you must call SetData at least once before drawing! | ||||
*/ | ||||
FNA3DAPI FNA3D_Buffer* FNA3D_GenVertexBuffer( | ||||
FNA3D_Device *device, | ||||
uint8_t dynamic, | ||||
FNA3D_BufferUsage usage, | ||||
int32_t sizeInBytes | ||||
); | ||||
/* Sends a vertex buffer to be destroyed by the renderer. Note that we call it | ||||
* "AddDispose" because it may not be immediately destroyed by the renderer if | ||||
* this is not called from the main thread (for example, if a garbage collector | ||||
* deletes the resource instead of the programmer). | ||||
* | ||||
* buffer: The FNA3D_Buffer to be destroyed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_AddDisposeVertexBuffer( | ||||
FNA3D_Device *device, | ||||
FNA3D_Buffer *buffer | ||||
); | ||||
/* Sets a region of the vertex buffer with client data. | ||||
* | ||||
* buffer: The vertex buffer to be updated. | ||||
* offsetInBytes: The starting offset of the buffer to write into. | ||||
* data: The client data to write into the buffer. | ||||
* elementCount: The number of elements from the client buffer to write. | ||||
* elementSizeInBytes: The size of each element in the client buffer. | ||||
* vertexStride: Try to set this to the same value as elementSizeInBytes. | ||||
* XNA has this ridiculous thing where if vertexStride is | ||||
* greater than elementSizeInBytes, it tries to do partial | ||||
* updates of each vertex with the client data's smaller | ||||
* elements. It's... just, really bad. Don't try to use it. | ||||
* You probably just want '1' for both parameters, so that | ||||
* elementCount can just be the buffer length in bytes. | ||||
* options: Try not to call NONE if this is a dynamic buffer! | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetVertexBufferData( | ||||
FNA3D_Device *device, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t elementCount, | ||||
int32_t elementSizeInBytes, | ||||
int32_t vertexStride, | ||||
FNA3D_SetDataOptions options | ||||
); | ||||
/* Pulls data from a region of the vertex buffer into a client pointer. | ||||
* | ||||
* buffer: The vertex buffer to be read from. | ||||
* offsetInBytes: The starting offset of the buffer to write into. | ||||
* data: The client data to write into from the buffer. | ||||
* elementCount: The number of elements from the client buffer to read. | ||||
* elementSizeInBytes: The size of each element in the client buffer. | ||||
* vertexStride: Try to set this to the same value as elementSizeInBytes. | ||||
* XNA has this ridiculous thing where if vertexStride is | ||||
* greater than elementSizeInBytes, it tries to do partial | ||||
* updates of each vertex with the client data's smaller | ||||
* elements. It's... just, really bad. Don't try to use it. | ||||
* You probably just want '1' for both parameters, so that | ||||
* elementCount can just be the buffer length in bytes. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetVertexBufferData( | ||||
FNA3D_Device *device, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t elementCount, | ||||
int32_t elementSizeInBytes, | ||||
int32_t vertexStride | ||||
); | ||||
/* Index Buffers */ | ||||
/* Creates an index buffer to be used by Draw*Primitives. | ||||
* | ||||
* dynamic: Set to 1 if this buffer will be updated frequently. | ||||
* usage: Set to WRITEONLY if you do not intend to call GetData. | ||||
* sizeInBytes: The length of the vertex buffer. | ||||
* | ||||
* Returns an allocated FNA3D_Buffer* object. Note that the contents of the | ||||
* buffer are undefined, so you must call SetData at least once before drawing! | ||||
*/ | ||||
FNA3DAPI FNA3D_Buffer* FNA3D_GenIndexBuffer( | ||||
FNA3D_Device *device, | ||||
uint8_t dynamic, | ||||
FNA3D_BufferUsage usage, | ||||
int32_t sizeInBytes | ||||
); | ||||
/* Sends an index buffer to be destroyed by the renderer. Note that we call it | ||||
* "AddDispose" because it may not be immediately destroyed by the renderer if | ||||
* this is not called from the main thread (for example, if a garbage collector | ||||
* deletes the resource instead of the programmer). | ||||
* | ||||
* buffer: The FNA3D_Buffer to be destroyed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_AddDisposeIndexBuffer( | ||||
FNA3D_Device *device, | ||||
FNA3D_Buffer *buffer | ||||
); | ||||
/* Sets a region of the index buffer with client data. | ||||
* | ||||
* buffer: The index buffer to be updated. | ||||
* offsetInBytes: The starting offset of the buffer to write into. | ||||
* data: The client data to write into the buffer. | ||||
* dataLength: The size (in bytes) of the client data. | ||||
* options: Try not to call NONE if this is a dynamic buffer! | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetIndexBufferData( | ||||
FNA3D_Device *device, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t dataLength, | ||||
FNA3D_SetDataOptions options | ||||
); | ||||
/* Pulls data from a region of the index buffer into a client pointer. | ||||
* | ||||
* buffer: The index buffer to be read from. | ||||
* offsetInBytes: The starting offset of the buffer to read from. | ||||
* data: The pointer to read buffer data into. | ||||
* dataLength: The size (in bytes) of the client data. | ||||
*/ | ||||
FNA3DAPI void FNA3D_GetIndexBufferData( | ||||
FNA3D_Device *device, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Effects */ | ||||
/* When using this API, be sure to include mojoshader.h! */ | ||||
#ifndef _INCL_MOJOSHADER_H_ | ||||
typedef struct MOJOSHADER_effect MOJOSHADER_effect; | ||||
typedef struct MOJOSHADER_effectTechnique MOJOSHADER_effectTechnique; | ||||
typedef struct MOJOSHADER_effectStateChanges MOJOSHADER_effectStateChanges; | ||||
#endif /* _INCL_MOJOSHADER_H_ */ | ||||
/* Parses and compiles a Direct3D 9 Effects Framework binary. | ||||
* | ||||
* effectCode: The D3D9 Effect binary blob. | ||||
* effectCodeLength: The size (in bytes) of the blob. | ||||
* effect: Filled with the compiled FNA3D_Effect*. | ||||
* effectData: Filled with the parsed Effect Framework data. This | ||||
* pointer is valid until the effect is disposed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_CreateEffect( | ||||
FNA3D_Device *device, | ||||
uint8_t *effectCode, | ||||
uint32_t effectCodeLength, | ||||
FNA3D_Effect **effect, | ||||
MOJOSHADER_effect **effectData | ||||
); | ||||
/* Copies a compiled Effect, including its current technique/parameter data. | ||||
* | ||||
* cloneSource: The FNA3D_Effect to copy. | ||||
* effect: Filled with the new compiled FNA3D_Effect*. | ||||
* effectData: Filled with the copied Effect Framework data. | ||||
*/ | ||||
FNA3DAPI void FNA3D_CloneEffect( | ||||
FNA3D_Device *device, | ||||
FNA3D_Effect *cloneSource, | ||||
FNA3D_Effect **effect, | ||||
MOJOSHADER_effect **effectData | ||||
); | ||||
/* Sends an Effect to be destroyed by the renderer. Note that we call it | ||||
* "AddDispose" because it may not be immediately destroyed by the renderer if | ||||
* this is not called from the main thread (for example, if a garbage collector | ||||
* deletes the resource instead of the programmer). | ||||
* | ||||
* effect: The FNA3D_Effect to be destroyed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_AddDisposeEffect( | ||||
FNA3D_Device *device, | ||||
FNA3D_Effect *effect | ||||
); | ||||
/* Sets the active technique on the Effect. | ||||
* | ||||
* effect: The Effect to be modified. | ||||
* technique: The technique to be used by future ApplyEffect calls. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetEffectTechnique( | ||||
FNA3D_Device *device, | ||||
FNA3D_Effect *effect, | ||||
MOJOSHADER_effectTechnique *technique | ||||
); | ||||
/* Applies an effect pass from a given Effect, setting the active shader program | ||||
* and committing any parameter data changes to be used by future draw calls. | ||||
* | ||||
* effect: The Effect to be applied. | ||||
* pass: The current technique's pass index to be applied. | ||||
* stateChanges: Structure to be filled with any render state changes | ||||
* made by the Effect. This must be valid for the entire | ||||
* duration that this Effect is being applied. | ||||
*/ | ||||
FNA3DAPI void FNA3D_ApplyEffect( | ||||
FNA3D_Device *device, | ||||
FNA3D_Effect *effect, | ||||
uint32_t pass, | ||||
MOJOSHADER_effectStateChanges *stateChanges | ||||
); | ||||
/* Applies an effect pass from a given Effect, setting the active shader program | ||||
* and committing and parameter data changes to be used by future draw calls, | ||||
* while also caching the current program object to be stored once this Effect's | ||||
* pass has been completed. | ||||
* | ||||
* effect: The Effect to be applied. | ||||
* stateChanges: Structure to be filled with any render state changes | ||||
* made by the Effect. This must be valid for the entire | ||||
* duration that this Effect is being applied. | ||||
*/ | ||||
FNA3DAPI void FNA3D_BeginPassRestore( | ||||
FNA3D_Device *device, | ||||
FNA3D_Effect *effect, | ||||
MOJOSHADER_effectStateChanges *stateChanges | ||||
); | ||||
/* Ends a pass started by BeginPassRestore, unsetting the current Effect and | ||||
* restoring the previous shader state from before BeginPassRestore was called. | ||||
* | ||||
* effect: The Effect that was applied at BeginPassRestore. | ||||
*/ | ||||
FNA3DAPI void FNA3D_EndPassRestore( | ||||
FNA3D_Device *device, | ||||
FNA3D_Effect *effect | ||||
); | ||||
/* Queries */ | ||||
/* Creates an object used to run occlusion queries. | ||||
* | ||||
* Returns an FNA3D_Query object. | ||||
*/ | ||||
FNA3DAPI FNA3D_Query* FNA3D_CreateQuery(FNA3D_Device *device); | ||||
/* Sends a query object to be destroyed by the renderer. Note that we call it | ||||
* "AddDispose" because it may not be immediately destroyed by the renderer if | ||||
* this is not called from the main thread (for example, if a garbage collector | ||||
* deletes the resource instead of the programmer). | ||||
* | ||||
* query: The FNA3D_Query to be destroyed. | ||||
*/ | ||||
FNA3DAPI void FNA3D_AddDisposeQuery(FNA3D_Device *device, FNA3D_Query *query); | ||||
/* Marks the start of when a query object should count pixels written. | ||||
* | ||||
* query: The FNA3D_Query to start. | ||||
*/ | ||||
FNA3DAPI void FNA3D_QueryBegin(FNA3D_Device *device, FNA3D_Query *query); | ||||
/* Marks the end of when a query object should count pixels written. Note that | ||||
* this does NOT mean the query has finished executing, you will need to poll | ||||
* QueryComplete before checking the pixel count. | ||||
* | ||||
* query: The FNA3D_Query to stop. | ||||
*/ | ||||
FNA3DAPI void FNA3D_QueryEnd(FNA3D_Device *device, FNA3D_Query *query); | ||||
/* Call this until the function returns 1 to safely query for pixel counts. | ||||
* | ||||
* query: The FNA3D_Query to sync with. | ||||
* | ||||
* Returns 1 when complete, 0 when still in execution. | ||||
*/ | ||||
FNA3DAPI uint8_t FNA3D_QueryComplete(FNA3D_Device *device, FNA3D_Query *query); | ||||
/* Query the pixels counted between the begin/end markers set for the object. | ||||
* | ||||
* query: The FNA3D_Query to poll for pixel count | ||||
* | ||||
* Returns the pixels written during the begin/end period. | ||||
*/ | ||||
FNA3DAPI int32_t FNA3D_QueryPixelCount( | ||||
FNA3D_Device *device, | ||||
FNA3D_Query *query | ||||
); | ||||
/* Feature Queries */ | ||||
/* Returns 1 if the renderer natively supports DXT1 texture data. */ | ||||
FNA3DAPI uint8_t FNA3D_SupportsDXT1(FNA3D_Device *device); | ||||
/* Returns 1 if the renderer natively supports S3TC texture data. */ | ||||
FNA3DAPI uint8_t FNA3D_SupportsS3TC(FNA3D_Device *device); | ||||
/* Returns 1 if the renderer natively supports BC7 texture data. */ | ||||
FNA3DAPI uint8_t FNA3D_SupportsBC7(FNA3D_Device *device); | ||||
/* Returns 1 if the renderer natively supports hardware instancing. */ | ||||
FNA3DAPI uint8_t FNA3D_SupportsHardwareInstancing(FNA3D_Device *device); | ||||
/* Returns 1 if the renderer natively supports asynchronous buffer writing. */ | ||||
FNA3DAPI uint8_t FNA3D_SupportsNoOverwrite(FNA3D_Device *device); | ||||
/* Returns 1 if the renderer natively supports SRGB render targets. */ | ||||
FNA3DAPI uint8_t FNA3D_SupportsSRGBRenderTargets(FNA3D_Device *device); | ||||
/* Returns the number of sampler slots supported by the renderer. */ | ||||
FNA3DAPI void FNA3D_GetMaxTextureSlots( | ||||
FNA3D_Device *device, | ||||
int32_t *textures, | ||||
int32_t *vertexTextures | ||||
); | ||||
/* Returns the highest multisample count supported for anti-aliasing. | ||||
* | ||||
* format: The pixel format to query for MSAA support. | ||||
* multiSampleCount: The max MSAA value requested for this format. | ||||
* | ||||
* Returns a hardware-specific version of min(preferred, possible). | ||||
*/ | ||||
FNA3DAPI int32_t FNA3D_GetMaxMultiSampleCount( | ||||
FNA3D_Device *device, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t multiSampleCount | ||||
); | ||||
/* Debugging */ | ||||
/* Sets an arbitrary string constant to be stored in a rendering API trace, | ||||
* useful for labeling call streams for debugging purposes. | ||||
* | ||||
* text: The string constant to mark in the API call stream. | ||||
*/ | ||||
FNA3DAPI void FNA3D_SetStringMarker(FNA3D_Device *device, const char *text); | ||||
#ifdef __cplusplus | ||||
} | ||||
#endif /* __cplusplus */ | ||||
#endif /* FNA3D_H */ | ||||
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | ||||