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/src/FNA3D_Driver.h
828 lines | 20.8 KiB | text/x-c | CLexer
828 lines | 20.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_DRIVER_H | ||||
#define FNA3D_DRIVER_H | ||||
#include "mojoshader.h" | ||||
#include "FNA3D.h" | ||||
#include "FNA3D_SysRenderer.h" | ||||
/* Windows/Visual Studio cruft */ | ||||
#ifdef _WIN32 | ||||
#define inline __inline | ||||
#endif | ||||
/* Logging */ | ||||
extern void FNA3D_LogInfo(const char *fmt, ...); | ||||
extern void FNA3D_LogWarn(const char *fmt, ...); | ||||
extern void FNA3D_LogError(const char *fmt, ...); | ||||
/* Internal Helper Utilities */ | ||||
#define LinkedList_Add(start, toAdd, curr) \ | ||||
toAdd->next = NULL; \ | ||||
if (start == NULL) \ | ||||
{ \ | ||||
start = toAdd; \ | ||||
} \ | ||||
else \ | ||||
{ \ | ||||
curr = start; \ | ||||
while (curr->next != NULL) \ | ||||
{ \ | ||||
curr = curr->next; \ | ||||
} \ | ||||
curr->next = toAdd; \ | ||||
} | ||||
/* This macro does NOT destroy `toRemove`! | ||||
* It only removes the element from the list. | ||||
*/ | ||||
#define LinkedList_Remove(start, toRemove, curr, prev) \ | ||||
curr = start; \ | ||||
while (curr != NULL) \ | ||||
{ \ | ||||
if (curr == toRemove) \ | ||||
{ \ | ||||
if (curr == start) \ | ||||
{ \ | ||||
start = curr->next; \ | ||||
} \ | ||||
else \ | ||||
{ \ | ||||
prev->next = curr->next; \ | ||||
} \ | ||||
break; \ | ||||
} \ | ||||
prev = curr; \ | ||||
curr = curr->next; \ | ||||
} \ | ||||
if (curr == NULL) \ | ||||
{ \ | ||||
SDL_assert(0 && "LinkedList element not found!"); \ | ||||
} \ | ||||
static inline int32_t Texture_GetBlockSize( | ||||
FNA3D_SurfaceFormat format | ||||
) { | ||||
switch (format) | ||||
{ | ||||
case FNA3D_SURFACEFORMAT_DXT1: | ||||
case FNA3D_SURFACEFORMAT_DXT3: | ||||
case FNA3D_SURFACEFORMAT_DXT5: | ||||
case FNA3D_SURFACEFORMAT_DXT5SRGB_EXT: | ||||
case FNA3D_SURFACEFORMAT_BC7_EXT: | ||||
case FNA3D_SURFACEFORMAT_BC7SRGB_EXT: | ||||
return 4; | ||||
case FNA3D_SURFACEFORMAT_ALPHA8: | ||||
case FNA3D_SURFACEFORMAT_BGR565: | ||||
case FNA3D_SURFACEFORMAT_BGRA4444: | ||||
case FNA3D_SURFACEFORMAT_BGRA5551: | ||||
case FNA3D_SURFACEFORMAT_HALFSINGLE: | ||||
case FNA3D_SURFACEFORMAT_NORMALIZEDBYTE2: | ||||
case FNA3D_SURFACEFORMAT_COLOR: | ||||
case FNA3D_SURFACEFORMAT_SINGLE: | ||||
case FNA3D_SURFACEFORMAT_RG32: | ||||
case FNA3D_SURFACEFORMAT_HALFVECTOR2: | ||||
case FNA3D_SURFACEFORMAT_NORMALIZEDBYTE4: | ||||
case FNA3D_SURFACEFORMAT_RGBA1010102: | ||||
case FNA3D_SURFACEFORMAT_COLORBGRA_EXT: | ||||
case FNA3D_SURFACEFORMAT_COLORSRGB_EXT: | ||||
case FNA3D_SURFACEFORMAT_HALFVECTOR4: | ||||
case FNA3D_SURFACEFORMAT_RGBA64: | ||||
case FNA3D_SURFACEFORMAT_VECTOR2: | ||||
case FNA3D_SURFACEFORMAT_HDRBLENDABLE: | ||||
case FNA3D_SURFACEFORMAT_VECTOR4: | ||||
return 1; | ||||
default: | ||||
FNA3D_LogError( | ||||
"Unrecognized SurfaceFormat!" | ||||
); | ||||
return 0; | ||||
} | ||||
} | ||||
static inline int32_t Texture_GetFormatSize( | ||||
FNA3D_SurfaceFormat format | ||||
) { | ||||
switch (format) | ||||
{ | ||||
case FNA3D_SURFACEFORMAT_DXT1: | ||||
return 8; | ||||
case FNA3D_SURFACEFORMAT_DXT3: | ||||
case FNA3D_SURFACEFORMAT_DXT5: | ||||
case FNA3D_SURFACEFORMAT_DXT5SRGB_EXT: | ||||
case FNA3D_SURFACEFORMAT_BC7_EXT: | ||||
case FNA3D_SURFACEFORMAT_BC7SRGB_EXT: | ||||
return 16; | ||||
case FNA3D_SURFACEFORMAT_ALPHA8: | ||||
return 1; | ||||
case FNA3D_SURFACEFORMAT_BGR565: | ||||
case FNA3D_SURFACEFORMAT_BGRA4444: | ||||
case FNA3D_SURFACEFORMAT_BGRA5551: | ||||
case FNA3D_SURFACEFORMAT_HALFSINGLE: | ||||
case FNA3D_SURFACEFORMAT_NORMALIZEDBYTE2: | ||||
return 2; | ||||
case FNA3D_SURFACEFORMAT_COLOR: | ||||
case FNA3D_SURFACEFORMAT_SINGLE: | ||||
case FNA3D_SURFACEFORMAT_RG32: | ||||
case FNA3D_SURFACEFORMAT_HALFVECTOR2: | ||||
case FNA3D_SURFACEFORMAT_NORMALIZEDBYTE4: | ||||
case FNA3D_SURFACEFORMAT_RGBA1010102: | ||||
case FNA3D_SURFACEFORMAT_COLORBGRA_EXT: | ||||
case FNA3D_SURFACEFORMAT_COLORSRGB_EXT: | ||||
return 4; | ||||
case FNA3D_SURFACEFORMAT_HALFVECTOR4: | ||||
case FNA3D_SURFACEFORMAT_RGBA64: | ||||
case FNA3D_SURFACEFORMAT_VECTOR2: | ||||
case FNA3D_SURFACEFORMAT_HDRBLENDABLE: | ||||
return 8; | ||||
case FNA3D_SURFACEFORMAT_VECTOR4: | ||||
return 16; | ||||
default: | ||||
FNA3D_LogError( | ||||
"Unrecognized SurfaceFormat!" | ||||
); | ||||
return 0; | ||||
} | ||||
} | ||||
static inline int32_t PrimitiveVerts( | ||||
FNA3D_PrimitiveType primitiveType, | ||||
int32_t primitiveCount | ||||
) { | ||||
switch (primitiveType) | ||||
{ | ||||
case FNA3D_PRIMITIVETYPE_TRIANGLELIST: | ||||
return primitiveCount * 3; | ||||
case FNA3D_PRIMITIVETYPE_TRIANGLESTRIP: | ||||
return primitiveCount + 2; | ||||
case FNA3D_PRIMITIVETYPE_LINELIST: | ||||
return primitiveCount * 2; | ||||
case FNA3D_PRIMITIVETYPE_LINESTRIP: | ||||
return primitiveCount + 1; | ||||
case FNA3D_PRIMITIVETYPE_POINTLIST_EXT: | ||||
return primitiveCount; | ||||
default: | ||||
FNA3D_LogError( | ||||
"Unrecognized primitive type!" | ||||
); | ||||
return 0; | ||||
} | ||||
} | ||||
static inline MOJOSHADER_usage VertexAttribUsage( | ||||
FNA3D_VertexElementUsage usage | ||||
) { | ||||
switch (usage) | ||||
{ | ||||
case FNA3D_VERTEXELEMENTUSAGE_POSITION: | ||||
return MOJOSHADER_USAGE_POSITION; | ||||
case FNA3D_VERTEXELEMENTUSAGE_COLOR: | ||||
return MOJOSHADER_USAGE_COLOR; | ||||
case FNA3D_VERTEXELEMENTUSAGE_TEXTURECOORDINATE: | ||||
return MOJOSHADER_USAGE_TEXCOORD; | ||||
case FNA3D_VERTEXELEMENTUSAGE_NORMAL: | ||||
return MOJOSHADER_USAGE_NORMAL; | ||||
case FNA3D_VERTEXELEMENTUSAGE_BINORMAL: | ||||
return MOJOSHADER_USAGE_BINORMAL; | ||||
case FNA3D_VERTEXELEMENTUSAGE_TANGENT: | ||||
return MOJOSHADER_USAGE_TANGENT; | ||||
case FNA3D_VERTEXELEMENTUSAGE_BLENDINDICES: | ||||
return MOJOSHADER_USAGE_BLENDINDICES; | ||||
case FNA3D_VERTEXELEMENTUSAGE_BLENDWEIGHT: | ||||
return MOJOSHADER_USAGE_BLENDWEIGHT; | ||||
case FNA3D_VERTEXELEMENTUSAGE_FOG: | ||||
return MOJOSHADER_USAGE_FOG; | ||||
case FNA3D_VERTEXELEMENTUSAGE_POINTSIZE: | ||||
return MOJOSHADER_USAGE_POINTSIZE; | ||||
case FNA3D_VERTEXELEMENTUSAGE_SAMPLE: | ||||
return MOJOSHADER_USAGE_SAMPLE; | ||||
case FNA3D_VERTEXELEMENTUSAGE_TESSELATEFACTOR: | ||||
return MOJOSHADER_USAGE_TESSFACTOR; | ||||
default: | ||||
FNA3D_LogError( | ||||
"Unrecognized VertexElementUsage!" | ||||
); | ||||
return (MOJOSHADER_usage) 0; | ||||
} | ||||
} | ||||
static inline int32_t IndexSize(FNA3D_IndexElementSize size) | ||||
{ | ||||
return (size == FNA3D_INDEXELEMENTSIZE_16BIT) ? 2 : 4; | ||||
} | ||||
static inline int32_t BytesPerRow( | ||||
int32_t width, | ||||
FNA3D_SurfaceFormat format | ||||
) { | ||||
int32_t blocksPerRow = width; | ||||
int32_t blockSize = Texture_GetBlockSize(format); | ||||
if (blockSize > 1) | ||||
{ | ||||
blocksPerRow = (width + blockSize - 1) / blockSize; | ||||
} | ||||
return blocksPerRow * Texture_GetFormatSize(format); | ||||
} | ||||
static inline int32_t BytesPerImage( | ||||
int32_t width, | ||||
int32_t height, | ||||
FNA3D_SurfaceFormat format | ||||
) { | ||||
int32_t blocksPerRow = width; | ||||
int32_t blocksPerColumn = height; | ||||
int32_t blockSize = Texture_GetBlockSize(format); | ||||
if (blockSize > 1) | ||||
{ | ||||
blocksPerRow = (width + blockSize - 1) / blockSize; | ||||
blocksPerColumn = (height + blockSize - 1) / blockSize; | ||||
} | ||||
return blocksPerRow * blocksPerColumn * Texture_GetFormatSize(format); | ||||
} | ||||
/* XNA GraphicsDevice Limits */ | ||||
#define MAX_TEXTURE_SAMPLERS 16 | ||||
#define MAX_VERTEXTEXTURE_SAMPLERS 4 | ||||
#define MAX_TOTAL_SAMPLERS (MAX_TEXTURE_SAMPLERS + MAX_VERTEXTEXTURE_SAMPLERS) | ||||
#define MAX_VERTEX_ATTRIBUTES 16 | ||||
#define MAX_BOUND_VERTEX_BUFFERS 16 | ||||
#define MAX_RENDERTARGET_BINDINGS 4 | ||||
/* FNA3D_Device Definition */ | ||||
typedef struct FNA3D_Renderer FNA3D_Renderer; | ||||
struct FNA3D_Device | ||||
{ | ||||
/* Quit */ | ||||
void (*DestroyDevice)(FNA3D_Device *device); | ||||
/* Presentation */ | ||||
void (*SwapBuffers)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Rect *sourceRectangle, | ||||
FNA3D_Rect *destinationRectangle, | ||||
void* overrideWindowHandle | ||||
); | ||||
/* Drawing */ | ||||
void (*Clear)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_ClearOptions options, | ||||
FNA3D_Vec4 *color, | ||||
float depth, | ||||
int32_t stencil | ||||
); | ||||
void (*DrawIndexedPrimitives)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_PrimitiveType primitiveType, | ||||
int32_t baseVertex, | ||||
int32_t minVertexIndex, | ||||
int32_t numVertices, | ||||
int32_t startIndex, | ||||
int32_t primitiveCount, | ||||
FNA3D_Buffer *indices, | ||||
FNA3D_IndexElementSize indexElementSize | ||||
); | ||||
void (*DrawInstancedPrimitives)( | ||||
FNA3D_Renderer *driverData, | ||||
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 | ||||
); | ||||
void (*DrawPrimitives)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_PrimitiveType primitiveType, | ||||
int32_t vertexStart, | ||||
int32_t primitiveCount | ||||
); | ||||
/* Mutable Render States */ | ||||
void (*SetViewport)(FNA3D_Renderer *driverData, FNA3D_Viewport *viewport); | ||||
void (*SetScissorRect)(FNA3D_Renderer *driverData, FNA3D_Rect *scissor); | ||||
void (*GetBlendFactor)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Color *blendFactor | ||||
); | ||||
void (*SetBlendFactor)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Color *blendFactor | ||||
); | ||||
int32_t (*GetMultiSampleMask)(FNA3D_Renderer *driverData); | ||||
void (*SetMultiSampleMask)(FNA3D_Renderer *driverData, int32_t mask); | ||||
int32_t (*GetReferenceStencil)(FNA3D_Renderer *driverData); | ||||
void (*SetReferenceStencil)(FNA3D_Renderer *driverData, int32_t ref); | ||||
/* Immutable Render States */ | ||||
void (*SetBlendState)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_BlendState *blendState | ||||
); | ||||
void (*SetDepthStencilState)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_DepthStencilState *depthStencilState | ||||
); | ||||
void (*ApplyRasterizerState)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_RasterizerState *rasterizerState | ||||
); | ||||
void (*VerifySampler)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t index, | ||||
FNA3D_Texture *texture, | ||||
FNA3D_SamplerState *sampler | ||||
); | ||||
void (*VerifyVertexSampler)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t index, | ||||
FNA3D_Texture *texture, | ||||
FNA3D_SamplerState *sampler | ||||
); | ||||
void (*ApplyVertexBufferBindings)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_VertexBufferBinding *bindings, | ||||
int32_t numBindings, | ||||
uint8_t bindingsUpdated, | ||||
int32_t baseVertex | ||||
); | ||||
/* Render Targets */ | ||||
void (*SetRenderTargets)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_RenderTargetBinding *renderTargets, | ||||
int32_t numRenderTargets, | ||||
FNA3D_Renderbuffer *depthStencilBuffer, | ||||
FNA3D_DepthFormat depthFormat, | ||||
uint8_t preserveTargetContents | ||||
); | ||||
void (*ResolveTarget)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_RenderTargetBinding *target | ||||
); | ||||
/* Backbuffer Functions */ | ||||
void (*ResetBackbuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_PresentationParameters *presentationParameters | ||||
); | ||||
void (*ReadBackbuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
void (*GetBackbufferSize)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t *w, | ||||
int32_t *h | ||||
); | ||||
FNA3D_SurfaceFormat (*GetBackbufferSurfaceFormat)(FNA3D_Renderer *driverData); | ||||
FNA3D_DepthFormat (*GetBackbufferDepthFormat)(FNA3D_Renderer *driverData); | ||||
int32_t (*GetBackbufferMultiSampleCount)(FNA3D_Renderer *driverData); | ||||
/* Textures */ | ||||
FNA3D_Texture* (*CreateTexture2D)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t width, | ||||
int32_t height, | ||||
int32_t levelCount, | ||||
uint8_t isRenderTarget | ||||
); | ||||
FNA3D_Texture* (*CreateTexture3D)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t width, | ||||
int32_t height, | ||||
int32_t depth, | ||||
int32_t levelCount | ||||
); | ||||
FNA3D_Texture* (*CreateTextureCube)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t size, | ||||
int32_t levelCount, | ||||
uint8_t isRenderTarget | ||||
); | ||||
void (*AddDisposeTexture)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Texture *texture | ||||
); | ||||
void (*SetTextureData2D)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
void (*SetTextureData3D)( | ||||
FNA3D_Renderer *driverData, | ||||
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 | ||||
); | ||||
void (*SetTextureDataCube)( | ||||
FNA3D_Renderer *driverData, | ||||
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 | ||||
); | ||||
void (*SetTextureDataYUV)( | ||||
FNA3D_Renderer *driverData, | ||||
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 | ||||
); | ||||
void (*GetTextureData2D)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Texture *texture, | ||||
int32_t x, | ||||
int32_t y, | ||||
int32_t w, | ||||
int32_t h, | ||||
int32_t level, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
void (*GetTextureData3D)( | ||||
FNA3D_Renderer *driverData, | ||||
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 | ||||
); | ||||
void (*GetTextureDataCube)( | ||||
FNA3D_Renderer *driverData, | ||||
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 */ | ||||
FNA3D_Renderbuffer* (*GenColorRenderbuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t width, | ||||
int32_t height, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t multiSampleCount, | ||||
FNA3D_Texture *texture | ||||
); | ||||
FNA3D_Renderbuffer* (*GenDepthStencilRenderbuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t width, | ||||
int32_t height, | ||||
FNA3D_DepthFormat format, | ||||
int32_t multiSampleCount | ||||
); | ||||
void (*AddDisposeRenderbuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Renderbuffer *renderbuffer | ||||
); | ||||
/* Vertex Buffers */ | ||||
FNA3D_Buffer* (*GenVertexBuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
uint8_t dynamic, | ||||
FNA3D_BufferUsage usage, | ||||
int32_t sizeInBytes | ||||
); | ||||
void (*AddDisposeVertexBuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Buffer *buffer | ||||
); | ||||
void (*SetVertexBufferData)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t elementCount, | ||||
int32_t elementSizeInBytes, | ||||
int32_t vertexStride, | ||||
FNA3D_SetDataOptions options | ||||
); | ||||
void (*GetVertexBufferData)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t elementCount, | ||||
int32_t elementSizeInBytes, | ||||
int32_t vertexStride | ||||
); | ||||
/* Index Buffers */ | ||||
FNA3D_Buffer* (*GenIndexBuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
uint8_t dynamic, | ||||
FNA3D_BufferUsage usage, | ||||
int32_t sizeInBytes | ||||
); | ||||
void (*AddDisposeIndexBuffer)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Buffer *buffer | ||||
); | ||||
void (*SetIndexBufferData)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t dataLength, | ||||
FNA3D_SetDataOptions options | ||||
); | ||||
void (*GetIndexBufferData)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Buffer *buffer, | ||||
int32_t offsetInBytes, | ||||
void* data, | ||||
int32_t dataLength | ||||
); | ||||
/* Effects */ | ||||
void (*CreateEffect)( | ||||
FNA3D_Renderer *driverData, | ||||
uint8_t *effectCode, | ||||
uint32_t effectCodeLength, | ||||
FNA3D_Effect **effect, | ||||
MOJOSHADER_effect **result | ||||
); | ||||
void (*CloneEffect)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Effect *cloneSource, | ||||
FNA3D_Effect **effect, | ||||
MOJOSHADER_effect **result | ||||
); | ||||
void (*AddDisposeEffect)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Effect *effect | ||||
); | ||||
void (*SetEffectTechnique)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Effect *effect, | ||||
MOJOSHADER_effectTechnique *technique | ||||
); | ||||
void (*ApplyEffect)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Effect *effect, | ||||
uint32_t pass, | ||||
MOJOSHADER_effectStateChanges *stateChanges | ||||
); | ||||
void (*BeginPassRestore)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Effect *effect, | ||||
MOJOSHADER_effectStateChanges *stateChanges | ||||
); | ||||
void (*EndPassRestore)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Effect *effect | ||||
); | ||||
/* Queries */ | ||||
FNA3D_Query* (*CreateQuery)(FNA3D_Renderer *driverData); | ||||
void (*AddDisposeQuery)(FNA3D_Renderer *driverData, FNA3D_Query *query); | ||||
void (*QueryBegin)(FNA3D_Renderer *driverData, FNA3D_Query *query); | ||||
void (*QueryEnd)(FNA3D_Renderer *driverData, FNA3D_Query *query); | ||||
uint8_t (*QueryComplete)(FNA3D_Renderer *driverData, FNA3D_Query *query); | ||||
int32_t (*QueryPixelCount)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_Query *query | ||||
); | ||||
/* Feature Queries */ | ||||
uint8_t (*SupportsDXT1)(FNA3D_Renderer *driverData); | ||||
uint8_t (*SupportsS3TC)(FNA3D_Renderer *driverData); | ||||
uint8_t (*SupportsBC7)(FNA3D_Renderer *driverData); | ||||
uint8_t (*SupportsHardwareInstancing)(FNA3D_Renderer *driverData); | ||||
uint8_t (*SupportsNoOverwrite)(FNA3D_Renderer *driverData); | ||||
uint8_t (*SupportsSRGBRenderTargets)(FNA3D_Renderer *driverData); | ||||
void (*GetMaxTextureSlots)( | ||||
FNA3D_Renderer *driverData, | ||||
int32_t *textures, | ||||
int32_t *vertexTextures | ||||
); | ||||
int32_t (*GetMaxMultiSampleCount)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_SurfaceFormat format, | ||||
int32_t multiSampleCount | ||||
); | ||||
/* Debugging */ | ||||
void (*SetStringMarker)(FNA3D_Renderer *driverData, const char *text); | ||||
/* External Interop */ | ||||
void (*GetSysRenderer)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_SysRendererEXT *renderer | ||||
); | ||||
FNA3D_Texture* (*CreateSysTexture)( | ||||
FNA3D_Renderer *driverData, | ||||
FNA3D_SysTextureEXT *externalTextureInfo | ||||
); | ||||
/* Opaque pointer for the Driver */ | ||||
FNA3D_Renderer *driverData; | ||||
}; | ||||
#define ASSIGN_DRIVER_FUNC(func, name) \ | ||||
result->func = name##_##func; | ||||
#define ASSIGN_DRIVER(name) \ | ||||
ASSIGN_DRIVER_FUNC(DestroyDevice, name) \ | ||||
ASSIGN_DRIVER_FUNC(SwapBuffers, name) \ | ||||
ASSIGN_DRIVER_FUNC(Clear, name) \ | ||||
ASSIGN_DRIVER_FUNC(DrawIndexedPrimitives, name) \ | ||||
ASSIGN_DRIVER_FUNC(DrawInstancedPrimitives, name) \ | ||||
ASSIGN_DRIVER_FUNC(DrawPrimitives, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetViewport, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetScissorRect, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetBlendFactor, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetBlendFactor, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetMultiSampleMask, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetMultiSampleMask, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetReferenceStencil, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetReferenceStencil, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetBlendState, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetDepthStencilState, name) \ | ||||
ASSIGN_DRIVER_FUNC(ApplyRasterizerState, name) \ | ||||
ASSIGN_DRIVER_FUNC(VerifySampler, name) \ | ||||
ASSIGN_DRIVER_FUNC(VerifyVertexSampler, name) \ | ||||
ASSIGN_DRIVER_FUNC(ApplyVertexBufferBindings, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetRenderTargets, name) \ | ||||
ASSIGN_DRIVER_FUNC(ResolveTarget, name) \ | ||||
ASSIGN_DRIVER_FUNC(ResetBackbuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(ReadBackbuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetBackbufferSize, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetBackbufferSurfaceFormat, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetBackbufferDepthFormat, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetBackbufferMultiSampleCount, name) \ | ||||
ASSIGN_DRIVER_FUNC(CreateTexture2D, name) \ | ||||
ASSIGN_DRIVER_FUNC(CreateTexture3D, name) \ | ||||
ASSIGN_DRIVER_FUNC(CreateTextureCube, name) \ | ||||
ASSIGN_DRIVER_FUNC(AddDisposeTexture, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetTextureData2D, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetTextureData3D, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetTextureDataCube, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetTextureDataYUV, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetTextureData2D, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetTextureData3D, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetTextureDataCube, name) \ | ||||
ASSIGN_DRIVER_FUNC(GenColorRenderbuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(GenDepthStencilRenderbuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(AddDisposeRenderbuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(GenVertexBuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(GenIndexBuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(AddDisposeVertexBuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetVertexBufferData, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetVertexBufferData, name) \ | ||||
ASSIGN_DRIVER_FUNC(AddDisposeIndexBuffer, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetIndexBufferData, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetIndexBufferData, name) \ | ||||
ASSIGN_DRIVER_FUNC(CreateEffect, name) \ | ||||
ASSIGN_DRIVER_FUNC(CloneEffect, name) \ | ||||
ASSIGN_DRIVER_FUNC(AddDisposeEffect, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetEffectTechnique, name) \ | ||||
ASSIGN_DRIVER_FUNC(ApplyEffect, name) \ | ||||
ASSIGN_DRIVER_FUNC(BeginPassRestore, name) \ | ||||
ASSIGN_DRIVER_FUNC(EndPassRestore, name) \ | ||||
ASSIGN_DRIVER_FUNC(CreateQuery, name) \ | ||||
ASSIGN_DRIVER_FUNC(AddDisposeQuery, name) \ | ||||
ASSIGN_DRIVER_FUNC(QueryBegin, name) \ | ||||
ASSIGN_DRIVER_FUNC(QueryEnd, name) \ | ||||
ASSIGN_DRIVER_FUNC(QueryComplete, name) \ | ||||
ASSIGN_DRIVER_FUNC(QueryPixelCount, name) \ | ||||
ASSIGN_DRIVER_FUNC(SupportsDXT1, name) \ | ||||
ASSIGN_DRIVER_FUNC(SupportsS3TC, name) \ | ||||
ASSIGN_DRIVER_FUNC(SupportsBC7, name) \ | ||||
ASSIGN_DRIVER_FUNC(SupportsHardwareInstancing, name) \ | ||||
ASSIGN_DRIVER_FUNC(SupportsNoOverwrite, name) \ | ||||
ASSIGN_DRIVER_FUNC(SupportsSRGBRenderTargets, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetMaxTextureSlots, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetMaxMultiSampleCount, name) \ | ||||
ASSIGN_DRIVER_FUNC(SetStringMarker, name) \ | ||||
ASSIGN_DRIVER_FUNC(GetSysRenderer, name) \ | ||||
ASSIGN_DRIVER_FUNC(CreateSysTexture, name) | ||||
typedef struct FNA3D_Driver | ||||
{ | ||||
const char *Name; | ||||
uint8_t (*PrepareWindowAttributes)(uint32_t *flags); | ||||
void (*GetDrawableSize)(void* window, int32_t *w, int32_t *h); | ||||
FNA3D_Device* (*CreateDevice)( | ||||
FNA3D_PresentationParameters *presentationParameters, | ||||
uint8_t debugMode | ||||
); | ||||
} FNA3D_Driver; | ||||
extern FNA3D_Driver VulkanDriver; | ||||
extern FNA3D_Driver D3D11Driver; | ||||
extern FNA3D_Driver OpenGLDriver; | ||||
extern FNA3D_Driver GNMXDriver; | ||||
#endif /* FNA3D_DRIVER_H */ | ||||
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */ | ||||