summaryrefslogtreecommitdiffstats
path: root/Graphics
diff options
context:
space:
mode:
authorEgor Yusov <egor.yusov@gmail.com>2019-10-23 03:05:14 +0000
committerEgor Yusov <egor.yusov@gmail.com>2019-10-23 03:05:14 +0000
commitde2944ba73141f1ebdef0c7e6f83c2c40b85f547 (patch)
tree99fe3994e949ecdc4fe9b5a4ba325803aa97fb2d /Graphics
parentD3D11 and GL backends: fixed instanced draw calls with one instance and non-z... (diff)
downloadDiligentCore-de2944ba73141f1ebdef0c7e6f83c2c40b85f547.tar.gz
DiligentCore-de2944ba73141f1ebdef0c7e6f83c2c40b85f547.zip
Added validation and correction of IShaderVariable::SetArray arguments
Diffstat (limited to 'Graphics')
-rw-r--r--Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h16
-rw-r--r--Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h6
-rw-r--r--Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h2
-rw-r--r--Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h4
-rw-r--r--Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h2
5 files changed, 30 insertions, 0 deletions
diff --git a/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h b/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h
index 2501bd86..5227f84a 100644
--- a/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h
+++ b/Graphics/GraphicsEngine/include/ShaderResourceVariableBase.h
@@ -306,6 +306,22 @@ bool VerifyResourceViewBinding(const ResourceAttribsType& Attribs,
return BindingOK;
}
+inline void VerifyAndCorrectSetArrayArguments(const char* Name, Uint32 ArraySize, Uint32& FirstElement, Uint32& NumElements)
+{
+ if (FirstElement >= ArraySize)
+ {
+ LOG_ERROR_MESSAGE("SetArray arguments are invalid for '", Name,"' variable: FirstElement (", FirstElement, ") is out of allowed range 0 .. ", ArraySize-1);
+ FirstElement = ArraySize-1;
+ NumElements = 0;
+ }
+
+ if (FirstElement + NumElements > ArraySize)
+ {
+ LOG_ERROR_MESSAGE("SetArray arguments are invalid for '", Name,"' variable: specified element range (", FirstElement, " .. ",
+ FirstElement + NumElements-1, ") is out of array bounds 0 .. ", ArraySize-1);
+ NumElements = ArraySize - FirstElement;
+ }
+}
struct DefaultShaderVariableIDComparator
{
diff --git a/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h b/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h
index 5934e4c3..84caeaa8 100644
--- a/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h
+++ b/Graphics/GraphicsEngineD3D11/include/ShaderResourceLayoutD3D11.h
@@ -83,6 +83,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -110,6 +111,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -141,6 +143,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -166,6 +169,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -192,6 +196,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -217,6 +222,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.BindCount, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
diff --git a/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h b/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h
index d3a80679..1670f6a6 100644
--- a/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h
+++ b/Graphics/GraphicsEngineD3D12/include/ShaderVariableD3D12.h
@@ -61,6 +61,7 @@
#include "ShaderResourceVariableD3D.h"
#include "ShaderResourceLayoutD3D12.h"
+#include "ShaderResourceVariableBase.h"
namespace Diligent
{
@@ -172,6 +173,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Resource.Attribs.Name, m_Resource.Attribs.BindCount, FirstElement, NumElements);
for (Uint32 Elem = 0; Elem < NumElements; ++Elem)
m_Resource.BindResource(ppObjects[Elem], FirstElement + Elem, m_ParentManager.m_ResourceCache);
}
diff --git a/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h b/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h
index 6db22447..ddd79c38 100644
--- a/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h
+++ b/Graphics/GraphicsEngineOpenGL/include/GLPipelineResourceLayout.h
@@ -157,6 +157,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -187,6 +188,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -216,6 +218,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
@@ -245,6 +248,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Attribs.Name, m_Attribs.ArraySize, FirstElement, NumElements);
for(Uint32 elem=0; elem < NumElements; ++elem)
BindResource(ppObjects[elem], FirstElement+elem);
}
diff --git a/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h b/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h
index 59ef0e21..cfaa41a8 100644
--- a/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h
+++ b/Graphics/GraphicsEngineVulkan/include/ShaderVariableVk.h
@@ -58,6 +58,7 @@
#include <memory>
#include "ShaderResourceLayoutVk.h"
+#include "ShaderResourceVariableBase.h"
namespace Diligent
{
@@ -170,6 +171,7 @@ public:
virtual void SetArray(IDeviceObject* const* ppObjects, Uint32 FirstElement, Uint32 NumElements)override final
{
+ VerifyAndCorrectSetArrayArguments(m_Resource.SpirvAttribs.Name, m_Resource.SpirvAttribs.ArraySize, FirstElement, NumElements);
for (Uint32 Elem = 0; Elem < NumElements; ++Elem)
m_Resource.BindResource(ppObjects[Elem], FirstElement + Elem, m_ParentManager.m_ResourceCache);
}