/* * Copyright (c) 2014-2017, NVIDIA CORPORATION. All rights reserved. * * NVIDIA CORPORATION and its licensors retain all intellectual property * and proprietary rights in and to this software, related documentation * and any modifications thereto. Any use, reproduction, disclosure or * distribution of this software and related documentation without an express * license agreement from NVIDIA CORPORATION is strictly prohibited. */ typedef MeshContext* (*MeshContextCreate_ptr_t)(const MeshContextDesc* desc); typedef void (*MeshContextUpdate_ptr_t)(MeshContext* context, const MeshContextDesc* desc); typedef void (*MeshContextRelease_ptr_t)(MeshContext* context); typedef MeshIndexBuffer* (*MeshIndexBufferCreate_ptr_t)(MeshContext* context, MeshUint* indices, MeshUint numIndices); typedef void (*MeshIndexBufferRelease_ptr_t)(MeshIndexBuffer* buffer); typedef MeshVertexBuffer* (*MeshVertexBufferCreate_ptr_t)(MeshContext* context, MeshVertex* vertices, MeshUint numVertices); typedef void (*MeshVertexBufferRelease_ptr_t)(MeshVertexBuffer* buffer); typedef void (*MeshContextDraw_ptr_t)(MeshContext* context, const MeshContextDrawParams* params); typedef MeshContext* (*MeshInteropContextCreate_ptr_t)(AppGraphCtx* appctx); typedef void (*MeshInteropContextUpdate_ptr_t)(MeshContext* context, AppGraphCtx* appctx); struct MeshLoader { void* module = nullptr; const char* suffix = ""; char buf[1024u]; MeshContextCreate_ptr_t MeshContextCreate_ptr; MeshContextUpdate_ptr_t MeshContextUpdate_ptr; MeshContextRelease_ptr_t MeshContextRelease_ptr; MeshIndexBufferCreate_ptr_t MeshIndexBufferCreate_ptr; MeshIndexBufferRelease_ptr_t MeshIndexBufferRelease_ptr; MeshVertexBufferCreate_ptr_t MeshVertexBufferCreate_ptr; MeshVertexBufferRelease_ptr_t MeshVertexBufferRelease_ptr; MeshContextDraw_ptr_t MeshContextDraw_ptr; MeshInteropContextCreate_ptr_t MeshInteropContextCreate_ptr; MeshInteropContextUpdate_ptr_t MeshInteropContextUpdate_ptr; }gMeshLoader; MeshContext* MeshContextCreate(const MeshContextDesc* desc) { return gMeshLoader.MeshContextCreate_ptr(desc); } void MeshContextUpdate(MeshContext* context, const MeshContextDesc* desc) { return gMeshLoader.MeshContextUpdate_ptr(context, desc); } void MeshContextRelease(MeshContext* context) { return gMeshLoader.MeshContextRelease_ptr(context); } MeshIndexBuffer* MeshIndexBufferCreate(MeshContext* context, MeshUint* indices, MeshUint numIndices) { return gMeshLoader.MeshIndexBufferCreate_ptr(context, indices, numIndices); } void MeshIndexBufferRelease(MeshIndexBuffer* buffer) { return gMeshLoader.MeshIndexBufferRelease_ptr(buffer); } MeshVertexBuffer* MeshVertexBufferCreate(MeshContext* context, MeshVertex* vertices, MeshUint numVertices) { return gMeshLoader.MeshVertexBufferCreate_ptr(context, vertices, numVertices); } void MeshVertexBufferRelease(MeshVertexBuffer* buffer) { return gMeshLoader.MeshVertexBufferRelease_ptr(buffer); } void MeshContextDraw(MeshContext* context, const MeshContextDrawParams* params) { return gMeshLoader.MeshContextDraw_ptr(context, params); } MeshContext* MeshInteropContextCreate(AppGraphCtx* appctx) { return gMeshLoader.MeshInteropContextCreate_ptr(appctx); } void MeshInteropContextUpdate(MeshContext* context, AppGraphCtx* appctx) { return gMeshLoader.MeshInteropContextUpdate_ptr(context, appctx); } void* meshLoaderLoadFunction(MeshLoader* inst, const char* name) { snprintf(inst->buf, 1024u, "%s%s", name, inst->suffix); return SDL_LoadFunction(inst->module, inst->buf); } void loadMesh(AppGraphCtxType type) { const char* moduleName = demoAppDLLName(type); gMeshLoader.suffix = demoAppBackendSuffix(type); gMeshLoader.module = SDL_LoadObject(moduleName); gMeshLoader.MeshContextCreate_ptr = (MeshContextCreate_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshContextCreate")); gMeshLoader.MeshContextUpdate_ptr = (MeshContextUpdate_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshContextUpdate")); gMeshLoader.MeshContextRelease_ptr = (MeshContextRelease_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshContextRelease")); gMeshLoader.MeshIndexBufferCreate_ptr = (MeshIndexBufferCreate_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshIndexBufferCreate")); gMeshLoader.MeshIndexBufferRelease_ptr = (MeshIndexBufferRelease_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshIndexBufferRelease")); gMeshLoader.MeshVertexBufferCreate_ptr = (MeshVertexBufferCreate_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshVertexBufferCreate")); gMeshLoader.MeshVertexBufferRelease_ptr = (MeshVertexBufferRelease_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshVertexBufferRelease")); gMeshLoader.MeshContextDraw_ptr = (MeshContextDraw_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshContextDraw")); gMeshLoader.MeshInteropContextCreate_ptr = (MeshInteropContextCreate_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshInteropContextCreate")); gMeshLoader.MeshInteropContextUpdate_ptr = (MeshInteropContextUpdate_ptr_t)(meshLoaderLoadFunction(&gMeshLoader, "MeshInteropContextUpdate")); } void unloadMesh() { gMeshLoader.MeshContextCreate_ptr = nullptr; gMeshLoader.MeshContextUpdate_ptr = nullptr; gMeshLoader.MeshContextRelease_ptr = nullptr; gMeshLoader.MeshIndexBufferCreate_ptr = nullptr; gMeshLoader.MeshIndexBufferRelease_ptr = nullptr; gMeshLoader.MeshVertexBufferCreate_ptr = nullptr; gMeshLoader.MeshVertexBufferRelease_ptr = nullptr; gMeshLoader.MeshContextDraw_ptr = nullptr; gMeshLoader.MeshInteropContextCreate_ptr = nullptr; gMeshLoader.MeshInteropContextUpdate_ptr = nullptr; SDL_UnloadObject(gMeshLoader.module); }