summaryrefslogtreecommitdiffstats
path: root/src/Runtime/Source/render/Qt3DSRenderContext.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/Source/render/Qt3DSRenderContext.h')
-rw-r--r--src/Runtime/Source/render/Qt3DSRenderContext.h1063
1 files changed, 1063 insertions, 0 deletions
diff --git a/src/Runtime/Source/render/Qt3DSRenderContext.h b/src/Runtime/Source/render/Qt3DSRenderContext.h
new file mode 100644
index 00000000..e5b51341
--- /dev/null
+++ b/src/Runtime/Source/render/Qt3DSRenderContext.h
@@ -0,0 +1,1063 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_CONTEXT_H
+#define QT3DS_RENDER_CONTEXT_H
+#include "foundation/Qt3DS.h"
+#include "foundation/Qt3DSAtomic.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "render/Qt3DSRenderBaseTypes.h"
+#include "foundation/Qt3DSDataRef.h"
+#include "foundation/Qt3DSMemoryBuffer.h"
+#include "render/glg/Qt3DSGLImplObjects.h"
+#include "render/backends/gl/Q3DSRenderBackendGLES2.h"
+#include "render/backends/gl/Qt3DSRenderBackendGL3.h"
+#include "render/backends/gl/Qt3DSRenderBackendGL4.h"
+#include "render/backends/software/Qt3DSRenderBackendNULL.h"
+#include "render/Qt3DSRenderVertexBuffer.h"
+#include "render/Qt3DSRenderIndexBuffer.h"
+#include "render/Qt3DSRenderConstantBuffer.h"
+#include "render/Qt3DSRenderFrameBuffer.h"
+#include "render/Qt3DSRenderRenderBuffer.h"
+#include "render/Qt3DSRenderDepthStencilState.h"
+#include "render/Qt3DSRenderRasterizerState.h"
+#include "render/Qt3DSRenderDrawable.h"
+#include "render/Qt3DSRenderInputAssembler.h"
+#include "render/Qt3DSRenderAttribLayout.h"
+#include "render/Qt3DSRenderImageTexture.h"
+#include "render/Qt3DSRenderOcclusionQuery.h"
+#include "render/Qt3DSRenderTimerQuery.h"
+#include "render/Qt3DSRenderSync.h"
+#include "render/Qt3DSRenderTexture2DArray.h"
+#include "render/Qt3DSRenderTextureCube.h"
+#include "render/Qt3DSRenderStorageBuffer.h"
+#include "render/Qt3DSRenderAtomicCounterBuffer.h"
+#include "render/Qt3DSRenderDrawIndirectBuffer.h"
+#include "render/Qt3DSRenderProgramPipeline.h"
+#include "render/Qt3DSRenderPathRender.h"
+#include "render/Qt3DSRenderPathSpecification.h"
+#include "render/Qt3DSRenderPathFontSpecification.h"
+#include "render/Qt3DSRenderPathFontText.h"
+
+#include <QSurfaceFormat>
+
+// When SW fallback is defined we can support (some) object/layer advanced blend modes. If defined,
+// the HW implementation is still preperred if available through extensions. SW fallback can't be
+// used in custom shaders.
+#define ADVANCED_BLEND_SW_FALLBACK
+namespace qt3ds {
+class NVFoundationBase;
+}
+
+namespace qt3ds {
+namespace render {
+
+ using namespace foundation;
+
+ struct NVRenderShaderProgramBinaryType
+ {
+ enum Enum {
+ Unknown = 0,
+ NVBinary = 1,
+ };
+ };
+
+ // context dirty flags
+ struct NVRenderContextDirtyValues
+ {
+ enum Enum {
+ InputAssembler = 1 << 0,
+ };
+ };
+
+ typedef NVFlags<NVRenderContextDirtyValues::Enum, QT3DSU32> NVRenderContextDirtyFlags;
+ typedef nvhash_map<CRegisteredString, NVRenderConstantBuffer *> TContextConstantBufferMap;
+ typedef nvhash_map<CRegisteredString, NVRenderStorageBuffer *> TContextStorageBufferMap;
+ typedef nvhash_map<CRegisteredString, NVRenderAtomicCounterBuffer *>
+ TContextAtomicCounterBufferMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendBufferObject, NVRenderDrawIndirectBuffer *>
+ TContextDrawIndirectBufferMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendDepthStencilStateObject,
+ NVRenderDepthStencilState *>
+ TContextDepthStencilStateMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendRasterizerStateObject,
+ NVRenderRasterizerState *>
+ TContextRasterizerStateMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendTextureObject, NVRenderTexture2DArray *>
+ TContextTex2DArrayToImpMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendTextureObject, NVRenderTextureCube *>
+ TContextTexCubeToImpMap;
+ typedef nvhash_map<NVRenderBackend::NVRenderBackendTextureObject, NVRenderImage2D *>
+ TContextImage2DToImpMap;
+ typedef nvhash_map<CRegisteredString, NVRenderPathFontSpecification *>
+ TContextPathFontSpecificationMap;
+
+ class QT3DS_AUTOTEST_EXPORT NVRenderContext : public NVRefCounted, public NVRenderDrawable
+ {
+ public:
+ virtual NVRenderContextType GetRenderContextType() const = 0;
+ virtual bool AreMultisampleTexturesSupported() const = 0;
+ virtual bool GetConstantBufferSupport() const = 0;
+ virtual void getMaxTextureSize(QT3DSU32 &oWidth, QT3DSU32 &oHeight) = 0;
+ virtual const char *GetShadingLanguageVersion() = 0;
+ // Get the bit depth of the currently bound depth buffer.
+ virtual QT3DSU32 GetDepthBits() const = 0;
+ virtual QT3DSU32 GetStencilBits() const = 0;
+ virtual bool
+ GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Enum inCap) const = 0;
+ virtual bool AreDXTImagesSupported() const = 0;
+ virtual bool IsDepthStencilSupported() const = 0;
+ virtual bool IsFpRenderTargetSupported() const = 0;
+ virtual bool IsTessellationSupported() const = 0;
+ virtual bool IsGeometryStageSupported() const = 0;
+ virtual bool IsComputeSupported() const = 0;
+ virtual bool IsSampleQuerySupported() const = 0;
+ virtual bool IsTimerQuerySupported() const = 0;
+ virtual bool IsCommandSyncSupported() const = 0;
+ virtual bool IsTextureArraySupported() const = 0;
+ virtual bool IsStorageBufferSupported() const = 0;
+ virtual bool IsAtomicCounterBufferSupported() const = 0;
+ virtual bool IsShaderImageLoadStoreSupported() const = 0;
+ virtual bool IsProgramPipelineSupported() const = 0;
+ virtual bool IsPathRenderingSupported() const = 0;
+ virtual bool IsBlendCoherencySupported() const = 0;
+ virtual bool IsAdvancedBlendHwSupported() const = 0;
+ virtual bool IsAdvancedBlendHwSupportedKHR() const = 0;
+ virtual bool IsStandardDerivativesSupported() const = 0;
+ virtual bool IsTextureLodSupported() const = 0;
+
+ virtual void SetDefaultRenderTarget(QT3DSU64 targetID) = 0;
+ virtual void SetDefaultDepthBufferBitCount(QT3DSI32 depthBits) = 0;
+
+ virtual NVRenderDepthStencilState *
+ CreateDepthStencilState(bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack) = 0;
+
+ virtual NVRenderRasterizerState *CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace) = 0;
+
+ virtual NVRenderVertexBuffer *
+ CreateVertexBuffer(NVRenderBufferUsageType::Enum usageType, size_t size, QT3DSU32 stride = 0,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) = 0;
+ virtual NVRenderVertexBuffer *GetVertexBuffer(const void *implementationHandle) = 0;
+
+ virtual NVRenderIndexBuffer *
+ CreateIndexBuffer(NVRenderBufferUsageType::Enum usageType,
+ NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData = NVConstDataRef<QT3DSU8>()) = 0;
+ virtual NVRenderIndexBuffer *GetIndexBuffer(const void *implementationHandle) = 0;
+
+ virtual NVRenderConstantBuffer *
+ CreateConstantBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual NVRenderConstantBuffer *GetConstantBuffer(CRegisteredString bufferName) = 0;
+
+ virtual NVRenderStorageBuffer *
+ CreateStorageBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer) = 0;
+ virtual NVRenderStorageBuffer *GetStorageBuffer(CRegisteredString bufferName) = 0;
+
+ virtual NVRenderAtomicCounterBuffer *
+ CreateAtomicCounterBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual NVRenderAtomicCounterBuffer *
+ GetAtomicCounterBuffer(CRegisteredString bufferName) = 0;
+ virtual NVRenderAtomicCounterBuffer *
+ GetAtomicCounterBufferByParam(CRegisteredString paramName) = 0;
+
+ virtual NVRenderDrawIndirectBuffer *
+ CreateDrawIndirectBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) = 0;
+ virtual NVRenderDrawIndirectBuffer *GetDrawIndirectBuffer(
+ NVRenderBackend::NVRenderBackendBufferObject implementationHandle) = 0;
+
+ virtual void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) = 0;
+
+ virtual NVRenderOcclusionQuery *CreateOcclusionQuery() = 0;
+ virtual NVRenderTimerQuery *CreateTimerQuery() = 0;
+ virtual NVRenderSync *CreateSync() = 0;
+
+ virtual NVRenderTexture2D *CreateTexture2D() = 0;
+ virtual NVRenderTexture2D *GetTexture2D(const void *implementationHandle) = 0;
+ virtual NVRenderBackend *GetBackend() = 0;
+
+ virtual NVRenderTexture2DArray *CreateTexture2DArray() = 0;
+
+ virtual NVRenderTextureCube *CreateTextureCube() = 0;
+
+ virtual NVRenderImage2D *CreateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess) = 0;
+
+ virtual NVRenderRenderBuffer *
+ CreateRenderBuffer(NVRenderRenderBufferFormats::Enum bufferFormat, QT3DSU32 width,
+ QT3DSU32 height) = 0;
+ virtual NVRenderRenderBuffer *GetRenderBuffer(const void *implementationHandle) = 0;
+ // Create a new frame buffer and set the current render target to that frame buffer.
+ virtual NVRenderFrameBuffer *CreateFrameBuffer() = 0;
+ virtual NVRenderFrameBuffer *GetFrameBuffer(const void *implementationHandle) = 0;
+
+ virtual NVRenderAttribLayout *
+ CreateAttributeLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs) = 0;
+
+ virtual NVRenderInputAssembler *
+ CreateInputAssembler(NVRenderAttribLayout *attribLayout,
+ NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer, NVConstDataRef<QT3DSU32> strides,
+ NVConstDataRef<QT3DSU32> offsets,
+ NVRenderDrawMode::Enum primType = NVRenderDrawMode::Triangles,
+ QT3DSU32 patchVertexCount = 1) = 0;
+ virtual void SetInputAssembler(NVRenderInputAssembler *inputAssembler) = 0;
+
+ virtual NVRenderVertFragCompilationResult CompileSource(
+ const char *shaderName, NVConstDataRef<QT3DSI8> vertShader,
+ NVConstDataRef<QT3DSI8> fragShader,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>(),
+ bool separateProgram = false,
+ NVRenderShaderProgramBinaryType::Enum type = NVRenderShaderProgramBinaryType::Unknown,
+ bool binaryProgram = false) = 0;
+
+ // You must figure out inVertLen and inFragLen yourself, this object doesn't do that.
+ NVRenderVertFragCompilationResult
+ CompileSource(const char *shaderName, const char *vertShader, QT3DSU32 inVertLen,
+ const char *fragShader, QT3DSU32 inFragLen, const char * = NULL,
+ QT3DSU32 inTCLen = 0, const char *tessEvaluationShaderSource = NULL,
+ QT3DSU32 inTELen = 0, const char *geometryShaderSource = NULL, QT3DSU32 inGSLen = 0,
+ bool separableProgram = false);
+
+ virtual NVRenderVertFragCompilationResult
+ CompileBinary(const char *shaderName, NVRenderShaderProgramBinaryType::Enum type,
+ NVDataRef<QT3DSI8> vertShader, NVDataRef<QT3DSI8> fragShader,
+ NVDataRef<QT3DSI8> tessControlShaderSource = NVDataRef<QT3DSI8>(),
+ NVDataRef<QT3DSI8> tessEvaluationShaderSource = NVDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>()) = 0;
+
+ virtual NVRenderVertFragCompilationResult
+ CompileComputeSource(const char *shaderName, NVConstDataRef<QT3DSI8> computeShaderSource) = 0;
+
+ virtual NVRenderShaderProgram *GetShaderProgram(const void *implementationHandle) = 0;
+
+ virtual NVRenderProgramPipeline *CreateProgramPipeline() = 0;
+
+ virtual NVRenderPathSpecification *CreatePathSpecification() = 0;
+ virtual NVRenderPathRender *CreatePathRender(size_t range = 1) = 0;
+ virtual void SetPathProjectionMatrix(const QT3DSMat44 inPathProjection) = 0;
+ virtual void SetPathModelViewMatrix(const QT3DSMat44 inPathModelview) = 0;
+ virtual void SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias) = 0;
+ virtual void SetPathCoverDepthFunc(NVRenderBoolOp::Enum inFunc) = 0;
+
+ virtual NVRenderPathFontSpecification *
+ CreatePathFontSpecification(CRegisteredString fontName) = 0;
+ virtual NVRenderPathFontItem *CreatePathFontItem() = 0;
+
+ // Specific setters for the guaranteed-to-exist context properties to set them as fast as
+ // possible.
+ // Note that this bypasses the property manage so push/pop will have no effect (unless you
+ // set these already
+ // once after a push using the property manager.
+ virtual void SetClearColor(QT3DSVec4 inClearColor) = 0;
+ virtual QT3DSVec4 GetClearColor() const = 0;
+
+ virtual void SetBlendFunction(NVRenderBlendFunctionArgument inFunctions) = 0;
+ virtual NVRenderBlendFunctionArgument GetBlendFunction() const = 0;
+
+ virtual void SetBlendEquation(NVRenderBlendEquationArgument inEquations) = 0;
+ virtual NVRenderBlendEquationArgument GetBlendEquation() const = 0;
+
+ virtual void SetCullingEnabled(bool inEnabled) = 0;
+ virtual bool IsCullingEnabled() const = 0;
+
+ virtual void SetDepthFunction(NVRenderBoolOp::Enum inFunction) = 0;
+ virtual qt3ds::render::NVRenderBoolOp::Enum GetDepthFunction() const = 0;
+
+ virtual void SetBlendingEnabled(bool inEnabled) = 0;
+ virtual bool IsBlendingEnabled() const = 0;
+
+ virtual void SetDepthWriteEnabled(bool inEnabled) = 0;
+ virtual bool IsDepthWriteEnabled() const = 0;
+
+ virtual void SetDepthTestEnabled(bool inEnabled) = 0;
+ virtual bool IsDepthTestEnabled() const = 0;
+
+ virtual void SetDepthStencilState(NVRenderDepthStencilState *inDepthStencilState) = 0;
+ virtual void SetStencilTestEnabled(bool inEnabled) = 0;
+ virtual bool IsStencilTestEnabled() const = 0;
+
+ virtual void SetRasterizerState(NVRenderRasterizerState *inRasterizerState) = 0;
+
+ virtual void SetScissorTestEnabled(bool inEnabled) = 0;
+ virtual bool IsScissorTestEnabled() const = 0;
+
+ virtual void SetScissorRect(NVRenderRect inRect) = 0;
+ virtual NVRenderRect GetScissorRect() const = 0;
+
+ virtual void SetViewport(NVRenderRect inViewport) = 0;
+ virtual NVRenderRect GetViewport() const = 0;
+
+ virtual void SetColorWritesEnabled(bool inEnabled) = 0;
+ virtual bool IsColorWritesEnabled() const = 0;
+
+ virtual void SetMultisampleEnabled(bool inEnabled) = 0;
+ virtual bool IsMultisampleEnabled() const = 0;
+
+ // Used during layer rendering because we can't set the *actual* viewport to what it should
+ // be due to hardware problems.
+ // Set during begin render.
+ static QT3DSMat44
+ ApplyVirtualViewportToProjectionMatrix(const QT3DSMat44 &inProjection,
+ const NVRenderRectF &inViewport,
+ const NVRenderRectF &inVirtualViewport);
+
+ virtual void SetRenderTarget(NVRenderFrameBuffer *inBuffer) = 0;
+ virtual void SetReadTarget(NVRenderFrameBuffer *inBuffer) = 0;
+ virtual NVRenderFrameBuffer *GetRenderTarget() const = 0;
+
+ virtual void SetActiveShader(NVRenderShaderProgram *inShader) = 0;
+ virtual NVRenderShaderProgram *GetActiveShader() const = 0;
+
+ virtual void SetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline) = 0;
+ virtual NVRenderProgramPipeline *GetActiveProgramPipeline() const = 0;
+
+ virtual void DispatchCompute(NVRenderShaderProgram *inShader, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) = 0;
+
+ // Push the entire set of properties.
+ virtual void PushPropertySet() = 0;
+ // Pop the entire set of properties, potentially forcing the values
+ // to opengl. Will set the hardware state to whatever at the time of push.
+ virtual void PopPropertySet(bool inForceSetProperties) = 0;
+
+ // Ensure the hardware state matches the state we expect.
+ virtual void ResetBlendState() = 0;
+
+ // Draw buffers are what the system will render to.. Applies to the current render context.
+ //-1 means none, else the integer is assumed to be an index past the draw buffer index.
+ // This applies only to the currently bound framebuffer.
+ virtual void SetDrawBuffers(NVConstDataRef<QT3DSI32> inDrawBufferSet) = 0;
+ virtual void SetReadBuffer(NVReadFaces::Enum inReadFace) = 0;
+
+ virtual void ReadPixels(NVRenderRect inRect, NVRenderReadPixelFormats::Enum inFormat,
+ NVDataRef<QT3DSU8> inWriteBuffer) = 0;
+
+ // Return the property manager for this render context
+ // virtual NVRenderPropertyManager& GetPropertyManager() = 0;
+ // Clear the current render target
+ virtual void Clear(NVRenderClearFlags flags) = 0;
+ // Clear this framebuffer without changing the active frame buffer
+ virtual void Clear(NVRenderFrameBuffer &framebuffer, NVRenderClearFlags flags) = 0;
+ // copy framebuffer content between read target and render target
+ virtual void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) = 0;
+
+ // Render, applying these immediate property values just before render. The hardware
+ // properties are tracked for push/pop
+ // but the shader properties are just set on the active shader *after* the hardware
+ // properties have been set. The shader properties are not tracked for push/pop.
+ // This call is meant to come directly before each draw call to setup the last bit of state
+ // before the draw operation. Note that there isn't another way to set the immedate
+ // property values for a given shader because it isn't clear which shader is active
+ // when the properties are getting set.
+ void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset) override = 0;
+
+ /**
+ * @brief Draw the current active vertex buffer using an indirect buffer
+ * This means the setup of the draw call is stored in a buffer bound to
+ * NVRenderBufferBindValues::Draw_Indirect
+ *
+ * @param[in] drawMode Draw mode (Triangles, ....)
+ * @param[in] indirect Offset into a indirect drawing setup buffer
+ *
+ * @return no return.
+ */
+ virtual void DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset) = 0;
+
+ virtual NVFoundationBase &GetFoundation() = 0;
+ virtual qt3ds::foundation::IStringTable &GetStringTable() = 0;
+ virtual NVAllocatorCallback &GetAllocator() = 0;
+
+ virtual QSurfaceFormat format() const = 0;
+
+ virtual void resetStates() = 0;
+
+ static NVRenderContext &CreateGL(NVFoundationBase &foundation, IStringTable &inStringTable,
+ const QSurfaceFormat &format);
+
+ static NVRenderContext &CreateNULL(NVFoundationBase &foundation,
+ IStringTable &inStringTable);
+ };
+
+ // Now for scoped property access.
+ template <typename TDataType>
+ struct NVRenderContextScopedProperty
+ : public NVRenderGenericScopedProperty<NVRenderContext, TDataType>
+ {
+ typedef typename NVRenderGenericScopedProperty<NVRenderContext, TDataType>::TGetter TGetter;
+ typedef typename NVRenderGenericScopedProperty<NVRenderContext, TDataType>::TSetter TSetter;
+ NVRenderContextScopedProperty(NVRenderContext &ctx, TGetter getter, TSetter setter)
+ : NVRenderGenericScopedProperty<NVRenderContext, TDataType>(ctx, getter, setter)
+ {
+ }
+ NVRenderContextScopedProperty(NVRenderContext &ctx, TGetter getter, TSetter setter,
+ const TDataType &inNewValue)
+ : NVRenderGenericScopedProperty<NVRenderContext, TDataType>(ctx, getter, setter,
+ inNewValue)
+ {
+ }
+ };
+
+/**
+ * A Render Context implementation class
+ *
+ */
+
+#define ITERATE_HARDWARE_CONTEXT_PROPERTIES \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(RenderTarget, FrameBuffer) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ActiveShader, ActiveShader) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ActiveProgramPipeline, ActiveProgramPipeline) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(InputAssembler, InputAssembler) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(BlendFunction, BlendFunction) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(CullingEnabled, CullingEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(DepthFunction, DepthFunction) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(BlendingEnabled, BlendingEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(DepthWriteEnabled, DepthWriteEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(DepthTestEnabled, DepthTestEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(StencilTestEnabled, StencilTestEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ScissorTestEnabled, ScissorTestEnabled) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ScissorRect, ScissorRect) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(Viewport, Viewport) \
+ HANDLE_CONTEXT_HARDWARE_PROPERTY(ClearColor, ClearColor)
+
+ // forward declarations
+
+ class NVRenderContextImpl : public NVRenderContext, public NoCopy
+ {
+ public:
+ // these variables represent the current hardware state of the render context.
+ SNVGLHardPropertyContext m_HardwarePropertyContext;
+
+ private:
+ NVScopedRefCounted<NVRenderBackend> m_backend; ///< pointer to our render backend
+ NVRenderContextDirtyFlags m_DirtyFlags; ///< context dirty flags
+
+ NVRenderBackend::NVRenderBackendRenderTargetObject
+ m_DefaultOffscreenRenderTarget; ///< this is a special target set from outside if we
+ ///never render to a window directly (GL only)
+ QT3DSI32 m_DephBits; ///< this is the depth bits count of the default window render target
+ QT3DSI32 m_StencilBits; ///< this is the stencil bits count of the default window render target
+
+ protected:
+ volatile QT3DSI32 mRefCount;
+ NVFoundationBase &m_Foundation;
+ qt3ds::foundation::IStringTable &m_StringTable;
+
+ nvhash_map<const void *, NVRenderVertexBuffer *> m_VertToImpMap;
+ nvhash_map<const void *, NVRenderIndexBuffer *> m_IndexToImpMap;
+ TContextConstantBufferMap m_ConstantToImpMap;
+ TContextStorageBufferMap m_StorageToImpMap;
+ TContextAtomicCounterBufferMap m_AtomicCounterToImpMap;
+ TContextDrawIndirectBufferMap m_DrawIndirectToImpMap;
+ TContextDepthStencilStateMap m_DepthStencilStateToImpMap;
+ TContextRasterizerStateMap m_RasterizerStateToImpMap;
+ TContextPathFontSpecificationMap m_PathFontSpecToImpMap;
+
+ nvhash_map<const void *, NVRenderTexture2D *> m_Tex2DToImpMap;
+ TContextTex2DArrayToImpMap m_Tex2DArrayToImpMap;
+ TContextTexCubeToImpMap m_TexCubeToImpMap;
+ TContextImage2DToImpMap m_Image2DtoImpMap;
+ nvhash_map<const void *, NVRenderShaderProgram *> m_ShaderToImpMap;
+ nvhash_map<const void *, NVRenderRenderBuffer *> m_RenderBufferToImpMap;
+ nvhash_map<const void *, NVRenderFrameBuffer *> m_FrameBufferToImpMap;
+ QT3DSU32 m_MaxTextureUnits;
+ QT3DSU32 m_NextTextureUnit;
+ QT3DSU32 m_MaxConstantBufferUnits;
+ QT3DSU32 m_NextConstantBufferUnit;
+
+ nvvector<SNVGLHardPropertyContext> m_PropertyStack;
+
+ void DoSetClearColor(QT3DSVec4 inClearColor)
+ {
+ m_HardwarePropertyContext.m_ClearColor = inClearColor;
+ m_backend->SetClearColor(&inClearColor);
+ }
+
+ void DoSetBlendFunction(NVRenderBlendFunctionArgument inFunctions)
+ {
+ QT3DSI32_4 values;
+ m_HardwarePropertyContext.m_BlendFunction = inFunctions;
+
+ m_backend->SetBlendFunc(inFunctions);
+ }
+
+ void DoSetBlendEquation(NVRenderBlendEquationArgument inEquations)
+ {
+ QT3DSI32_4 values;
+ m_HardwarePropertyContext.m_BlendEquation = inEquations;
+
+ m_backend->SetBlendEquation(inEquations);
+ }
+
+ void DoSetCullingEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_CullingEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::CullFace);
+ }
+
+ void DoSetDepthFunction(qt3ds::render::NVRenderBoolOp::Enum inFunction)
+ {
+ m_HardwarePropertyContext.m_DepthFunction = inFunction;
+ m_backend->SetDepthFunc(inFunction);
+ }
+
+ void DoSetBlendingEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_BlendingEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::Blend);
+ }
+
+ void DoSetColorWritesEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_ColorWritesEnabled = inEnabled;
+ m_backend->SetColorWrites(inEnabled, inEnabled, inEnabled, inEnabled);
+ }
+
+ void DoSetMultisampleEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_MultisampleEnabled = inEnabled;
+ m_backend->SetMultisample(inEnabled);
+ }
+
+ void DoSetDepthWriteEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_DepthWriteEnabled = inEnabled;
+ m_backend->SetDepthWrite(inEnabled);
+ }
+
+ void DoSetDepthTestEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_DepthTestEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::DepthTest);
+ }
+
+ void DoSetStencilTestEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_StencilTestEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::StencilTest);
+ }
+
+ void DoSetScissorTestEnabled(bool inEnabled)
+ {
+ m_HardwarePropertyContext.m_ScissorTestEnabled = inEnabled;
+ m_backend->SetRenderState(inEnabled, NVRenderState::ScissorTest);
+ }
+
+ void DoSetScissorRect(NVRenderRect inRect)
+ {
+ m_HardwarePropertyContext.m_ScissorRect = inRect;
+ m_backend->SetScissorRect(inRect);
+ }
+
+ void DoSetViewport(NVRenderRect inViewport)
+ {
+ m_HardwarePropertyContext.m_Viewport = inViewport;
+ m_backend->SetViewportRect(inViewport);
+ }
+
+ // Circular dependencies between shader constants and shader programs preclude
+ // implementation in header
+ void DoSetActiveShader(NVRenderShaderProgram *inShader);
+ void DoSetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline);
+
+ void DoSetInputAssembler(NVRenderInputAssembler *inAssembler)
+ {
+ m_HardwarePropertyContext.m_InputAssembler = inAssembler;
+ m_DirtyFlags |= NVRenderContextDirtyValues::InputAssembler;
+ }
+
+ void DoSetRenderTarget(NVRenderFrameBuffer *inBuffer)
+ {
+ if (inBuffer)
+ m_backend->SetRenderTarget(inBuffer->GetFrameBuffertHandle());
+ else
+ m_backend->SetRenderTarget(m_DefaultOffscreenRenderTarget);
+
+ m_HardwarePropertyContext.m_FrameBuffer = inBuffer;
+ }
+
+ void DoSetReadTarget(NVRenderFrameBuffer *inBuffer)
+ {
+ if (inBuffer)
+ m_backend->SetReadTarget(inBuffer->GetFrameBuffertHandle());
+ else
+ m_backend->SetReadTarget(NVRenderBackend::NVRenderBackendRenderTargetObject(NULL));
+ }
+
+ bool BindShaderToInputAssembler(const NVRenderInputAssembler *inputAssembler,
+ NVRenderShaderProgram *shader);
+ bool ApplyPreDrawProperties();
+ void OnPostDraw();
+
+ public:
+ NVRenderContextImpl(NVFoundationBase &fnd, NVRenderBackend &inBackend,
+ IStringTable &inStrTable);
+ virtual ~NVRenderContextImpl();
+
+ QT3DS_IMPLEMENT_REF_COUNT_ADDREF_RELEASE_OVERRIDE(m_Foundation);
+
+ NVRenderBackend *GetBackend() override { return m_backend; }
+
+ void getMaxTextureSize(QT3DSU32 &oWidth, QT3DSU32 &oHeight) override;
+
+ const char *GetShadingLanguageVersion() override
+ {
+ return m_backend->GetShadingLanguageVersion();
+ }
+
+ NVRenderContextType GetRenderContextType() const override
+ {
+ return m_backend->GetRenderContextType();
+ }
+
+ QT3DSU32 GetDepthBits() const override
+ {
+ // only query this if a framebuffer is bound
+ if (m_HardwarePropertyContext.m_FrameBuffer)
+ return m_backend->GetDepthBits();
+ else
+ return m_DephBits;
+ }
+
+ QT3DSU32 GetStencilBits() const override
+ {
+ // only query this if a framebuffer is bound
+ if (m_HardwarePropertyContext.m_FrameBuffer)
+ return m_backend->GetStencilBits();
+ else
+ return m_StencilBits;
+ }
+
+ bool GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Enum inCap) const override
+ {
+ return m_backend->GetRenderBackendCap(inCap);
+ }
+
+ bool AreMultisampleTexturesSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::MsTexture);
+ }
+
+ bool GetConstantBufferSupport() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ConstantBuffer);
+ }
+
+ bool AreDXTImagesSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DxtImages);
+ }
+
+ bool IsDepthStencilSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::DepthStencilTexture);
+ }
+
+ bool IsFpRenderTargetSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::FpRenderTarget);
+ }
+
+ bool IsTessellationSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Tessellation);
+ }
+
+ bool IsGeometryStageSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Geometry);
+ }
+
+ bool IsComputeSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::Compute);
+ }
+
+ bool IsSampleQuerySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::SampleQuery);
+ }
+
+ bool IsTimerQuerySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::TimerQuery);
+ }
+
+ bool IsCommandSyncSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::CommandSync);
+ }
+ bool IsTextureArraySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::TextureArray);
+ }
+ bool IsStorageBufferSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::StorageBuffer);
+ }
+ bool IsAtomicCounterBufferSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::AtomicCounterBuffer);
+ }
+ bool IsShaderImageLoadStoreSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ShaderImageLoadStore);
+ }
+ bool IsProgramPipelineSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::ProgramPipeline);
+ }
+ bool IsPathRenderingSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::PathRendering);
+ }
+ // Are blend modes really supported in HW?
+ bool IsAdvancedBlendHwSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::AdvancedBlend);
+ }
+ bool IsAdvancedBlendHwSupportedKHR() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::AdvancedBlendKHR);
+ }
+ bool IsBlendCoherencySupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::BlendCoherency);
+ }
+ bool IsStandardDerivativesSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::StandardDerivatives);
+ }
+ bool IsTextureLodSupported() const override
+ {
+ return GetRenderBackendCap(NVRenderBackend::NVRenderBackendCaps::TextureLod);
+ }
+
+ void SetDefaultRenderTarget(QT3DSU64 targetID) override
+ {
+ m_DefaultOffscreenRenderTarget =
+ (NVRenderBackend::NVRenderBackendRenderTargetObject)targetID;
+ }
+
+ void SetDefaultDepthBufferBitCount(QT3DSI32 depthBits) override { m_DephBits = depthBits; }
+
+ virtual NVRenderDepthStencilState *
+ CreateDepthStencilState(bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc,
+ bool enableStencil,
+ NVRenderStencilFunctionArgument &stencilFuncFront,
+ NVRenderStencilFunctionArgument &stencilFuncBack,
+ NVRenderStencilOperationArgument &depthStencilOpFront,
+ NVRenderStencilOperationArgument &depthStencilOpBack) override;
+ void SetDepthStencilState(NVRenderDepthStencilState *inDepthStencilState) override;
+ virtual void StateDestroyed(NVRenderDepthStencilState &state);
+
+ NVRenderRasterizerState *CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
+ NVRenderFaces::Enum cullFace) override;
+ void SetRasterizerState(NVRenderRasterizerState *inRasterizerState) override;
+ virtual void StateDestroyed(NVRenderRasterizerState &state);
+
+ NVRenderVertexBuffer *CreateVertexBuffer(NVRenderBufferUsageType::Enum usageType,
+ size_t size, QT3DSU32 stride,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderVertexBuffer *GetVertexBuffer(const void *implementationHandle) override;
+ virtual void BufferDestroyed(NVRenderVertexBuffer &buffer);
+
+ virtual NVRenderIndexBuffer *
+ CreateIndexBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType,
+ qt3ds::render::NVRenderComponentTypes::Enum componentType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderIndexBuffer *GetIndexBuffer(const void *implementationHandle) override;
+ virtual void BufferDestroyed(NVRenderIndexBuffer &buffer);
+
+ virtual NVRenderConstantBuffer *
+ CreateConstantBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderConstantBuffer *GetConstantBuffer(CRegisteredString bufferName) override;
+ virtual void BufferDestroyed(NVRenderConstantBuffer &buffer);
+
+ virtual QT3DSU32 GetNextConstantBufferUnit();
+
+ virtual NVRenderStorageBuffer *
+ CreateStorageBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer) override;
+ NVRenderStorageBuffer *GetStorageBuffer(CRegisteredString bufferName) override;
+ virtual void BufferDestroyed(NVRenderStorageBuffer &buffer);
+
+ virtual NVRenderAtomicCounterBuffer *
+ CreateAtomicCounterBuffer(const char *bufferName,
+ qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ NVRenderAtomicCounterBuffer *GetAtomicCounterBuffer(CRegisteredString bufferName) override;
+ virtual NVRenderAtomicCounterBuffer *
+ GetAtomicCounterBufferByParam(CRegisteredString paramName) override;
+ virtual void BufferDestroyed(NVRenderAtomicCounterBuffer &buffer);
+
+ virtual NVRenderDrawIndirectBuffer *
+ CreateDrawIndirectBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
+ NVConstDataRef<QT3DSU8> bufferData) override;
+ virtual NVRenderDrawIndirectBuffer *
+ GetDrawIndirectBuffer(NVRenderBackend::NVRenderBackendBufferObject implementationHandle) override;
+ virtual void BufferDestroyed(NVRenderDrawIndirectBuffer &buffer);
+
+ void SetMemoryBarrier(NVRenderBufferBarrierFlags barriers) override;
+
+ NVRenderOcclusionQuery *CreateOcclusionQuery() override;
+ NVRenderTimerQuery *CreateTimerQuery() override;
+ NVRenderSync *CreateSync() override;
+
+ NVRenderTexture2D *CreateTexture2D() override;
+ NVRenderTexture2D *GetTexture2D(const void *implementationHandle) override;
+ virtual void TextureDestroyed(NVRenderTexture2D &buffer);
+
+ NVRenderTexture2DArray *CreateTexture2DArray() override;
+ virtual void TextureDestroyed(NVRenderTexture2DArray &buffer);
+
+ NVRenderTextureCube *CreateTextureCube() override;
+ virtual void TextureDestroyed(NVRenderTextureCube &buffer);
+
+ virtual QT3DSU32 GetNextTextureUnit();
+
+ NVRenderImage2D *CreateImage2D(NVRenderTexture2D *inTexture,
+ NVRenderImageAccessType::Enum inAccess) override;
+ virtual void ImageDestroyed(NVRenderImage2D &buffer);
+
+ virtual NVRenderRenderBuffer *
+ CreateRenderBuffer(NVRenderRenderBufferFormats::Enum bufferFormat, QT3DSU32 width,
+ QT3DSU32 height) override;
+ NVRenderRenderBuffer *GetRenderBuffer(const void *implementationHandle) override;
+ virtual void RenderBufferDestroyed(NVRenderRenderBuffer &buffer);
+
+ NVRenderFrameBuffer *CreateFrameBuffer() override;
+ NVRenderFrameBuffer *GetFrameBuffer(const void *implementationHandle) override;
+ virtual void FrameBufferDestroyed(NVRenderFrameBuffer &fb);
+
+ virtual NVRenderAttribLayout *
+ CreateAttributeLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs) override;
+ NVRenderInputAssembler *CreateInputAssembler(
+ NVRenderAttribLayout *attribLayout, NVConstDataRef<NVRenderVertexBuffer *> buffers,
+ const NVRenderIndexBuffer *indexBuffer, NVConstDataRef<QT3DSU32> strides,
+ NVConstDataRef<QT3DSU32> offsets, NVRenderDrawMode::Enum primType, QT3DSU32 patchVertexCount) override;
+ void SetInputAssembler(NVRenderInputAssembler *inputAssembler) override;
+
+ NVRenderVertFragCompilationResult CompileSource(
+ const char *shaderName, NVConstDataRef<QT3DSI8> vertShader,
+ NVConstDataRef<QT3DSI8> fragShader,
+ NVConstDataRef<QT3DSI8> tessControlShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> tessEvaluationShaderSource = NVConstDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>(),
+ bool separateProgram = false,
+ NVRenderShaderProgramBinaryType::Enum type = NVRenderShaderProgramBinaryType::Unknown,
+ bool binaryProgram = false) override;
+
+ virtual NVRenderVertFragCompilationResult
+ CompileBinary(const char *shaderName, NVRenderShaderProgramBinaryType::Enum type,
+ NVDataRef<QT3DSI8> vertShader, NVDataRef<QT3DSI8> fragShader,
+ NVDataRef<QT3DSI8> tessControlShaderSource = NVDataRef<QT3DSI8>(),
+ NVDataRef<QT3DSI8> tessEvaluationShaderSource = NVDataRef<QT3DSI8>(),
+ NVConstDataRef<QT3DSI8> geometryShaderSource = NVConstDataRef<QT3DSI8>()) override;
+
+ virtual NVRenderVertFragCompilationResult
+ CompileComputeSource(const char *shaderName, NVConstDataRef<QT3DSI8> computeShaderSource) override;
+
+ NVRenderShaderProgram *GetShaderProgram(const void *implementationHandle) override;
+ virtual void ShaderDestroyed(NVRenderShaderProgram &shader);
+
+ NVRenderProgramPipeline *CreateProgramPipeline() override;
+ NVRenderPathSpecification *CreatePathSpecification() override;
+ NVRenderPathRender *CreatePathRender(size_t range = 1) override;
+ void SetPathProjectionMatrix(const QT3DSMat44 inPathProjection) override;
+ void SetPathModelViewMatrix(const QT3DSMat44 inPathModelview) override;
+ void SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias) override;
+ void SetPathCoverDepthFunc(NVRenderBoolOp::Enum inFunc) override;
+
+ virtual NVRenderPathFontSpecification *
+ CreatePathFontSpecification(CRegisteredString fontName) override;
+ virtual void ReleasePathFontSpecification(NVRenderPathFontSpecification &inPathSpec);
+ NVRenderPathFontItem *CreatePathFontItem() override;
+
+ void SetClearColor(QT3DSVec4 inClearColor) override;
+ QT3DSVec4 GetClearColor() const override { return m_HardwarePropertyContext.m_ClearColor; }
+
+ void SetBlendFunction(NVRenderBlendFunctionArgument inFunctions) override;
+ NVRenderBlendFunctionArgument GetBlendFunction() const override
+ {
+ return m_HardwarePropertyContext.m_BlendFunction;
+ }
+
+ void SetBlendEquation(NVRenderBlendEquationArgument inEquations) override;
+ NVRenderBlendEquationArgument GetBlendEquation() const override
+ {
+ return m_HardwarePropertyContext.m_BlendEquation;
+ };
+
+ void SetCullingEnabled(bool inEnabled) override;
+ bool IsCullingEnabled() const override { return m_HardwarePropertyContext.m_CullingEnabled; }
+
+ void SetDepthFunction(qt3ds::render::NVRenderBoolOp::Enum inFunction) override;
+ qt3ds::render::NVRenderBoolOp::Enum GetDepthFunction() const override
+ {
+ return m_HardwarePropertyContext.m_DepthFunction;
+ }
+
+ void SetBlendingEnabled(bool inEnabled) override;
+ bool IsBlendingEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_BlendingEnabled;
+ }
+
+ void SetDepthWriteEnabled(bool inEnabled) override;
+ bool IsDepthWriteEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_DepthWriteEnabled;
+ }
+ void SetDepthTestEnabled(bool inEnabled) override;
+ bool IsDepthTestEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_DepthTestEnabled;
+ }
+
+ void SetStencilTestEnabled(bool inEnabled) override;
+ bool IsStencilTestEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_StencilTestEnabled;
+ }
+
+ void SetScissorTestEnabled(bool inEnabled) override;
+ bool IsScissorTestEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_ScissorTestEnabled;
+ }
+ void SetScissorRect(NVRenderRect inRect) override;
+ NVRenderRect GetScissorRect() const override
+ {
+ return m_HardwarePropertyContext.m_ScissorRect;
+ }
+
+ void SetViewport(NVRenderRect inViewport) override;
+ NVRenderRect GetViewport() const override { return m_HardwarePropertyContext.m_Viewport; }
+
+ void SetColorWritesEnabled(bool inEnabled) override;
+ bool IsColorWritesEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_ColorWritesEnabled;
+ }
+
+ void SetMultisampleEnabled(bool inEnabled) override;
+ bool IsMultisampleEnabled() const override
+ {
+ return m_HardwarePropertyContext.m_MultisampleEnabled;
+ }
+
+ void SetActiveShader(NVRenderShaderProgram *inShader) override;
+ NVRenderShaderProgram *GetActiveShader() const override
+ {
+ return m_HardwarePropertyContext.m_ActiveShader;
+ }
+
+ void SetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline) override;
+ NVRenderProgramPipeline *GetActiveProgramPipeline() const override
+ {
+ return m_HardwarePropertyContext.m_ActiveProgramPipeline;
+ }
+
+ void DispatchCompute(NVRenderShaderProgram *inShader, QT3DSU32 numGroupsX,
+ QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ) override;
+
+ void SetDrawBuffers(NVConstDataRef<QT3DSI32> inDrawBufferSet) override;
+ void SetReadBuffer(NVReadFaces::Enum inReadFace) override;
+
+ void ReadPixels(NVRenderRect inRect, NVRenderReadPixelFormats::Enum inFormat,
+ NVDataRef<QT3DSU8> inWriteBuffer) override;
+
+ void SetRenderTarget(NVRenderFrameBuffer *inBuffer) override;
+ void SetReadTarget(NVRenderFrameBuffer *inBuffer) override;
+ NVRenderFrameBuffer *GetRenderTarget() const override
+ {
+ return m_HardwarePropertyContext.m_FrameBuffer;
+ }
+
+ void ResetBlendState() override;
+
+ // Push the entire set of properties.
+ void PushPropertySet() override { m_PropertyStack.push_back(m_HardwarePropertyContext); }
+
+ // Pop the entire set of properties, potentially forcing the values
+ // to opengl.
+ void PopPropertySet(bool inForceSetProperties) override;
+
+ // clear current bound render target
+ void Clear(NVRenderClearFlags flags) override;
+ // clear passed in rendertarget
+ void Clear(NVRenderFrameBuffer &fb, NVRenderClearFlags flags) override;
+
+ // copy framebuffer content between read target and render target
+ void BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
+ QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
+ NVRenderClearFlags flags,
+ NVRenderTextureMagnifyingOp::Enum filter) override;
+
+ void Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset) override;
+ void DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset) override;
+
+ NVFoundationBase &GetFoundation() override { return m_Foundation; }
+ qt3ds::foundation::IStringTable &GetStringTable() override { return m_StringTable; }
+ NVAllocatorCallback &GetAllocator() override { return m_Foundation.getAllocator(); }
+ QSurfaceFormat format() const override
+ {
+ return m_backend->format();
+ }
+ virtual void resetStates()
+ {
+ PushPropertySet();
+ PopPropertySet(true);
+ }
+ };
+}
+}
+#endif