aboutsummaryrefslogtreecommitdiff
path: root/src/API.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/API.cpp')
-rw-r--r--src/API.cpp240
1 files changed, 240 insertions, 0 deletions
diff --git a/src/API.cpp b/src/API.cpp
new file mode 100644
index 0000000..350472d
--- /dev/null
+++ b/src/API.cpp
@@ -0,0 +1,240 @@
+/*
+* Copyright (c) 2008-2016, 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.
+*/
+
+#if SUPPORT_D3D11
+#include "Renderer_DX11.h"
+#endif
+
+#if SUPPORT_D3D12
+#include "Renderer_DX12.h"
+#endif
+
+#if SUPPORT_GL
+#include "Renderer_GL.h"
+#endif
+
+//--------------------------------------------------------------------------------
+inline static
+GFSDK_SSAO_CustomHeap InitNewDelete(const GFSDK_SSAO_CustomHeap* pCustomHeap)
+{
+ GFSDK_SSAO_CustomHeap NewDelete;
+
+ if (pCustomHeap)
+ {
+ NewDelete = *pCustomHeap;
+ }
+ else
+ {
+ NewDelete.new_ = ::operator new;
+ NewDelete.delete_ = ::operator delete;
+ }
+
+ return NewDelete;
+}
+
+//--------------------------------------------------------------------------------
+inline static
+void* AllocateAndZeroMemory(const GFSDK_SSAO_CustomHeap& NewDelete, std::size_t SizeInBytes)
+{
+ void *pStorage = NewDelete.new_(SizeInBytes);
+ if (!pStorage)
+ {
+ return NULL;
+ }
+
+ memset(pStorage, 0, SizeInBytes);
+
+ return pStorage;
+}
+
+#if SUPPORT_D3D11
+
+//--------------------------------------------------------------------------------
+GFSDK_SSAO_DECL(GFSDK_SSAO_Status, GFSDK_SSAO_CreateContext_D3D11,
+ ID3D11Device* pD3DDevice,
+ GFSDK_SSAO_Context_D3D11** ppAOContext,
+ const GFSDK_SSAO_CustomHeap* pCustomHeap,
+ GFSDK_SSAO_Version HeaderVersion)
+{
+ if (!ppAOContext)
+ {
+ return GFSDK_SSAO_NULL_ARGUMENT;
+ }
+
+ GFSDK_SSAO_CustomHeap NewDelete = InitNewDelete(pCustomHeap);
+
+ void *pStorage = AllocateAndZeroMemory(NewDelete, sizeof(GFSDK::SSAO::D3D11::Renderer));
+ if (!pStorage)
+ {
+ return GFSDK_SSAO_MEMORY_ALLOCATION_FAILED;
+ }
+
+ GFSDK::SSAO::D3D11::Renderer* pAOContext = new(pStorage) GFSDK::SSAO::D3D11::Renderer(NewDelete);
+
+ *ppAOContext = pAOContext;
+
+ return pAOContext->Create(pD3DDevice, HeaderVersion);
+}
+
+#endif
+
+#if SUPPORT_GL
+
+//--------------------------------------------------------------------------------
+inline static
+bool CheckGLFunctionPointers(const GFSDK_SSAO_GLFunctions& GL)
+{
+ return (
+ GL.glActiveTexture &&
+ GL.glAttachShader &&
+ GL.glBindBuffer &&
+ GL.glBindBufferBase &&
+ GL.glBindFramebuffer &&
+ GL.glBindFragDataLocation &&
+ GL.glBindTexture &&
+ GL.glBindVertexArray &&
+ GL.glBlendColor &&
+ GL.glBlendEquationSeparate &&
+ GL.glBlendFuncSeparate &&
+ GL.glBufferData &&
+ GL.glBufferSubData &&
+ GL.glColorMaski &&
+ GL.glCompileShader &&
+ GL.glCreateShader &&
+ GL.glCreateProgram &&
+ GL.glDeleteBuffers &&
+ GL.glDeleteFramebuffers &&
+ GL.glDeleteProgram &&
+ GL.glDeleteShader &&
+ GL.glDeleteTextures &&
+ GL.glDeleteVertexArrays &&
+ GL.glDisable &&
+ GL.glDrawBuffers &&
+ GL.glEnable &&
+ GL.glDrawArrays &&
+ GL.glFramebufferTexture &&
+ GL.glFramebufferTexture2D &&
+ GL.glFramebufferTextureLayer &&
+ GL.glGenBuffers &&
+ GL.glGenFramebuffers &&
+ GL.glGenTextures &&
+ GL.glGenVertexArrays &&
+ GL.glGetError &&
+ GL.glGetBooleani_v &&
+ GL.glGetFloatv &&
+ GL.glGetIntegerv &&
+ GL.glGetIntegeri_v &&
+ GL.glGetProgramiv &&
+ GL.glGetProgramInfoLog &&
+ GL.glGetShaderiv &&
+ GL.glGetShaderInfoLog &&
+ GL.glGetString &&
+ GL.glGetUniformBlockIndex &&
+ GL.glGetUniformLocation &&
+ GL.glGetTexLevelParameteriv &&
+ GL.glIsEnabled &&
+ GL.glIsEnabledi &&
+ GL.glLinkProgram &&
+ GL.glPolygonOffset &&
+ GL.glShaderSource &&
+ GL.glTexImage2D &&
+ GL.glTexImage3D &&
+ GL.glTexParameteri &&
+ GL.glUniform1i &&
+ GL.glUniformBlockBinding &&
+ GL.glUseProgram &&
+ GL.glViewport);
+}
+
+//--------------------------------------------------------------------------------
+GFSDK_SSAO_DECL(GFSDK_SSAO_Status, GFSDK_SSAO_CreateContext_GL,
+ GFSDK_SSAO_Context_GL** ppAOContext,
+ const GFSDK_SSAO_GLFunctions* pGLFunctions,
+ const GFSDK_SSAO_CustomHeap* pCustomHeap,
+ GFSDK_SSAO_Version HeaderVersion)
+{
+ if (!ppAOContext)
+ {
+ return GFSDK_SSAO_NULL_ARGUMENT;
+ }
+
+ if (!pGLFunctions)
+ {
+ return GFSDK_SSAO_NULL_ARGUMENT;
+ }
+
+ if (!CheckGLFunctionPointers(*pGLFunctions))
+ {
+ return GFSDK_SSAO_GL_NULL_FUNCTION_POINTER;
+ }
+
+ GFSDK_SSAO_CustomHeap NewDelete = InitNewDelete(pCustomHeap);
+
+ void *pStorage = AllocateAndZeroMemory(NewDelete, sizeof(GFSDK::SSAO::GL::Renderer));
+ if (!pStorage)
+ {
+ return GFSDK_SSAO_MEMORY_ALLOCATION_FAILED;
+ }
+
+ GFSDK::SSAO::GL::Renderer* pAOContext = new(pStorage) GFSDK::SSAO::GL::Renderer(*pGLFunctions, NewDelete);
+
+ *ppAOContext = pAOContext;
+
+ return pAOContext->Create(HeaderVersion);
+}
+
+#endif
+
+#if SUPPORT_D3D12
+
+//--------------------------------------------------------------------------------
+GFSDK_SSAO_DECL(GFSDK_SSAO_Status, GFSDK_SSAO_CreateContext_D3D12,
+ ID3D12Device* pD3DDevice,
+ GFSDK_SSAO_UINT NodeMask,
+ const GFSDK_SSAO_DescriptorHeaps_D3D12& DescriptorHeaps,
+ GFSDK_SSAO_Context_D3D12** ppAOContext,
+ const GFSDK_SSAO_CustomHeap* pCustomHeap,
+ GFSDK_SSAO_Version HeaderVersion)
+{
+ if (!ppAOContext)
+ {
+ return GFSDK_SSAO_NULL_ARGUMENT;
+ }
+
+ GFSDK_SSAO_CustomHeap NewDelete = InitNewDelete(pCustomHeap);
+
+ void *pStorage = AllocateAndZeroMemory(NewDelete, sizeof(GFSDK::SSAO::D3D12::Renderer));
+ if (!pStorage)
+ {
+ return GFSDK_SSAO_MEMORY_ALLOCATION_FAILED;
+ }
+
+ GFSDK::SSAO::D3D12::Renderer* pAOContext = new(pStorage) GFSDK::SSAO::D3D12::Renderer(NewDelete);
+
+ *ppAOContext = pAOContext;
+
+ return pAOContext->Create(pD3DDevice, NodeMask, DescriptorHeaps, HeaderVersion);
+}
+
+#endif
+
+GFSDK_SSAO_DECL(GFSDK_SSAO_Status, GFSDK_SSAO_GetVersion,
+ GFSDK_SSAO_Version* pVersion)
+{
+ if (!pVersion)
+ {
+ return GFSDK_SSAO_NULL_ARGUMENT;
+ }
+
+ GFSDK::SSAO::BuildVersion BuildVersion;
+ *pVersion = BuildVersion;
+
+ return GFSDK_SSAO_OK;
+}