Diligent Engine  v.2.4.g
PipelineResourceSignatureGLImpl.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2019-2021 Diligent Graphics LLC
3  * Copyright 2015-2019 Egor Yusov
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * In no event and under no legal theory, whether in tort (including negligence),
18  * contract, or otherwise, unless required by applicable law (such as deliberate
19  * and grossly negligent acts) or agreed to in writing, shall any Contributor be
20  * liable for any damages, including any direct, indirect, special, incidental,
21  * or consequential damages of any character arising as a result of this License or
22  * out of the use or inability to use the software (including but not limited to damages
23  * for loss of goodwill, work stoppage, computer failure or malfunction, or any and
24  * all other commercial damages or losses), even if such Contributor has been advised
25  * of the possibility of such damages.
26  */
27 
28 #pragma once
29 
32 
33 #include <array>
34 
35 #include "EngineGLImplTraits.hpp"
38 #include "ShaderResourcesGL.hpp"
39 
40 // ShaderVariableManagerGL, ShaderResourceCacheGL, and ShaderResourceBindingGLImpl
41 // are required by PipelineResourceSignatureBase
45 
46 namespace Diligent
47 {
48 
50 {
57 };
59 const char* GetBindingRangeName(BINDING_RANGE Range);
60 
61 
63 class PipelineResourceSignatureGLImpl final : public PipelineResourceSignatureBase<EngineGLImplTraits>
64 {
65 public:
67 
69  RenderDeviceGLImpl* pDevice,
71  bool bIsDeviceInternal = false);
73 
75 
76  const ResourceAttribs& GetResourceAttribs(Uint32 ResIndex) const
77  {
78  VERIFY_EXPR(ResIndex < m_Desc.NumResources);
79  return m_pResourceAttribs[ResIndex];
80  }
81 
82  using TBindings = std::array<Uint16, BINDING_RANGE_COUNT>;
83 
84  // Applies bindings for resources in this signature to GLProgram.
85  // The bindings are biased by BaseBindings.
87  class GLContextState& State,
88  SHADER_TYPE Stages,
89  const TBindings& BaseBindings) const;
90 
91  __forceinline void ShiftBindings(TBindings& Bindings) const
92  {
93  for (Uint32 i = 0; i < Bindings.size(); ++i)
94  {
95  Bindings[i] += m_BindingCount[i];
96  }
97  }
98 
99  void InitSRBResourceCache(ShaderResourceCacheGL& ResourceCache);
100 
101 #ifdef DILIGENT_DEVELOPMENT
102  bool DvpValidateCommittedResource(const ShaderResourcesGL::GLResourceAttribs& GLAttribs,
104  RESOURCE_DIMENSION ResourceDim,
105  bool IsMultisample,
106  Uint32 ResIndex,
107  const ShaderResourceCacheGL& ResourceCache,
108  const char* ShaderName,
109  const char* PSOName) const;
110 #endif
111 
112  // Copies static resources from the static resource cache to the destination cache
113  void CopyStaticResources(ShaderResourceCacheGL& ResourceCache) const;
114 
116  {
117  auto ImtblSamIdx = InvalidImmutableSamplerIndex;
118  if (Res.IsImmutableSamplerAssigned())
119  ImtblSamIdx = Res.SamplerInd;
120  else if (Res.IsSamplerAssigned())
121  {
123  const auto& SamAttribs = GetResourceAttribs(Res.SamplerInd);
124  if (SamAttribs.IsImmutableSamplerAssigned())
125  ImtblSamIdx = SamAttribs.SamplerInd;
126  }
127  VERIFY_EXPR(ImtblSamIdx == InvalidImmutableSamplerIndex || ImtblSamIdx < GetImmutableSamplerCount());
128  return ImtblSamIdx;
129  }
130 
131 private:
132  void CreateLayout();
133 
134  void Destruct();
135 
136 private:
137  TBindings m_BindingCount = {};
138 
139  ResourceAttribs* m_pResourceAttribs = nullptr; // [m_Desc.NumResources]
140 
141  using SamplerPtr = RefCntAutoPtr<ISampler>;
142  SamplerPtr* m_ImmutableSamplers = nullptr; // [m_Desc.NumImmutableSamplers]
143 };
144 
145 } // namespace Diligent
Diligent::PipelineResourceSignatureGLImpl
Implementation of the Diligent::PipelineResourceSignatureGLImpl class.
Definition: PipelineResourceSignatureGLImpl.hpp:63
Diligent::IReferenceCounters
Base interface for a reference counter object that stores the number of strong and weak references an...
Definition: ReferenceCounters.h:44
Diligent::PipelineResourceAttribsGL::IsSamplerAssigned
bool IsSamplerAssigned() const
Definition: PipelineResourceAttribsGL.hpp:73
Diligent::ShaderResourcesGL::GLResourceAttribs
Definition: ShaderResourcesGL.hpp:70
Diligent::PipelineResourceSignatureGLImpl::CopyStaticResources
void CopyStaticResources(ShaderResourceCacheGL &ResourceCache) const
Definition: PipelineResourceSignatureGLImpl.cpp:358
Diligent::PipelineResourceToBindingRange
BINDING_RANGE PipelineResourceToBindingRange(const PipelineResourceDesc &Desc)
Definition: PipelineResourceSignatureGLImpl.cpp:55
Diligent::GetBindingRangeName
const char * GetBindingRangeName(BINDING_RANGE Range)
Definition: PipelineResourceSignatureGLImpl.cpp:39
Diligent::PipelineResourceSignatureDesc
Pipeline resource signature description.
Definition: PipelineResourceSignature.h:166
Diligent::SHADER_TYPE
SHADER_TYPE
Describes the shader type.
Definition: GraphicsTypes.h:65
ShaderResourceCacheGL.hpp
Diligent::SHADER_RESOURCE_TYPE_SAMPLER
@ SHADER_RESOURCE_TYPE_SAMPLER
Sampler (separate sampler)
Definition: Shader.h:377
Diligent::PipelineResourceSignatureGLImpl::PipelineResourceSignatureGLImpl
PipelineResourceSignatureGLImpl(IReferenceCounters *pRefCounters, RenderDeviceGLImpl *pDevice, const PipelineResourceSignatureDesc &Desc, bool bIsDeviceInternal=false)
Definition: PipelineResourceSignatureGLImpl.cpp:77
Diligent::BINDING_RANGE_TEXTURE
@ BINDING_RANGE_TEXTURE
Definition: PipelineResourceSignatureGLImpl.hpp:52
PipelineResourceAttribsGL.hpp
Diligent::DeviceObjectBase< EngineGLImplTraits ::PipelineResourceSignatureInterface, EngineGLImplTraits ::RenderDeviceImplType, PipelineResourceSignatureDesc >::m_Desc
PipelineResourceSignatureDesc m_Desc
Object description.
Definition: DeviceObjectBase.hpp:182
Diligent::ShaderResourceCacheGL
The class implements a cache that holds resources bound to a specific GL program.
Definition: ShaderResourceCacheGL.hpp:49
Diligent::PipelineResourceSignatureGLImpl::GetResourceAttribs
const ResourceAttribs & GetResourceAttribs(Uint32 ResIndex) const
Definition: PipelineResourceSignatureGLImpl.hpp:76
Diligent::PipelineResourceAttribsGL
Definition: PipelineResourceAttribsGL.hpp:41
Diligent::BINDING_RANGE_UNIFORM_BUFFER
@ BINDING_RANGE_UNIFORM_BUFFER
Definition: PipelineResourceSignatureGLImpl.hpp:51
Diligent::PipelineResourceSignatureGLImpl::ApplyBindings
void ApplyBindings(GLObjectWrappers::GLProgramObj &GLProgram, class GLContextState &State, SHADER_TYPE Stages, const TBindings &BaseBindings) const
Definition: PipelineResourceSignatureGLImpl.cpp:225
ShaderResourcesGL.hpp
Diligent::PipelineResourceSignatureGLImpl::ShiftBindings
__forceinline void ShiftBindings(TBindings &Bindings) const
Definition: PipelineResourceSignatureGLImpl.hpp:91
Diligent::PipelineResourceSignatureDesc::NumResources
Uint32 NumResources
The number of resources in Resources array.
Definition: PipelineResourceSignature.h:172
Diligent::PipelineResourceSignatureBase< EngineGLImplTraits >::GetImmutableSamplerCount
Uint32 GetImmutableSamplerCount() const
Definition: PipelineResourceSignatureBase.hpp:321
Diligent::BINDING_RANGE_COUNT
@ BINDING_RANGE_COUNT
Definition: PipelineResourceSignatureGLImpl.hpp:55
Diligent::BINDING_RANGE_IMAGE
@ BINDING_RANGE_IMAGE
Definition: PipelineResourceSignatureGLImpl.hpp:53
ShaderResourceBindingGLImpl.hpp
Diligent::PipelineResourceAttribsGL::SamplerInd
const Uint32 SamplerInd
Definition: PipelineResourceAttribsGL.hpp:55
Diligent::PipelineResourceSignatureBase< EngineGLImplTraits >::GetResourceDesc
const PipelineResourceDesc & GetResourceDesc(Uint32 ResIndex) const
Definition: PipelineResourceSignatureBase.hpp:381
Diligent::Uint32
uint32_t Uint32
32-bit unsigned integer
Definition: BasicTypes.h:51
Diligent::BINDING_RANGE_UNKNOWN
@ BINDING_RANGE_UNKNOWN
Definition: PipelineResourceSignatureGLImpl.hpp:56
Diligent::RenderDeviceGLImpl
Render device implementation in OpenGL backend.
Definition: RenderDeviceGLImpl.hpp:45
PipelineResourceSignatureBase.hpp
Diligent::PipelineResourceSignatureGLImpl::TBindings
std::array< Uint16, BINDING_RANGE_COUNT > TBindings
Definition: PipelineResourceSignatureGLImpl.hpp:82
Diligent::PipelineResourceDesc::ResourceType
SHADER_RESOURCE_TYPE ResourceType
Resource type, see Diligent::SHADER_RESOURCE_TYPE.
Definition: PipelineResourceSignature.h:136
Diligent::BINDING_RANGE
BINDING_RANGE
Definition: PipelineResourceSignatureGLImpl.hpp:49
EngineGLImplTraits.hpp
Diligent::PipelineResourceSignatureGLImpl::ResourceAttribs
PipelineResourceAttribsGL ResourceAttribs
Definition: PipelineResourceSignatureGLImpl.hpp:74
GLObjectWrappers::GLObjWrapper
Definition: GLObjectWrapper.hpp:36
Diligent::PipelineResourceDesc
struct PipelineResourceDesc PipelineResourceDesc
Definition: PipelineResourceSignature.h:162
VERIFY_EXPR
#define VERIFY_EXPR(...)
Definition: DebugUtilities.hpp:79
Diligent::GLContextState
Definition: GLContextState.hpp:39
Diligent::PipelineResourceSignatureGLImpl::~PipelineResourceSignatureGLImpl
~PipelineResourceSignatureGLImpl()
Definition: PipelineResourceSignatureGLImpl.cpp:205
Diligent::RESOURCE_DIMENSION
RESOURCE_DIMENSION
Describes resource dimension.
Definition: GraphicsTypes.h:256
Diligent::PipelineResourceSignatureGLImpl::GetImmutableSamplerIdx
Uint32 GetImmutableSamplerIdx(const ResourceAttribs &Res) const
Definition: PipelineResourceSignatureGLImpl.hpp:115
Diligent::PipelineResourceSignatureBase
Template class implementing base functionality of the pipeline resource signature object.
Definition: PipelineResourceSignatureBase.hpp:78
Diligent::BINDING_RANGE_STORAGE_BUFFER
@ BINDING_RANGE_STORAGE_BUFFER
Definition: PipelineResourceSignatureGLImpl.hpp:54
Diligent::PipelineResourceAttribsGL::IsImmutableSamplerAssigned
bool IsImmutableSamplerAssigned() const
Definition: PipelineResourceAttribsGL.hpp:78
Diligent::PipelineResourceSignatureGLImpl::InitSRBResourceCache
void InitSRBResourceCache(ShaderResourceCacheGL &ResourceCache)
Definition: PipelineResourceSignatureGLImpl.cpp:467
ShaderVariableManagerGL.hpp
Diligent
The library uses Direct3D-style math:
Definition: AdvancedMath.hpp:37