aboutsummaryrefslogtreecommitdiff
path: root/src/dx/context/Context.h
diff options
context:
space:
mode:
authorMiles Macklin <[email protected]>2017-03-10 14:51:31 +1300
committerMiles Macklin <[email protected]>2017-03-10 14:51:31 +1300
commitad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f (patch)
tree4cc6f3288363889d7342f7f8407c0251e6904819 /src/dx/context/Context.h
downloadflex-ad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f.tar.xz
flex-ad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f.zip
Initial 1.1.0 binary release
Diffstat (limited to 'src/dx/context/Context.h')
-rw-r--r--src/dx/context/Context.h410
1 files changed, 410 insertions, 0 deletions
diff --git a/src/dx/context/Context.h b/src/dx/context/Context.h
new file mode 100644
index 0000000..31ddb95
--- /dev/null
+++ b/src/dx/context/Context.h
@@ -0,0 +1,410 @@
+/*
+ * Copyright (c) 2008-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.
+ */
+
+#pragma once
+
+#include "NvFlexTypes.h"
+#include "Vector.h"
+#include <Windows.h>
+#include <vector>
+#include <atomic>
+#include <map>
+
+ // NV shader extensions
+#include "../../../external/nvapi/include/nvShaderExtnEnums.h"
+
+
+#define ENABLE_AMD_AGS 1 // enable AMD AGS shader extensions, used for warp shuffle based reductions
+#if ENABLE_AMD_AGS
+ // AMD shader extensions
+#include <external/ags_lib/inc/amd_ags.h>
+#endif
+
+#define USE_GPUBB 0 //Used for D3D12 shader debugging
+#define ENABLE_D3D12 1
+
+enum GpuVendorId
+{
+ VENDOR_ID_NVIDIA = 0x10DE,
+ VENDOR_ID_AMD = 0x1002,
+ VENDOR_ID_OTHERS = 0x00EE,
+};
+
+inline void ThrowIfFailed(HRESULT hr)
+{
+ if (FAILED(hr))
+ {
+ throw;
+ }
+}
+
+//! graphics API dependent descriptions
+struct NvFlexContextDesc;
+
+//! export interop buffers
+struct NvFlexBuffer;
+struct NvFlexTexture3D;
+
+//! graphics API dependent descriptions
+struct NvFlexBufferViewDesc;
+struct NvFlexTexture3DViewDesc;
+
+/// common object type
+struct NvFlexObject
+{
+ virtual NvFlexUint addRef() = 0;
+ virtual NvFlexUint release() = 0;
+};
+
+//struct NvFlexBuffer : public NvFlexObject {};
+//struct NvFlexTexture3D : public NvFlexObject {};
+
+namespace NvFlex
+{
+ struct Context;
+
+ struct Allocable
+ {
+ void* operator new(size_t size);
+ void* operator new[](size_t size);
+ void operator delete(void* ptr);
+ void operator delete[](void* ptr);
+ };
+
+ struct Object : public Allocable
+ {
+ virtual NvFlexUint addRefInternal();
+
+ virtual NvFlexUint releaseInternal();
+
+ virtual ~Object();
+
+ private:
+ std::atomic_uint32_t m_refCount = 1u;
+ };
+
+ #define NV_FLEX_OBJECT_IMPL \
+ virtual NvFlexUint addRef() { return Object::addRefInternal(); } \
+ virtual NvFlexUint release() { return Object::releaseInternal(); }
+
+ #define NV_FLEX_DISPATCH_MAX_READ_TEXTURES ( 30u )
+ #define NV_FLEX_DISPATCH_MAX_WRITE_TEXTURES ( 8u )
+
+ #define NV_FLEX_DRAW_MAX_READ_TEXTURES ( 8u )
+ #define NV_FLEX_DRAW_MAX_WRITE_TEXTURES ( 1u )
+
+ struct ConstantBufferDesc
+ {
+ NvFlexUint stride;
+ NvFlexUint dim;
+ bool uploadAccess;
+#if defined(_DEBUG)
+ const char* name;
+#endif
+ };
+
+ enum BufferTypes
+ {
+ eBuffer = 1 << 0,
+ eUAV_SRV = 1 << 1,
+ eStage = 1 << 2,
+ eRaw = 1 << 3,
+ eStructured = 1 << 4,
+ eIndirect = 1 << 5,
+ eShared = 1 << 6
+ };
+
+ struct BufferDesc
+ {
+ NvFlexFormat format;
+ NvFlexUint dim;
+ NvFlexUint stride;
+ unsigned int bufferType;
+ const void* data;
+#if defined(_DEBUG)
+ const char* name;
+#endif
+ };
+
+ struct BufferViewDesc
+ {
+ NvFlexFormat format;
+ };
+
+ struct Texture3DDesc
+ {
+ NvFlexFormat format;
+ NvFlexDim dim;
+ bool uploadAccess;
+ bool downloadAccess;
+ const void* data;
+#if defined(_DEBUG)
+ const char* name;
+#endif
+ };
+
+ struct ComputeShaderDesc
+ {
+ ComputeShaderDesc() : cs(nullptr), cs_length(0), label(L""), NvAPI_Slot(~0u) {}
+ ComputeShaderDesc(void* shaderByteCode, NvFlexUint64 byteCodeLength, wchar_t* shaderLabel = L"", NvFlexUint nvApiSlot = ~0u): cs(shaderByteCode), cs_length (byteCodeLength), label(shaderLabel), NvAPI_Slot(nvApiSlot){}
+ const void* cs;
+ NvFlexUint64 cs_length;
+ const wchar_t* label;
+ NvFlexUint NvAPI_Slot;
+ };
+
+ struct InputElementDesc
+ {
+ const char* semanticName;
+ NvFlexFormat format;
+ };
+
+ /// A basic map-discard constant buffer
+ struct ConstantBuffer : public NvFlexObject
+ {
+ virtual ~ConstantBuffer() {}
+
+ ConstantBufferDesc m_desc;
+ };
+
+ /// A GPU resource that supports read operations
+ struct Resource : public NvFlexObject {};
+
+ /// A GPU resource that supports read/write operations
+ /// includes a Resource
+ struct ResourceRW : public NvFlexObject
+ {
+ virtual Resource* getResource() = 0;
+ };
+
+
+ /// Context created resources
+ /// includes Resource, ResourceRW
+ struct Buffer : public NvFlexObject
+ {
+ virtual Resource* getResource() = 0;
+ virtual ResourceRW* getResourceRW() = 0;
+ virtual ~Buffer() {}
+ BufferDesc m_desc;
+ };
+
+ /// Staging resource
+ struct Stage : public NvFlexObject
+ {
+ virtual ~Stage() {}
+ BufferDesc m_desc;
+ };
+
+ /// includes Resource, ResourceRW
+ struct Texture3D : public NvFlexObject
+ {
+ virtual Resource* getResource() = 0;
+ virtual ResourceRW* getResourceRW() = 0;
+ virtual ~Texture3D() {}
+ Texture3DDesc m_desc;
+ };
+
+ struct ComputeShader : public NvFlexObject
+ {
+ virtual ~ComputeShader() {}
+ ComputeShaderDesc m_desc;
+ };
+
+ struct Timer : public NvFlexObject
+ {
+ virtual ~Timer() {}
+ };
+
+ struct Fence : public NvFlexObject
+ {
+ virtual ~Fence() {}
+ };
+
+ struct DispatchParams
+ {
+ ComputeShader* shader;
+ NvFlexDim gridDim;
+ ConstantBuffer* rootConstantBuffer;
+ ConstantBuffer* secondConstantBuffer;
+ Resource* readOnly[NV_FLEX_DISPATCH_MAX_READ_TEXTURES];
+ ResourceRW* readWrite[NV_FLEX_DISPATCH_MAX_WRITE_TEXTURES];
+ Buffer * IndirectLaunchArgs;
+ };
+
+ struct MappedData
+ {
+ void* data;
+ NvFlexUint rowPitch;
+ NvFlexUint depthPitch;
+ };
+
+ // D3D events are expensive to create and destroy, so this pool enables
+ // DxRangeTimers to be reused.
+ struct TimerPool
+ {
+ virtual ~TimerPool() {}
+ // We initialize new elements instead of std::vector doing it, to avoid
+ // having to allocate D3D11Query in a copy constructor
+ //returns an index to the timer in the pool
+ //virtual int alloc() = 0;
+
+ virtual int begin() = 0;
+ virtual void end(int index) = 0;
+
+ // synchronize timers between GPU and CPU
+ virtual void resolve() = 0;
+ // Copy timers to cpu
+ virtual void sync() = 0;
+
+ virtual void clear() = 0;
+
+ virtual float get(int index) = 0;
+ // Set the number of timers in the pool
+ // In D3D12 this results in a reallocation of the timer heap
+ virtual void reserve(size_t size) = 0;
+ static const int m_initPoolSize = 200;
+ size_t m_timerPoolSize = 0; //The size of the heap
+ size_t m_usedElemCount = 0; //How many elements are used
+ size_t m_requestedElemCount = 0; //How many timers were requested
+ };
+
+ // String comparison function for timer name to timer index map
+ struct ltstr
+ {
+ bool operator()(const char* s1, const char* s2) const
+ {
+ return strcmp(s1, s2) < 0;
+ }
+ };
+
+
+ // WString comparison function for timer name to timer index map
+ struct ltwstr
+ {
+ bool operator()(const wchar_t* s1, const wchar_t* s2) const
+ {
+ return wcscmp(s1, s2) < 0;
+ }
+ };
+
+ // Each named range can occur more than once, for example once per iteration
+ // So the map from name to timer has to be a multimap
+
+ typedef std::multimap<const char*, int, ltstr> NameToTimerMap;
+ typedef NameToTimerMap::iterator NameToTimerMapIter;
+
+ typedef std::multimap<const wchar_t*, int, ltwstr> NameToTimerMapW;
+ typedef NameToTimerMapW::iterator NameToTimerMapWIter;
+
+ struct Context
+ {
+ // ************ public interface *****************
+
+ virtual void updateContext(const NvFlexContextDesc* desc) = 0;
+
+ //virtual void updateBufferViewDesc(NvFlexBuffer* buffer, NvFlexBufferViewDesc* desc) = 0;
+
+ //virtual void updateTexture3DViewDesc(NvFlexTexture3D* buffer, NvFlexTexture3DViewDesc* desc) = 0;
+
+ // ************ internal resources ***************
+
+ virtual ConstantBuffer* createConstantBuffer(const ConstantBufferDesc* desc) = 0;
+
+ virtual void* map(ConstantBuffer* buffer) = 0;
+
+ virtual void unmap(ConstantBuffer* buffer) = 0;
+
+ virtual void copy(ConstantBuffer* dst, Buffer* src) = 0;
+
+ virtual Buffer* createBuffer(const BufferDesc* desc, void* ptr = 0) = 0;
+
+ virtual Buffer* createBufferView(Buffer* buffer, const BufferViewDesc* desc) = 0;
+
+ virtual void* map(Buffer* buffer) = 0;
+
+ virtual void* mapUpload(Buffer* buffer) = 0;
+
+ virtual void unmap(Buffer* buffer) = 0;
+
+ virtual void upload(Buffer* buffer) = 0;
+
+ virtual void upload(Buffer* buffer, NvFlexUint offset, NvFlexUint numBytes) = 0;
+
+ virtual void download(Buffer* buffer) = 0;
+
+ virtual void download(Buffer* buffer, NvFlexUint offset, NvFlexUint numBytes) = 0;
+
+ virtual void copy(Buffer* dst, unsigned dstByteOffset, Buffer* src, NvFlexUint srcByteOffset, NvFlexUint numBytes) = 0;
+
+ virtual void copyToNative(void* dst, unsigned dstByteOffset, Buffer* src, NvFlexUint srcByteOffset, NvFlexUint numBytes) = 0;
+
+ virtual void copyToDevice(Buffer* dst, unsigned dstByteOffset, Buffer* src, NvFlexUint srcByteOffset, NvFlexUint numBytes) = 0;
+
+ virtual void copyToHost(Buffer* dst, unsigned dstByteOffset, Buffer* src, NvFlexUint srcByteOffset, NvFlexUint numBytes) = 0;
+
+ virtual void clearUnorderedAccessViewUint(Buffer* buffer, const NvFlexUint * values) = 0;
+
+ virtual void copyResourceState(Buffer* bufferFrom, Buffer* bufferTo) = 0;
+
+ //virtual void updateSubresource(Buffer* bufferIn, const NvFlexUint * box, const void * data) = 0;
+
+ virtual Texture3D* createTexture3D(const Texture3DDesc* desc) = 0;
+
+ virtual MappedData map(Texture3D* buffer) = 0;
+
+ virtual void unmap(Texture3D* buffer) = 0;
+
+ virtual void download(Texture3D* buffer) = 0;
+
+ virtual MappedData mapDownload(Texture3D* buffer) = 0;
+
+ virtual void unmapDownload(Texture3D* buffer) = 0;
+
+ virtual void copy(Texture3D* dst, Texture3D* srv) = 0;
+
+ virtual ComputeShader* createComputeShader(const ComputeShaderDesc* desc) = 0;
+
+ // ***************** Operations ****************
+
+ virtual void dispatch(const DispatchParams* params) = 0;
+
+ virtual void dispatchIndirect(const DispatchParams* params) = 0;
+
+ virtual TimerPool * createTimerPool() = 0;
+
+ virtual Fence* createFence() = 0;
+
+ virtual void fenceSet(Fence * fence) = 0;
+
+ virtual void fenceWait(Fence * fence) = 0;
+
+ virtual void startFrame() = 0;
+
+ virtual void flush() = 0;
+
+ virtual void clearState() = 0;
+
+ // ***************** Profiling ****************
+
+ virtual void eventMarker(const wchar_t* label) = 0;
+
+ virtual void contextPush() = 0;
+
+ virtual void contextPop() = 0;
+
+ bool mEnableTimers;
+
+ NameToTimerMapW mNameToInternalTimerMap;
+ NameToTimerMap mNameToExternalTimerMap;
+
+ Context();
+ virtual ~Context();
+ };
+} \ No newline at end of file