@@ -54,66 +54,100 @@ class ResourceRegistry
5454 m_Resources.resize (ResourceCount);
5555 }
5656
57- void Insert (ResourceIdType Id, IDeviceObject* pObject)
58- {
59- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
60- m_Resources[Id] = pObject;
61- }
62-
63- bool IsInitialized (ResourceIdType Id) const
64- {
65- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
66- return m_Resources[Id] != nullptr ;
67- }
68-
69- ITexture* GetTexture (ResourceIdType Id) const
70- {
71- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
72- DEV_CHECK_ERR (RefCntAutoPtr<ITexture>(m_Resources[Id], IID_Texture), " Resource is not a texture" );
73- return StaticCast<ITexture*>(m_Resources[Id]);
74- }
75-
76- IBuffer* GetBuffer (ResourceIdType Id) const
77- {
78- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
79- DEV_CHECK_ERR (RefCntAutoPtr<IBuffer>(m_Resources[Id], IID_Buffer), " Resource is not a buffer" );
80- return StaticCast<IBuffer*>(m_Resources[Id]);
81- }
82-
83- ITextureView* GetTextureSRV (ResourceIdType Id) const
84- {
85- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
86- return GetTextureDefaultSRV (m_Resources[Id]);
87- }
88-
89- ITextureView* GetTextureRTV (ResourceIdType Id) const
90- {
91- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
92- return GetTextureDefaultRTV (m_Resources[Id]);
93- }
94-
95- ITextureView* GetTextureDSV (ResourceIdType Id) const
57+ size_t GetSize () const
9658 {
97- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
98- return GetTextureDefaultDSV (m_Resources[Id]);
59+ return m_Resources.size ();
9960 }
10061
101- ITextureView* GetTextureUAV (ResourceIdType Id) const
62+ void Insert (ResourceIdType Id, IDeviceObject* pObject)
10263 {
10364 DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
104- return GetTextureDefaultUAV ( m_Resources[Id]) ;
65+ m_Resources[Id] = pObject ;
10566 }
10667
107- IBufferView* GetBufferSRV (ResourceIdType Id) const
68+ struct ResourceAccessor
10869 {
109- DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
110- return GetBufferDefaultSRV (m_Resources[Id]);
111- }
112-
113- IBufferView* GetBufferUAV (ResourceIdType Id) const
70+ explicit operator bool () const
71+ {
72+ return Object != nullptr ;
73+ }
74+
75+ ITexture* AsTexture () const
76+ {
77+ DEV_CHECK_ERR (Object != nullptr , " Resource is null" );
78+ DEV_CHECK_ERR (RefCntAutoPtr<ITexture>(Object, IID_Texture), " Resource is not a texture" );
79+ return StaticCast<ITexture*>(Object);
80+ }
81+
82+ IBuffer* AsBuffer () const
83+ {
84+ DEV_CHECK_ERR (Object != nullptr , " Resource is null" );
85+ DEV_CHECK_ERR (RefCntAutoPtr<IBuffer>(Object, IID_Buffer), " Resource is not a buffer" );
86+ return StaticCast<IBuffer*>(Object);
87+ }
88+
89+ operator ITexture*() const
90+ {
91+ return AsTexture ();
92+ }
93+
94+ operator IBuffer*() const
95+ {
96+ return AsBuffer ();
97+ }
98+
99+ operator IDeviceObject*() const
100+ {
101+ return Object;
102+ }
103+
104+ IDeviceObject* operator ->() const
105+ {
106+ return Object;
107+ }
108+
109+ ITextureView* GetTextureSRV () const
110+ {
111+ return GetTextureDefaultSRV (Object);
112+ }
113+
114+ ITextureView* GetTextureRTV () const
115+ {
116+ return GetTextureDefaultRTV (Object);
117+ }
118+
119+ ITextureView* GetTextureDSV () const
120+ {
121+ return GetTextureDefaultDSV (Object);
122+ }
123+
124+ ITextureView* GetTextureUAV () const
125+ {
126+ return GetTextureDefaultUAV (Object);
127+ }
128+
129+ IBufferView* GetBufferSRV () const
130+ {
131+ return GetBufferDefaultSRV (Object);
132+ }
133+
134+ IBufferView* GetBufferUAV () const
135+ {
136+ return GetBufferDefaultUAV (Object);
137+ }
138+
139+ private:
140+ ResourceAccessor (const RefCntAutoPtr<IDeviceObject>& _Object) :
141+ Object{_Object}
142+ {}
143+ friend ResourceRegistry;
144+ const RefCntAutoPtr<IDeviceObject>& Object;
145+ };
146+
147+ ResourceAccessor operator [](ResourceIdType Id) const
114148 {
115149 DEV_CHECK_ERR (Id < m_Resources.size (), " Resource index is out of range" );
116- return GetBufferDefaultUAV ( m_Resources[Id]) ;
150+ return ResourceAccessor{ m_Resources[Id]} ;
117151 }
118152
119153private:
0 commit comments