summaryrefslogtreecommitdiffstats
path: root/src/Runtime/ogl-runtime/src/render/Qt3DSRenderContext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/ogl-runtime/src/render/Qt3DSRenderContext.cpp')
m---------src/Runtime/ogl-runtime0
-rw-r--r--src/Runtime/ogl-runtime/src/render/Qt3DSRenderContext.cpp1107
2 files changed, 0 insertions, 1107 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime
new file mode 160000
+Subproject 2025912174c4cf99270b7439ec3b021e1d089ae
diff --git a/src/Runtime/ogl-runtime/src/render/Qt3DSRenderContext.cpp b/src/Runtime/ogl-runtime/src/render/Qt3DSRenderContext.cpp
deleted file mode 100644
index aa2cb30f..00000000
--- a/src/Runtime/ogl-runtime/src/render/Qt3DSRenderContext.cpp
+++ /dev/null
@@ -1,1107 +0,0 @@
-/****************************************************************************
-**
-** 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$
-**
-****************************************************************************/
-
-#include "foundation/Qt3DSMat44.h"
-#include "render/Qt3DSRenderContext.h"
-#include "foundation/Utils.h"
-#include "EASTL/set.h"
-#include "EASTL/utility.h"
-#include "render/Qt3DSRenderShaderProgram.h"
-
-using namespace qt3ds;
-using namespace qt3ds::render;
-using namespace eastl;
-
-namespace qt3ds {
-namespace render {
-
- NVRenderContextImpl::NVRenderContextImpl(NVFoundationBase &fnd, NVRenderBackend &inBackend,
- IStringTable &inStrTable)
- : m_backend(inBackend)
- , m_DirtyFlags(0)
- , m_DefaultOffscreenRenderTarget((NVRenderBackend::NVRenderBackendRenderTargetObject)NULL)
- , m_DephBits(16)
- , m_StencilBits(8)
- , mRefCount(0)
- , m_Foundation(fnd)
- , m_StringTable(inStrTable)
- , m_VertToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_VertToImpMap")
- , m_IndexToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_IndexToImpMap")
- , m_ConstantToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_ConstantToImpMap")
- , m_StorageToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_StorageToImpMap")
- , m_AtomicCounterToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_AtomicCounterToImpMap")
- , m_DrawIndirectToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_DrawIndirectToImpMap")
- , m_DepthStencilStateToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_DepthStencilStateToImpMap")
- , m_RasterizerStateToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_RasterizerStateToImpMap")
- , m_PathFontSpecToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_RasterizerStateToImpMap")
- , m_Tex2DToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_Tex2DToImpMap")
- , m_Tex2DArrayToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_Tex2DArrayToImpMap")
- , m_TexCubeToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_TexCubeToImpMap")
- , m_Image2DtoImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_Image2DtoImpMap")
- , m_ShaderToImpMap(m_Foundation.getAllocator(), "NVRenderContextImpl::m_ShaderToImpMap")
- , m_RenderBufferToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_RenderBufferToImpMap")
- , m_FrameBufferToImpMap(m_Foundation.getAllocator(),
- "NVRenderContextImpl::m_FrameBufferToImpMap")
- , m_NextTextureUnit(1)
- , m_NextConstantBufferUnit(1)
- , m_PropertyStack(m_Foundation.getAllocator(), "NVRenderContextImpl::m_PropertyStack")
- {
-
- m_StringTable.addRef();
-
- m_MaxTextureUnits = m_backend->GetMaxCombinedTextureUnits();
- m_MaxConstantBufferUnits = 16; // need backend query
-
- // get initial state
- memZero(&m_HardwarePropertyContext, sizeof(m_HardwarePropertyContext));
-
- // get default blending functions
- m_backend->GetBlendFunc(&m_HardwarePropertyContext.m_BlendFunction);
- // set default blend euqation
- m_HardwarePropertyContext.m_BlendEquation.m_RGBEquation = NVRenderBlendEquation::Add;
- m_HardwarePropertyContext.m_BlendEquation.m_AlphaEquation = NVRenderBlendEquation::Add;
- // default state
- m_HardwarePropertyContext.m_CullingEnabled =
- m_backend->GetRenderState(NVRenderState::CullFace);
- m_HardwarePropertyContext.m_DepthFunction = m_backend->GetDepthFunc();
- m_HardwarePropertyContext.m_BlendingEnabled =
- m_backend->GetRenderState(NVRenderState::Blend);
- m_HardwarePropertyContext.m_DepthWriteEnabled = m_backend->GetDepthWrite();
- m_HardwarePropertyContext.m_DepthTestEnabled =
- m_backend->GetRenderState(NVRenderState::DepthTest);
- m_HardwarePropertyContext.m_ScissorTestEnabled =
- m_backend->GetRenderState(NVRenderState::ScissorTest);
- m_backend->GetScissorRect(&m_HardwarePropertyContext.m_ScissorRect);
- m_backend->GetViewportRect(&m_HardwarePropertyContext.m_Viewport);
-
- DoSetClearColor(m_HardwarePropertyContext.m_ClearColor);
- }
-
- NVRenderContextImpl::~NVRenderContextImpl()
- {
- m_StringTable.release();
- QT3DS_ASSERT(m_VertToImpMap.size() == 0);
- m_VertToImpMap.clear();
- QT3DS_ASSERT(m_IndexToImpMap.size() == 0);
- m_IndexToImpMap.clear();
- QT3DS_ASSERT(m_ConstantToImpMap.size() == 0);
- m_ConstantToImpMap.clear();
- QT3DS_ASSERT(m_StorageToImpMap.size() == 0);
- m_StorageToImpMap.clear();
- QT3DS_ASSERT(m_DepthStencilStateToImpMap.size() == 0);
- m_DepthStencilStateToImpMap.clear();
- QT3DS_ASSERT(m_RasterizerStateToImpMap.size() == 0);
- m_RasterizerStateToImpMap.clear();
- QT3DS_ASSERT(m_PathFontSpecToImpMap.size() == 0);
- m_PathFontSpecToImpMap.clear();
- QT3DS_ASSERT(m_Tex2DToImpMap.size() == 0);
- m_Tex2DToImpMap.clear();
- QT3DS_ASSERT(m_Tex2DArrayToImpMap.size() == 0);
- m_Tex2DArrayToImpMap.clear();
- QT3DS_ASSERT(m_Image2DtoImpMap.size() == 0);
- m_Image2DtoImpMap.clear();
- QT3DS_ASSERT(m_ShaderToImpMap.size() == 0);
- m_ShaderToImpMap.clear();
- QT3DS_ASSERT(m_RenderBufferToImpMap.size() == 0);
- m_RenderBufferToImpMap.clear();
- QT3DS_ASSERT(m_FrameBufferToImpMap.size() == 0);
- m_FrameBufferToImpMap.clear();
-
- m_backend = NULL;
- }
-
- void NVRenderContextImpl::getMaxTextureSize(QT3DSU32 &oWidth, QT3DSU32 &oHeight)
- {
- QT3DSI32 theMaxTextureSize = 0;
- m_backend->GetRenderBackendValue(NVRenderBackend::NVRenderBackendQuery::MaxTextureSize,
- &theMaxTextureSize);
-
- oWidth = (QT3DSU32)theMaxTextureSize;
- oHeight = (QT3DSU32)theMaxTextureSize;
- }
-
- NVRenderDepthStencilState *NVRenderContextImpl::CreateDepthStencilState(
- bool enableDepth, bool depthMask, NVRenderBoolOp::Enum depthFunc, bool enableStencil,
- NVRenderStencilFunctionArgument &stencilFuncFront,
- NVRenderStencilFunctionArgument &stencilFuncBack,
- NVRenderStencilOperationArgument &depthStencilOpFront,
- NVRenderStencilOperationArgument &depthStencilOpBack)
- {
- NVRenderDepthStencilState *state = NVRenderDepthStencilState::Create(
- *this, enableDepth, depthMask, depthFunc, enableStencil, stencilFuncFront,
- stencilFuncBack, depthStencilOpFront, depthStencilOpBack);
- if (state)
- m_DepthStencilStateToImpMap.insert(
- make_pair(state->GetDepthStencilObjectHandle(), state));
-
- return state;
- }
-
- void NVRenderContextImpl::SetDepthStencilState(NVRenderDepthStencilState *inDepthStencilState)
- {
- if (inDepthStencilState) {
- m_backend->SetDepthStencilState(inDepthStencilState->GetDepthStencilObjectHandle());
- // currently we have a mixture therefore we need to update the context state
- SetDepthFunction(inDepthStencilState->GetDepthFunc());
- SetDepthWriteEnabled(inDepthStencilState->GetDepthMask());
- SetDepthTestEnabled(inDepthStencilState->GetDepthEnabled());
- SetStencilTestEnabled(inDepthStencilState->GetStencilEnabled());
- }
- }
-
- void NVRenderContextImpl::StateDestroyed(NVRenderDepthStencilState &state)
- {
- m_DepthStencilStateToImpMap.erase(state.GetDepthStencilObjectHandle());
- }
-
- NVRenderRasterizerState *
- NVRenderContextImpl::CreateRasterizerState(QT3DSF32 depthBias, QT3DSF32 depthScale,
- NVRenderFaces::Enum cullFace)
- {
- NVRenderRasterizerState *state =
- NVRenderRasterizerState::Create(*this, depthBias, depthScale, cullFace);
- if (state)
- m_RasterizerStateToImpMap.insert(make_pair(state->GetRasterizerObjectHandle(), state));
-
- return state;
- }
-
- void NVRenderContextImpl::SetRasterizerState(NVRenderRasterizerState *inRasterizerState)
- {
- if (inRasterizerState)
- m_backend->SetRasterizerState(inRasterizerState->GetRasterizerObjectHandle());
- }
-
- void NVRenderContextImpl::StateDestroyed(NVRenderRasterizerState &state)
- {
- m_RasterizerStateToImpMap.erase(state.GetRasterizerObjectHandle());
- }
-
- NVRenderVertexBuffer *
- NVRenderContextImpl::CreateVertexBuffer(NVRenderBufferUsageType::Enum usageType, size_t size,
- QT3DSU32 stride, NVConstDataRef<QT3DSU8> bufferData)
- {
- NVRenderVertexBuffer *buffer =
- NVRenderVertexBuffer::Create(*this, usageType, size, stride, bufferData);
- if (buffer)
- m_VertToImpMap.insert(make_pair(buffer->GetImplementationHandle(), buffer));
- return buffer;
- }
-
- NVRenderVertexBuffer *NVRenderContextImpl::GetVertexBuffer(const void *implementationHandle)
- {
- nvhash_map<const void *, NVRenderVertexBuffer *>::const_iterator entry =
- m_VertToImpMap.find(implementationHandle);
- if (entry != m_VertToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::BufferDestroyed(NVRenderVertexBuffer &buffer)
- {
- m_VertToImpMap.erase(buffer.GetImplementationHandle());
- }
-
- NVRenderIndexBuffer *
- NVRenderContextImpl::CreateIndexBuffer(qt3ds::render::NVRenderBufferUsageType::Enum usageType,
- qt3ds::render::NVRenderComponentTypes::Enum componentType,
- size_t size, NVConstDataRef<QT3DSU8> bufferData)
- {
- NVRenderIndexBuffer *buffer =
- NVRenderIndexBuffer::Create(*this, usageType, componentType, size, bufferData);
-
- if (buffer) {
- m_IndexToImpMap.insert(make_pair(buffer->GetImplementationHandle(), buffer));
- }
-
- return buffer;
- }
-
- NVRenderIndexBuffer *NVRenderContextImpl::GetIndexBuffer(const void *implementationHandle)
- {
- const nvhash_map<const void *, NVRenderIndexBuffer *>::iterator entry =
- m_IndexToImpMap.find(implementationHandle);
- if (entry != m_IndexToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::BufferDestroyed(NVRenderIndexBuffer &buffer)
- {
- m_IndexToImpMap.erase(buffer.GetImplementationHandle());
- }
-
- NVRenderConstantBuffer *
- NVRenderContextImpl::CreateConstantBuffer(const char *bufferName,
- qt3ds::render::NVRenderBufferUsageType::Enum usageType,
- size_t size, NVConstDataRef<QT3DSU8> bufferData)
- {
- NVRenderConstantBuffer *buffer =
- NVRenderConstantBuffer::Create(*this, bufferName, usageType, size, bufferData);
-
- if (buffer) {
- m_ConstantToImpMap.insert(make_pair(buffer->GetBufferName(), buffer));
- }
-
- return buffer;
- }
-
- NVRenderConstantBuffer *NVRenderContextImpl::GetConstantBuffer(CRegisteredString bufferName)
- {
- TContextConstantBufferMap::iterator entry = m_ConstantToImpMap.find(bufferName);
- if (entry != m_ConstantToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::BufferDestroyed(NVRenderConstantBuffer &buffer)
- {
- m_ConstantToImpMap.erase(buffer.GetBufferName());
- }
-
- QT3DSU32 NVRenderContextImpl::GetNextConstantBufferUnit()
- {
- QT3DSU32 retval = m_NextConstantBufferUnit;
- ++m_NextConstantBufferUnit;
- // Too many texture units for a single draw call.
- if (retval >= m_MaxConstantBufferUnits) {
- QT3DS_ASSERT(false);
- retval = retval % m_MaxConstantBufferUnits;
- }
- return retval;
- }
-
- NVRenderStorageBuffer *NVRenderContextImpl::CreateStorageBuffer(
- const char *bufferName, qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
- NVConstDataRef<QT3DSU8> bufferData, NVRenderDataBuffer *pBuffer)
- {
- NVRenderStorageBuffer *buffer =
- NVRenderStorageBuffer::Create(*this, bufferName, usageType, size, bufferData, pBuffer);
-
- if (buffer) {
- m_StorageToImpMap.insert(make_pair(buffer->GetBufferName(), buffer));
- }
-
- return buffer;
- }
-
- NVRenderStorageBuffer *NVRenderContextImpl::GetStorageBuffer(CRegisteredString bufferName)
- {
- TContextStorageBufferMap::iterator entry = m_StorageToImpMap.find(bufferName);
- if (entry != m_StorageToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::BufferDestroyed(NVRenderStorageBuffer &buffer)
- {
- m_StorageToImpMap.erase(buffer.GetBufferName());
- }
-
- NVRenderAtomicCounterBuffer *NVRenderContextImpl::CreateAtomicCounterBuffer(
- const char *bufferName, qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
- NVConstDataRef<QT3DSU8> bufferData)
- {
- NVRenderAtomicCounterBuffer *buffer =
- NVRenderAtomicCounterBuffer::Create(*this, bufferName, usageType, size, bufferData);
-
- if (buffer) {
- m_AtomicCounterToImpMap.insert(make_pair(buffer->GetBufferName(), buffer));
- }
-
- return buffer;
- }
-
- NVRenderAtomicCounterBuffer *
- NVRenderContextImpl::GetAtomicCounterBuffer(CRegisteredString bufferName)
- {
- TContextAtomicCounterBufferMap::iterator entry = m_AtomicCounterToImpMap.find(bufferName);
- if (entry != m_AtomicCounterToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- NVRenderAtomicCounterBuffer *
- NVRenderContextImpl::GetAtomicCounterBufferByParam(CRegisteredString paramName)
- {
- // iterate through all atomic counter buffers
- for (TContextAtomicCounterBufferMap::iterator iter = m_AtomicCounterToImpMap.begin(),
- end = m_AtomicCounterToImpMap.end();
- iter != end; ++iter) {
- if (iter->second && iter->second->ContainsParam(paramName))
- return iter->second;
- }
-
- return NULL;
- }
-
- void NVRenderContextImpl::BufferDestroyed(NVRenderAtomicCounterBuffer &buffer)
- {
- m_AtomicCounterToImpMap.erase(buffer.GetBufferName());
- }
-
- NVRenderDrawIndirectBuffer *NVRenderContextImpl::CreateDrawIndirectBuffer(
- qt3ds::render::NVRenderBufferUsageType::Enum usageType, size_t size,
- NVConstDataRef<QT3DSU8> bufferData)
- {
- NVRenderDrawIndirectBuffer *buffer =
- NVRenderDrawIndirectBuffer::Create(*this, usageType, size, bufferData);
-
- if (buffer) {
- m_DrawIndirectToImpMap.insert(make_pair(buffer->GetBuffertHandle(), buffer));
- }
-
- return buffer;
- }
-
- NVRenderDrawIndirectBuffer *NVRenderContextImpl::GetDrawIndirectBuffer(
- NVRenderBackend::NVRenderBackendBufferObject implementationHandle)
- {
- TContextDrawIndirectBufferMap::iterator entry =
- m_DrawIndirectToImpMap.find(implementationHandle);
- if (entry != m_DrawIndirectToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::BufferDestroyed(NVRenderDrawIndirectBuffer &buffer)
- {
- m_DrawIndirectToImpMap.erase(buffer.GetBuffertHandle());
- }
-
- void NVRenderContextImpl::SetMemoryBarrier(NVRenderBufferBarrierFlags barriers)
- {
- m_backend->SetMemoryBarrier(barriers);
- }
-
- NVRenderOcclusionQuery *NVRenderContextImpl::CreateOcclusionQuery()
- {
- NVRenderOcclusionQuery *theQuery = NVRenderOcclusionQuery::Create(*this);
-
- return theQuery;
- }
-
- NVRenderTimerQuery *NVRenderContextImpl::CreateTimerQuery()
- {
- NVRenderTimerQuery *theQuery = NVRenderTimerQuery::Create(*this);
-
- return theQuery;
- }
-
- NVRenderSync *NVRenderContextImpl::CreateSync()
- {
- NVRenderSync *theSync = NVRenderSync::Create(*this);
-
- return theSync;
- }
-
- NVRenderTexture2D *NVRenderContextImpl::CreateTexture2D()
- {
- NVRenderTexture2D *retval = NVRenderTexture2D::Create(*this);
- if (retval)
- m_Tex2DToImpMap.insert(make_pair(retval->GetImplementationHandle(), retval));
- return retval;
- }
-
- NVRenderTexture2DArray *NVRenderContextImpl::CreateTexture2DArray()
- {
- NVRenderTexture2DArray *retval = NVRenderTexture2DArray::Create(*this);
- if (retval)
- m_Tex2DArrayToImpMap.insert(make_pair(retval->GetTextureObjectHandle(), retval));
-
- return retval;
- }
-
- NVRenderTextureCube *NVRenderContextImpl::CreateTextureCube()
- {
- NVRenderTextureCube *retval = NVRenderTextureCube::Create(*this);
- if (retval)
- m_TexCubeToImpMap.insert(make_pair(retval->GetTextureObjectHandle(), retval));
-
- return retval;
- }
-
- NVRenderTexture2D *NVRenderContextImpl::GetTexture2D(const void *implementationHandle)
- {
- const nvhash_map<const void *, NVRenderTexture2D *>::iterator entry =
- m_Tex2DToImpMap.find(implementationHandle);
- if (entry != m_Tex2DToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::TextureDestroyed(NVRenderTexture2D &buffer)
- {
- m_Tex2DToImpMap.erase(buffer.GetImplementationHandle());
- // We would like to find and catch any situations where this texture is being used
- // but that would require some real work that we don't want to do right now.
- }
-
- void NVRenderContextImpl::TextureDestroyed(NVRenderTexture2DArray &buffer)
- {
- m_Tex2DArrayToImpMap.erase(buffer.GetTextureObjectHandle());
- }
-
- void NVRenderContextImpl::TextureDestroyed(NVRenderTextureCube &buffer)
- {
- m_TexCubeToImpMap.erase(buffer.GetTextureObjectHandle());
- }
-
- NVRenderImage2D *NVRenderContextImpl::CreateImage2D(NVRenderTexture2D *inTexture,
- NVRenderImageAccessType::Enum inAccess)
- {
- NVRenderImage2D *retval = NVRenderImage2D::Create(*this, inTexture, inAccess);
- if (retval)
- m_Image2DtoImpMap.insert(make_pair(retval->GetTextureObjectHandle(), retval));
-
- return retval;
- }
-
- void NVRenderContextImpl::ImageDestroyed(NVRenderImage2D &image)
- {
- m_Image2DtoImpMap.erase(image.GetTextureObjectHandle());
- }
-
- // IF this texture isn't on a texture unit, put it on one.
- // If it is on a texture unit, mark it as the most recently used texture.
- QT3DSU32 NVRenderContextImpl::GetNextTextureUnit()
- {
- QT3DSU32 retval = m_NextTextureUnit;
- ++m_NextTextureUnit;
- // Too many texture units for a single draw call.
- if (retval >= m_MaxTextureUnits) {
- QT3DS_ASSERT(false);
- retval = retval % m_MaxTextureUnits;
- }
- return retval;
- }
-
- NVRenderRenderBuffer *
- NVRenderContextImpl::CreateRenderBuffer(NVRenderRenderBufferFormats::Enum bufferFormat,
- QT3DSU32 width, QT3DSU32 height)
- {
- NVRenderRenderBuffer *retval =
- NVRenderRenderBuffer::Create(*this, bufferFormat, width, height);
- if (retval != NULL)
- m_RenderBufferToImpMap.insert(make_pair(retval->GetImplementationHandle(), retval));
- return retval;
- }
-
- NVRenderRenderBuffer *NVRenderContextImpl::GetRenderBuffer(const void *implementationHandle)
- {
- const nvhash_map<const void *, NVRenderRenderBuffer *>::iterator entry =
- m_RenderBufferToImpMap.find(implementationHandle);
- if (entry != m_RenderBufferToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::RenderBufferDestroyed(NVRenderRenderBuffer &buffer)
- {
- m_RenderBufferToImpMap.erase(buffer.GetImplementationHandle());
- }
-
- NVRenderFrameBuffer *NVRenderContextImpl::CreateFrameBuffer()
- {
- NVRenderFrameBuffer *retval = NVRenderFrameBuffer::Create(*this);
- if (retval != NULL)
- m_FrameBufferToImpMap.insert(make_pair(retval->GetImplementationHandle(), retval));
- return retval;
- }
-
- NVRenderFrameBuffer *NVRenderContextImpl::GetFrameBuffer(const void *implementationHandle)
- {
- const nvhash_map<const void *, NVRenderFrameBuffer *>::iterator entry =
- m_FrameBufferToImpMap.find(implementationHandle);
- if (entry != m_FrameBufferToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::FrameBufferDestroyed(NVRenderFrameBuffer &fb)
- {
- m_FrameBufferToImpMap.erase(fb.GetImplementationHandle());
- if (m_HardwarePropertyContext.m_FrameBuffer == &fb)
- m_HardwarePropertyContext.m_FrameBuffer = NULL;
- }
-
- NVRenderAttribLayout *
- NVRenderContextImpl::CreateAttributeLayout(NVConstDataRef<NVRenderVertexBufferEntry> attribs)
- {
- return QT3DS_NEW(GetFoundation().getAllocator(), NVRenderAttribLayout)(*this, attribs);
- }
-
- NVRenderInputAssembler *NVRenderContextImpl::CreateInputAssembler(
- NVRenderAttribLayout *attribLayout, NVConstDataRef<NVRenderVertexBuffer *> buffers,
- const NVRenderIndexBuffer *indexBuffer, NVConstDataRef<QT3DSU32> strides,
- NVConstDataRef<QT3DSU32> offsets, NVRenderDrawMode::Enum primType, QT3DSU32 patchVertexCount)
- {
- return QT3DS_NEW(GetFoundation().getAllocator(),
- NVRenderInputAssembler)(*this, attribLayout, buffers, indexBuffer, strides,
- offsets, primType, patchVertexCount);
- }
-
- void NVRenderContextImpl::SetInputAssembler(NVRenderInputAssembler *inputAssembler)
- {
- if (m_HardwarePropertyContext.m_InputAssembler != inputAssembler) {
- DoSetInputAssembler(inputAssembler);
- }
- }
-
- NVRenderVertFragCompilationResult NVRenderContextImpl::CompileSource(
- const char *shaderName, NVConstDataRef<QT3DSI8> vertShader, NVConstDataRef<QT3DSI8> fragShader,
- NVConstDataRef<QT3DSI8> tessControlShaderSource,
- NVConstDataRef<QT3DSI8> tessEvaluationShaderSource, NVConstDataRef<QT3DSI8> geometryShaderSource,
- bool separateProgram, NVRenderShaderProgramBinaryType::Enum type, bool binaryProgram)
- {
- NVRenderVertFragCompilationResult result = NVRenderShaderProgram::Create(
- *this, shaderName, vertShader, fragShader, tessControlShaderSource,
- tessEvaluationShaderSource, geometryShaderSource, separateProgram, type, binaryProgram);
-
- if (result.mShader != NULL)
- m_ShaderToImpMap.insert(
- make_pair(result.mShader->GetShaderProgramHandle(), result.mShader));
-
- return result;
- }
-
- NVRenderVertFragCompilationResult NVRenderContextImpl::CompileBinary(
- const char *shaderName, NVRenderShaderProgramBinaryType::Enum type,
- NVDataRef<QT3DSI8> vertShader, NVDataRef<QT3DSI8> fragShader,
- NVDataRef<QT3DSI8> tessControlShaderSource, NVDataRef<QT3DSI8> tessEvaluationShaderSource,
- NVConstDataRef<QT3DSI8> geometryShaderSource)
- {
-#ifndef _MACOSX
- NVRenderVertFragCompilationResult result = NVRenderShaderProgram::Create(
- *this, shaderName, vertShader, fragShader, tessControlShaderSource,
- tessEvaluationShaderSource, geometryShaderSource, false, type, true);
-
- if (result.mShader != NULL)
- m_ShaderToImpMap.insert(
- make_pair(result.mShader->GetShaderProgramHandle(), result.mShader));
-
- return result;
-#else
- QT3DS_ASSERT(false);
- return NVRenderVertFragCompilationResult();
-#endif
- }
-
- NVRenderVertFragCompilationResult
- NVRenderContextImpl::CompileComputeSource(const char *shaderName,
- NVConstDataRef<QT3DSI8> computeShaderSource)
- {
- NVRenderVertFragCompilationResult result =
- NVRenderShaderProgram::CreateCompute(*this, shaderName, computeShaderSource);
-
- if (result.mShader != NULL)
- m_ShaderToImpMap.insert(
- make_pair(result.mShader->GetShaderProgramHandle(), result.mShader));
-
- return result;
- }
-
- NVRenderShaderProgram *NVRenderContextImpl::GetShaderProgram(const void *implementationHandle)
- {
- const nvhash_map<const void *, NVRenderShaderProgram *>::iterator entry =
- m_ShaderToImpMap.find(implementationHandle);
- if (entry != m_ShaderToImpMap.end())
- return entry->second;
- return NULL;
- }
-
- void NVRenderContextImpl::ShaderDestroyed(NVRenderShaderProgram &shader)
- {
- m_ShaderToImpMap.erase(shader.GetShaderProgramHandle());
- if (m_HardwarePropertyContext.m_ActiveShader == &shader)
- SetActiveShader(NULL);
- }
-
- NVRenderProgramPipeline *NVRenderContextImpl::CreateProgramPipeline()
- {
- return QT3DS_NEW(GetFoundation().getAllocator(), NVRenderProgramPipeline)(*this,
- GetFoundation());
- }
-
- NVRenderPathSpecification *NVRenderContextImpl::CreatePathSpecification()
- {
- return NVRenderPathSpecification::CreatePathSpecification(*this);
- }
-
- NVRenderPathRender *NVRenderContextImpl::CreatePathRender(size_t range)
- {
- return NVRenderPathRender::Create(*this, range);
- }
-
- void NVRenderContextImpl::SetPathProjectionMatrix(const QT3DSMat44 inPathProjection)
- {
- m_backend->SetPathProjectionMatrix(inPathProjection);
- }
-
- void NVRenderContextImpl::SetPathModelViewMatrix(const QT3DSMat44 inPathModelview)
- {
- m_backend->SetPathModelViewMatrix(inPathModelview);
- }
-
- void NVRenderContextImpl::SetPathStencilDepthOffset(QT3DSF32 inSlope, QT3DSF32 inBias)
- {
- m_backend->SetPathStencilDepthOffset(inSlope, inBias);
- }
- void NVRenderContextImpl::SetPathCoverDepthFunc(NVRenderBoolOp::Enum inFunc)
- {
- m_backend->SetPathCoverDepthFunc(inFunc);
- }
-
- NVRenderPathFontSpecification *
- NVRenderContextImpl::CreatePathFontSpecification(CRegisteredString fontName)
- {
- // first check if it already exists
- nvhash_map<CRegisteredString, NVRenderPathFontSpecification *>::const_iterator entry =
- m_PathFontSpecToImpMap.find(fontName);
- if (entry != m_PathFontSpecToImpMap.end())
- return entry->second;
-
- // if not create new one
- NVRenderPathFontSpecification *pPathFontSpec =
- NVRenderPathFontSpecification::CreatePathFontSpecification(*this, fontName);
-
- if (pPathFontSpec)
- m_PathFontSpecToImpMap.insert(make_pair(fontName, pPathFontSpec));
-
- return pPathFontSpec;
- }
-
- void
- NVRenderContextImpl::ReleasePathFontSpecification(NVRenderPathFontSpecification &inPathSpec)
- {
- m_PathFontSpecToImpMap.erase(inPathSpec.GetFontName());
- }
-
- NVRenderPathFontItem *NVRenderContextImpl::CreatePathFontItem()
- {
- // if not create new one
- return NVRenderPathFontItem::CreatePathFontItem(*this);
- }
-
- void NVRenderContextImpl::SetClearColor(QT3DSVec4 inClearColor)
- {
- if (m_HardwarePropertyContext.m_ClearColor != inClearColor)
- DoSetClearColor(inClearColor);
- }
-
- void NVRenderContextImpl::SetBlendFunction(NVRenderBlendFunctionArgument inFunctions)
- {
- if (memcmp(&inFunctions, &m_HardwarePropertyContext.m_BlendFunction,
- sizeof(NVRenderBlendFunctionArgument))) {
- DoSetBlendFunction(inFunctions);
- }
- }
-
- void NVRenderContextImpl::SetBlendEquation(NVRenderBlendEquationArgument inEquations)
- {
- if (memcmp(&inEquations, &m_HardwarePropertyContext.m_BlendEquation,
- sizeof(NVRenderBlendEquationArgument))) {
- DoSetBlendEquation(inEquations);
- }
- }
-
- void NVRenderContextImpl::SetCullingEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_CullingEnabled) {
- DoSetCullingEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetDepthFunction(qt3ds::render::NVRenderBoolOp::Enum inFunction)
- {
- if (inFunction != m_HardwarePropertyContext.m_DepthFunction) {
- DoSetDepthFunction(inFunction);
- }
- }
-
- void NVRenderContextImpl::SetBlendingEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_BlendingEnabled) {
- DoSetBlendingEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetColorWritesEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_ColorWritesEnabled) {
- DoSetColorWritesEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetDepthWriteEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_DepthWriteEnabled) {
- m_HardwarePropertyContext.m_DepthWriteEnabled = inEnabled;
- m_backend->SetRenderState(inEnabled, NVRenderState::DepthWrite);
- }
- }
-
- void NVRenderContextImpl::SetDepthTestEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_DepthTestEnabled) {
- DoSetDepthTestEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetMultisampleEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_MultisampleEnabled) {
- DoSetMultisampleEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetStencilTestEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_StencilTestEnabled) {
- DoSetStencilTestEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetScissorTestEnabled(bool inEnabled)
- {
- if (inEnabled != m_HardwarePropertyContext.m_ScissorTestEnabled) {
- DoSetScissorTestEnabled(inEnabled);
- }
- }
-
- void NVRenderContextImpl::SetScissorRect(NVRenderRect inRect)
- {
- if (memcmp(&inRect, &m_HardwarePropertyContext.m_ScissorRect, sizeof(NVRenderRect))) {
- DoSetScissorRect(inRect);
- }
- }
-
- void NVRenderContextImpl::SetViewport(NVRenderRect inViewport)
- {
- if (memcmp(&inViewport, &m_HardwarePropertyContext.m_Viewport, sizeof(NVRenderRect))) {
- DoSetViewport(inViewport);
- }
- }
-
- void NVRenderContextImpl::SetActiveShader(NVRenderShaderProgram *inShader)
- {
- if (inShader != m_HardwarePropertyContext.m_ActiveShader)
- DoSetActiveShader(inShader);
- }
-
- void NVRenderContextImpl::SetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline)
- {
- if (inProgramPipeline != m_HardwarePropertyContext.m_ActiveProgramPipeline)
- DoSetActiveProgramPipeline(inProgramPipeline);
- }
-
- void NVRenderContextImpl::DispatchCompute(NVRenderShaderProgram *inShader, QT3DSU32 numGroupsX,
- QT3DSU32 numGroupsY, QT3DSU32 numGroupsZ)
- {
- QT3DS_ASSERT(inShader);
-
- if (inShader != m_HardwarePropertyContext.m_ActiveShader)
- DoSetActiveShader(inShader);
-
- m_backend->DispatchCompute(inShader->GetShaderProgramHandle(), numGroupsX, numGroupsY,
- numGroupsZ);
-
- OnPostDraw();
- }
-
- void NVRenderContextImpl::SetDrawBuffers(NVConstDataRef<QT3DSI32> inDrawBufferSet)
- {
- m_backend->SetDrawBuffers(
- (m_HardwarePropertyContext.m_FrameBuffer)
- ? m_HardwarePropertyContext.m_FrameBuffer->GetFrameBuffertHandle()
- : NULL,
- inDrawBufferSet);
- }
-
- void NVRenderContextImpl::SetReadBuffer(NVReadFaces::Enum inReadFace)
- {
- // currently NULL which means the read target must be set with setReadTarget
- m_backend->SetReadBuffer(NULL, inReadFace);
- }
-
- void NVRenderContextImpl::ReadPixels(NVRenderRect inRect,
- NVRenderReadPixelFormats::Enum inFormat,
- NVDataRef<QT3DSU8> inWriteBuffer)
- {
- // NULL means read from current render target
- m_backend->ReadPixel(NULL, inRect.m_X, inRect.m_Y, inRect.m_Width, inRect.m_Height,
- inFormat, (void *)inWriteBuffer.begin());
- }
-
- void NVRenderContextImpl::SetRenderTarget(NVRenderFrameBuffer *inBuffer)
- {
- if (inBuffer != m_HardwarePropertyContext.m_FrameBuffer) {
- DoSetRenderTarget(inBuffer);
- }
- }
-
- void NVRenderContextImpl::SetReadTarget(NVRenderFrameBuffer *inBuffer)
- {
- if (inBuffer != m_HardwarePropertyContext.m_FrameBuffer) {
- DoSetReadTarget(inBuffer);
- }
- }
-
- void NVRenderContextImpl::ResetBlendState()
- {
- QT3DSI32_4 values;
-
- m_backend->SetRenderState(m_HardwarePropertyContext.m_BlendingEnabled,
- NVRenderState::Blend);
- const NVRenderBlendFunctionArgument &theBlendArg(m_HardwarePropertyContext.m_BlendFunction);
- m_backend->SetBlendFunc(theBlendArg);
- }
-
- // Pop the entire set of properties, potentially forcing the values
- // to opengl.
- void NVRenderContextImpl::PopPropertySet(bool inForceSetProperties)
- {
- if (!m_PropertyStack.empty()) {
- SNVGLHardPropertyContext &theTopContext(m_PropertyStack.back());
- if (inForceSetProperties) {
-#define HANDLE_CONTEXT_HARDWARE_PROPERTY(setterName, propName) \
- DoSet##setterName(theTopContext.m_##propName);
-
- ITERATE_HARDWARE_CONTEXT_PROPERTIES
-
-#undef HANDLE_CONTEXT_HARDWARE_PROPERTY
- } else {
-#define HANDLE_CONTEXT_HARDWARE_PROPERTY(setterName, propName) \
- Set##setterName(theTopContext.m_##propName);
-
- ITERATE_HARDWARE_CONTEXT_PROPERTIES
-
-#undef HANDLE_CONTEXT_HARDWARE_PROPERTY
- }
- m_PropertyStack.pop_back();
- }
- }
-
- void NVRenderContextImpl::Clear(NVRenderClearFlags flags)
- {
- if ((flags & NVRenderClearValues::Depth)
- && m_HardwarePropertyContext.m_DepthWriteEnabled == false) {
- QT3DS_ASSERT(false);
- SetDepthWriteEnabled(true);
- }
- m_backend->Clear(flags);
- }
-
- void NVRenderContextImpl::Clear(NVRenderFrameBuffer &fb, NVRenderClearFlags flags)
- {
- NVRenderFrameBuffer *previous = m_HardwarePropertyContext.m_FrameBuffer;
- if (previous != &fb)
- SetRenderTarget(&fb);
-
- Clear(flags);
-
- if (previous != &fb)
- SetRenderTarget(previous);
- }
-
- void NVRenderContextImpl::BlitFramebuffer(QT3DSI32 srcX0, QT3DSI32 srcY0, QT3DSI32 srcX1, QT3DSI32 srcY1,
- QT3DSI32 dstX0, QT3DSI32 dstY0, QT3DSI32 dstX1, QT3DSI32 dstY1,
- NVRenderClearFlags flags,
- NVRenderTextureMagnifyingOp::Enum filter)
- {
- m_backend->BlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, flags,
- filter);
- }
-
- bool
- NVRenderContextImpl::BindShaderToInputAssembler(const NVRenderInputAssembler *inputAssembler,
- NVRenderShaderProgram *shader)
- {
- // setup the input assembler object
- return m_backend->SetInputAssembler(inputAssembler->GetInputAssemblerHandle(),
- shader->GetShaderProgramHandle());
- }
-
- bool NVRenderContextImpl::ApplyPreDrawProperties()
- {
- // Get the currently bound vertex and shader
- NVRenderInputAssembler *inputAssembler = this->m_HardwarePropertyContext.m_InputAssembler;
- NVRenderShaderProgram *shader = this->m_HardwarePropertyContext.m_ActiveShader;
-
- // we could render through a program pipline
- if (shader == NULL && this->m_HardwarePropertyContext.m_ActiveProgramPipeline)
- shader = this->m_HardwarePropertyContext.m_ActiveProgramPipeline->GetVertexStage();
-
- if (inputAssembler == NULL || shader == NULL) {
- qCCritical(INVALID_OPERATION,
- "Attempting to render no valid shader or input assembler setup");
- QT3DS_ASSERT(false);
- return false;
- }
-
- return BindShaderToInputAssembler(inputAssembler, shader);
- }
-
- void NVRenderContextImpl::OnPostDraw()
- {
- // reset input assembler binding
- m_backend->SetInputAssembler(NULL, 0);
- // Texture unit 0 is used for setting up and loading textures.
- // Bugs happen if we load a texture then setup the sampler.
- // Then we load another texture. Because when loading we use texture unit 0,
- // the render bindings for the first texture are blown away.
- // Again, for this reason, texture unit 0 is reserved for loading textures.
- m_NextTextureUnit = 1;
- m_NextConstantBufferUnit = 0;
- }
-
- void NVRenderContextImpl::Draw(NVRenderDrawMode::Enum drawMode, QT3DSU32 count, QT3DSU32 offset)
- {
- if (!ApplyPreDrawProperties())
- return;
-
- NVRenderIndexBuffer *theIndexBuffer = const_cast<NVRenderIndexBuffer *>(
- m_HardwarePropertyContext.m_InputAssembler->GetIndexBuffer());
- if (theIndexBuffer == NULL)
- m_backend->Draw(drawMode, offset, count);
- else
- theIndexBuffer->Draw(drawMode, count, offset);
-
- OnPostDraw();
- }
-
- void NVRenderContextImpl::DrawIndirect(NVRenderDrawMode::Enum drawMode, QT3DSU32 offset)
- {
- if (!ApplyPreDrawProperties())
- return;
-
- NVRenderIndexBuffer *theIndexBuffer = const_cast<NVRenderIndexBuffer *>(
- m_HardwarePropertyContext.m_InputAssembler->GetIndexBuffer());
- if (theIndexBuffer == NULL)
- m_backend->DrawIndirect(drawMode, (const void *)offset);
- else
- theIndexBuffer->DrawIndirect(drawMode, offset);
-
- OnPostDraw();
- }
-
- QT3DSMat44
- NVRenderContext::ApplyVirtualViewportToProjectionMatrix(const QT3DSMat44 &inProjection,
- const NVRenderRectF &inViewport,
- const NVRenderRectF &inVirtualViewport)
- {
- if (inVirtualViewport == inViewport)
- return inProjection;
- // Run conversion to floating point once.
- NVRenderRectF theVirtualViewport(inVirtualViewport);
- NVRenderRectF theViewport(inViewport);
- if (theVirtualViewport.m_Width == 0 || theVirtualViewport.m_Height == 0
- || theViewport.m_Width == 0 || theViewport.m_Height == 0) {
- QT3DS_ASSERT(false);
- return inProjection;
- }
- QT3DSMat44 theScaleTransMat(QT3DSMat44::createIdentity());
- QT3DSF32 theHeightDiff = theViewport.m_Height - theVirtualViewport.m_Height;
- QT3DSF32 theViewportOffY = theVirtualViewport.m_Y - theViewport.m_Y;
- QT3DSVec2 theCameraOffsets = QT3DSVec2(theVirtualViewport.m_Width - theViewport.m_Width
- + (theVirtualViewport.m_X - theViewport.m_X) * 2.0f,
- theHeightDiff + (theViewportOffY - theHeightDiff) * 2.0f);
- QT3DSVec2 theCameraScale = QT3DSVec2(theVirtualViewport.m_Width / theViewport.m_Width,
- theVirtualViewport.m_Height / theViewport.m_Height);
-
- QT3DSVec3 theTranslation(theCameraOffsets.x / theViewport.m_Width,
- theCameraOffsets.y / theViewport.m_Height, 0);
- theScaleTransMat.column3[0] = theTranslation.x;
- theScaleTransMat.column3[1] = theTranslation.y;
- theScaleTransMat.column0[0] = theCameraScale.x;
- theScaleTransMat.column1[1] = theCameraScale.y;
-
- return theScaleTransMat * inProjection;
- }
-
- NVRenderVertFragCompilationResult NVRenderContext::CompileSource(
- const char *shaderName, const char *vertShader, QT3DSU32 inVertLen, const char *fragShader,
- QT3DSU32 inFragLen, const char *tessControlShaderSource, QT3DSU32 inTCLen,
- const char *tessEvaluationShaderSource, QT3DSU32 inTELen, const char *geometryShaderSource,
- QT3DSU32 inGSLen, bool separableProgram)
- {
- return CompileSource(
- shaderName, NVConstDataRef<QT3DSI8>((const QT3DSI8 *)vertShader, inVertLen),
- NVConstDataRef<QT3DSI8>((const QT3DSI8 *)fragShader, inFragLen),
- NVConstDataRef<QT3DSI8>((const QT3DSI8 *)tessControlShaderSource, inTCLen),
- NVConstDataRef<QT3DSI8>((const QT3DSI8 *)tessEvaluationShaderSource, inTELen),
- NVConstDataRef<QT3DSI8>((const QT3DSI8 *)geometryShaderSource, inGSLen), separableProgram);
- }
-
- void NVRenderContextImpl::DoSetActiveShader(NVRenderShaderProgram *inShader)
- {
- m_HardwarePropertyContext.m_ActiveShader = NULL;
- if (inShader)
- m_backend->SetActiveProgram(inShader->GetShaderProgramHandle());
- else {
- m_backend->SetActiveProgram(NULL);
- }
- m_HardwarePropertyContext.m_ActiveShader = inShader;
- }
-
- void NVRenderContextImpl::DoSetActiveProgramPipeline(NVRenderProgramPipeline *inProgramPipeline)
- {
- if (inProgramPipeline) {
- // invalid any bound shader
- DoSetActiveShader(NULL);
- inProgramPipeline->Bind();
- } else
- m_backend->SetActiveProgramPipeline(NULL);
-
- m_HardwarePropertyContext.m_ActiveProgramPipeline = inProgramPipeline;
- }
-
- NVRenderContext &NVRenderContext::CreateNULL(NVFoundationBase &foundation,
- IStringTable &inStringTable)
- {
- NVRenderContext *retval = NULL;
-
- // create backend
- NVScopedRefCounted<IStringTable> theStringTable(inStringTable);
- NVScopedRefCounted<NVRenderBackend> theBackend =
- NVRenderBackendNULL::CreateBackend(foundation);
- retval = QT3DS_NEW(foundation.getAllocator(), NVRenderContextImpl)(foundation, *theBackend,
- *theStringTable);
- return *retval;
- }
-}
-} // end namespace