Skip to content

Commit f08a2b0

Browse files
committed
Review texture storage implementations and add fallback mode
1 parent ca1978c commit f08a2b0

23 files changed

+472
-103
lines changed

source/globjects/CMakeLists.txt

+11
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,17 @@ set(sources
195195
${source_path}/implementations/TextureImplementation_DirectStateAccessEXT.h
196196
${source_path}/implementations/TextureImplementation_Legacy.cpp
197197
${source_path}/implementations/TextureImplementation_Legacy.h
198+
199+
${source_path}/implementations/AbstractTextureStorageImplementation.cpp
200+
${source_path}/implementations/AbstractTextureStorageImplementation.h
201+
${source_path}/implementations/TextureStorageImplementation_DirectStateAccessARB.cpp
202+
${source_path}/implementations/TextureStorageImplementation_DirectStateAccessARB.h
203+
${source_path}/implementations/TextureStorageImplementation_DirectStateAccessEXT.cpp
204+
${source_path}/implementations/TextureStorageImplementation_DirectStateAccessEXT.h
205+
${source_path}/implementations/TextureStorageImplementation_Legacy.cpp
206+
${source_path}/implementations/TextureStorageImplementation_Legacy.h
207+
${source_path}/implementations/TextureStorageImplementation_Fallback.cpp
208+
${source_path}/implementations/TextureStorageImplementation_Fallback.h
198209

199210
${source_path}/implementations/AbstractUniformImplementation.cpp
200211
${source_path}/implementations/AbstractUniformImplementation.h

source/globjects/include/globjects/Texture.h

+9
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,16 @@ class GLOBJECTS_API Texture : public Object
3535
, Legacy
3636
};
3737

38+
enum class StorageImplementation
39+
{
40+
DirectStateAccessARB
41+
, DirectStateAccessEXT
42+
, Legacy
43+
, Fallback
44+
};
45+
3846
static void hintBindlessImplementation(BindlessImplementation impl);
47+
static void hintStorageImplementation(StorageImplementation impl);
3948

4049
Texture();
4150
Texture(gl::GLenum target);

source/globjects/source/Resource.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -191,14 +191,14 @@ ShaderResource::~ShaderResource()
191191

192192

193193
TextureResource::TextureResource(GLenum target)
194-
: IDResource(ImplementationRegistry::current().textureImplementation().create(target))
194+
: IDResource(ImplementationRegistry::current().textureBindlessImplementation().create(target))
195195
{
196196
}
197197

198198
TextureResource::~TextureResource()
199199
{
200200
if (hasOwnership())
201-
ImplementationRegistry::current().textureImplementation().destroy(id());
201+
ImplementationRegistry::current().textureBindlessImplementation().destroy(id());
202202
}
203203

204204

source/globjects/source/Texture.cpp

+32-26
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,20 @@
1515

1616
#include "registry/ImplementationRegistry.h"
1717
#include "implementations/AbstractTextureImplementation.h"
18+
#include "implementations/AbstractTextureStorageImplementation.h"
1819

1920

2021
namespace
2122
{
2223

23-
const globjects::AbstractTextureImplementation & implementation()
24+
const globjects::AbstractTextureImplementation & bindlessImplementation()
2425
{
25-
return globjects::ImplementationRegistry::current().textureImplementation();
26+
return globjects::ImplementationRegistry::current().textureBindlessImplementation();
27+
}
28+
29+
const globjects::AbstractTextureStorageImplementation & storageImplementation()
30+
{
31+
return globjects::ImplementationRegistry::current().textureStorageImplementation();
2632
}
2733

2834
}
@@ -132,27 +138,27 @@ void Texture::setParameter(const GLenum name, const GLenum value)
132138

133139
void Texture::setParameter(const GLenum name, const GLint value)
134140
{
135-
implementation().setParameter(this, name, value);
141+
bindlessImplementation().setParameter(this, name, value);
136142
}
137143

138144
void Texture::setParameter(const GLenum name, const GLfloat value)
139145
{
140-
implementation().setParameter(this, name, value);
146+
bindlessImplementation().setParameter(this, name, value);
141147
}
142148

143149
void Texture::setParameter(gl::GLenum name, const glm::vec4 & value)
144150
{
145-
implementation().setParameter(this, name, value);
151+
bindlessImplementation().setParameter(this, name, value);
146152
}
147153

148154
GLint Texture::getParameter(const GLenum pname) const
149155
{
150-
return implementation().getParameter(this, pname);
156+
return bindlessImplementation().getParameter(this, pname);
151157
}
152158

153159
GLint Texture::getLevelParameter(const GLint level, const GLenum pname) const
154160
{
155-
return implementation().getLevelParameter(this, level, pname);
161+
return bindlessImplementation().getLevelParameter(this, level, pname);
156162
}
157163

158164
void Texture::getImage(const GLint level, const GLenum format, const GLenum type, GLvoid * image) const
@@ -195,22 +201,22 @@ std::vector<unsigned char> Texture::getCompressedImage(const GLint lod) const
195201

196202
void Texture::image1D(const GLint level, const GLenum internalFormat, const GLsizei width, const GLint border, const GLenum format, const GLenum type, const GLvoid * data)
197203
{
198-
implementation().image1D(this, level, internalFormat, width, border, format, type, data);
204+
bindlessImplementation().image1D(this, level, internalFormat, width, border, format, type, data);
199205
}
200206

201207
void Texture::compressedImage1D(const GLint level, const GLenum internalFormat, const GLsizei width, const GLint border, const GLsizei imageSize, const GLvoid * data)
202208
{
203-
implementation().compressedImage1D(this, level, internalFormat, width, border, imageSize, data);
209+
bindlessImplementation().compressedImage1D(this, level, internalFormat, width, border, imageSize, data);
204210
}
205211

206212
void Texture::subImage1D(const GLint level, const GLint xOffset, const GLsizei width, const GLenum format, const GLenum type, const GLvoid * data)
207213
{
208-
implementation().subImage1D(this, level, xOffset, width, format, type, data);
214+
bindlessImplementation().subImage1D(this, level, xOffset, width, format, type, data);
209215
}
210216

211217
void Texture::image2D(const GLint level, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLint border, const GLenum format, const GLenum type, const GLvoid* data)
212218
{
213-
implementation().image2D(this, level, internalFormat, width, height, border, format, type, data);
219+
bindlessImplementation().image2D(this, level, internalFormat, width, height, border, format, type, data);
214220
}
215221

216222
void Texture::image2D(const GLint level, const GLenum internalFormat, const glm::ivec2 & size, const GLint border, const GLenum format, const GLenum type, const GLvoid* data)
@@ -220,7 +226,7 @@ void Texture::image2D(const GLint level, const GLenum internalFormat, const glm:
220226

221227
void Texture::compressedImage2D(const GLint level, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLint border, const GLsizei imageSize, const GLvoid * data)
222228
{
223-
implementation().compressedImage2D(this, level, internalFormat, width, height, border, imageSize, data);
229+
bindlessImplementation().compressedImage2D(this, level, internalFormat, width, height, border, imageSize, data);
224230
}
225231

226232
void Texture::compressedImage2D(const GLint level, const GLenum internalFormat, const glm::ivec2 & size, const GLint border, const GLsizei imageSize, const GLvoid * data)
@@ -230,7 +236,7 @@ void Texture::compressedImage2D(const GLint level, const GLenum internalFormat,
230236

231237
void Texture::subImage2D(const GLint level, const GLint xOffset, const GLint yOffset, const GLsizei width, const GLsizei height, const GLenum format, const GLenum type, const GLvoid * data)
232238
{
233-
implementation().subImage2D(this, level, xOffset, yOffset, width, height, format, type, data);
239+
bindlessImplementation().subImage2D(this, level, xOffset, yOffset, width, height, format, type, data);
234240
}
235241

236242
void Texture::subImage2D(const GLint level, const glm::ivec2& offset, const glm::ivec2& size, const GLenum format, const GLenum type, const GLvoid * data)
@@ -240,7 +246,7 @@ void Texture::subImage2D(const GLint level, const glm::ivec2& offset, const glm:
240246

241247
void Texture::image3D(const GLint level, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLsizei depth, const GLint border, const GLenum format, const GLenum type, const GLvoid* data)
242248
{
243-
implementation().image3D(this, level, internalFormat, width, height, depth, border, format, type, data);
249+
bindlessImplementation().image3D(this, level, internalFormat, width, height, depth, border, format, type, data);
244250
}
245251

246252
void Texture::image3D(const GLint level, const GLenum internalFormat, const glm::ivec3 & size, const GLint border, const GLenum format, const GLenum type, const GLvoid* data)
@@ -250,7 +256,7 @@ void Texture::image3D(const GLint level, const GLenum internalFormat, const glm:
250256

251257
void Texture::compressedImage3D(const GLint level, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLsizei depth, const GLint border, const GLsizei imageSize, const GLvoid * data)
252258
{
253-
implementation().compressedImage3D(this, level, internalFormat, width, height, depth, border, imageSize, data);
259+
bindlessImplementation().compressedImage3D(this, level, internalFormat, width, height, depth, border, imageSize, data);
254260
}
255261

256262
void Texture::compressedImage3D(GLint level, GLenum internalFormat, const glm::ivec3 & size, GLint border, GLsizei imageSize, const GLvoid * data)
@@ -260,7 +266,7 @@ void Texture::compressedImage3D(GLint level, GLenum internalFormat, const glm::i
260266

261267
void Texture::subImage3D(const GLint level, const GLint xOffset, const GLint yOffset, const GLint zOffset, const GLsizei width, const GLsizei height, const GLsizei depth, const GLenum format, const GLenum type, const GLvoid * data)
262268
{
263-
implementation().subImage3D(this, level, xOffset, yOffset, zOffset, width, height, depth, format, type, data);
269+
bindlessImplementation().subImage3D(this, level, xOffset, yOffset, zOffset, width, height, depth, format, type, data);
264270
}
265271

266272
void Texture::subImage3D(const GLint level, const glm::ivec3& offset, const glm::ivec3& size, const GLenum format, const GLenum type, const GLvoid * data)
@@ -270,7 +276,7 @@ void Texture::subImage3D(const GLint level, const glm::ivec3& offset, const glm:
270276

271277
void Texture::image2DMultisample(const GLsizei samples, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLboolean fixedSamplesLocations)
272278
{
273-
implementation().image2DMultisample(this, samples, internalFormat, width, height, fixedSamplesLocations);
279+
bindlessImplementation().image2DMultisample(this, samples, internalFormat, width, height, fixedSamplesLocations);
274280
}
275281

276282
void Texture::image2DMultisample(const GLsizei samples, const GLenum internalFormat, const glm::ivec2 & size, const GLboolean fixedSamplesLocations)
@@ -280,7 +286,7 @@ void Texture::image2DMultisample(const GLsizei samples, const GLenum internalFor
280286

281287
void Texture::image3DMultisample(const GLsizei samples, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLsizei depth, const GLboolean fixedSamplesLocations)
282288
{
283-
implementation().image3DMultisample(this, samples, internalFormat, width, height, depth, fixedSamplesLocations);
289+
bindlessImplementation().image3DMultisample(this, samples, internalFormat, width, height, depth, fixedSamplesLocations);
284290
}
285291

286292
void Texture::image3DMultisample(const GLsizei samples, const GLenum internalFormat, const glm::ivec3 & size, const GLboolean fixedSamplesLocations)
@@ -290,12 +296,12 @@ void Texture::image3DMultisample(const GLsizei samples, const GLenum internalFor
290296

291297
void Texture::storage1D(const GLsizei levels, const GLenum internalFormat, const GLsizei width)
292298
{
293-
implementation().storage1D(this, levels, internalFormat, width);
299+
storageImplementation().storage1D(this, levels, internalFormat, width);
294300
}
295301

296302
void Texture::storage2D(const GLsizei levels, const GLenum internalFormat, const GLsizei width, const GLsizei height)
297303
{
298-
implementation().storage2D(this, levels, internalFormat, width, height);
304+
storageImplementation().storage2D(this, levels, internalFormat, width, height);
299305
}
300306

301307
void Texture::storage2D(const GLsizei levels, const GLenum internalFormat, const glm::ivec2 & size)
@@ -305,7 +311,7 @@ void Texture::storage2D(const GLsizei levels, const GLenum internalFormat, const
305311

306312
void Texture::storage3D(const GLsizei levels, const GLenum internalFormat, const GLsizei width, const GLsizei height, const GLsizei depth)
307313
{
308-
implementation().storage3D(this, levels, internalFormat, width, height, depth);
314+
storageImplementation().storage3D(this, levels, internalFormat, width, height, depth);
309315
}
310316

311317
void Texture::storage3D(const GLsizei levels, const GLenum internalFormat, const glm::ivec3 & size)
@@ -320,12 +326,12 @@ void Texture::textureView(const GLuint originalTexture, const GLenum internalFor
320326

321327
void Texture::texBuffer(const GLenum internalFormat, Buffer * buffer)
322328
{
323-
implementation().texBuffer(this, internalFormat, buffer);
329+
bindlessImplementation().texBuffer(this, internalFormat, buffer);
324330
}
325331

326332
void Texture::texBufferRange(const GLenum internalFormat, Buffer * buffer, const GLintptr offset, const GLsizeiptr size)
327333
{
328-
implementation().texBufferRange(this, internalFormat, buffer, offset, size);
334+
bindlessImplementation().texBufferRange(this, internalFormat, buffer, offset, size);
329335
}
330336

331337
void Texture::clearImage(const GLint level, const GLenum format, const GLenum type, const void * data)
@@ -401,12 +407,12 @@ void Texture::unbindImageTexture(const GLuint unit)
401407

402408
void Texture::generateMipmap()
403409
{
404-
implementation().generateMipMap(this);
410+
bindlessImplementation().generateMipMap(this);
405411
}
406412

407413
void Texture::cubeMapImage(gl::GLint level, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLint border, gl::GLenum format, gl::GLenum type, const gl::GLvoid * data)
408414
{
409-
implementation().cubeMapImage(this, level, internalFormat, width, height, border, format, type, data);
415+
bindlessImplementation().cubeMapImage(this, level, internalFormat, width, height, border, format, type, data);
410416
}
411417

412418
void Texture::cubeMapImage(gl::GLint level, gl::GLenum internalFormat, const glm::ivec2 & size, gl::GLint border, gl::GLenum format, gl::GLenum type, const gl::GLvoid * data)
@@ -431,7 +437,7 @@ TextureHandle Texture::textureHandle(Sampler * sampler) const
431437

432438
void Texture::pageCommitment(const GLint level, const GLint xOffset, const GLint yOffset, const GLint zOffset, const GLsizei width, const GLsizei height, const GLsizei depth, const GLboolean commit) const
433439
{
434-
implementation().pageCommitment(this, level, xOffset, yOffset, zOffset, width, height, depth, commit);
440+
bindlessImplementation().pageCommitment(this, level, xOffset, yOffset, zOffset, width, height, depth, commit);
435441
}
436442

437443
void Texture::pageCommitment(const GLint level, const glm::ivec3& offset, const glm::ivec3& size, const GLboolean commit) const

source/globjects/source/implementations/AbstractTextureImplementation.h

-4
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ class AbstractTextureImplementation
4343
virtual void image2DMultisample(const Texture * texture, gl::GLsizei samples, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLboolean fixedSamplesLocations) const = 0;
4444
virtual void image3DMultisample(const Texture * texture, gl::GLsizei samples, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLsizei depth, gl::GLboolean fixedSamplesLocations) const = 0;
4545

46-
virtual void storage1D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width) const = 0;
47-
virtual void storage2D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height) const = 0;
48-
virtual void storage3D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLsizei depth) const = 0;
49-
5046
virtual void cubeMapImage(const Texture * texture, gl::GLint level, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLint border, gl::GLenum format, gl::GLenum type, const gl::GLvoid * data) const = 0;
5147

5248
virtual void texBuffer(const Texture * texture, const gl::GLenum internalFormat, Buffer * buffer) const = 0;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
2+
#include "AbstractTextureStorageImplementation.h"
3+
4+
#include <glbinding/gl/enum.h>
5+
#include <glbinding/gl/extension.h>
6+
7+
#include <globjects/globjects.h>
8+
9+
#include "TextureStorageImplementation_DirectStateAccessARB.h"
10+
#include "TextureStorageImplementation_DirectStateAccessEXT.h"
11+
#include "TextureStorageImplementation_Legacy.h"
12+
#include "TextureStorageImplementation_Fallback.h"
13+
14+
15+
using namespace gl;
16+
17+
namespace globjects
18+
{
19+
20+
AbstractTextureStorageImplementation::AbstractTextureStorageImplementation()
21+
{
22+
}
23+
24+
AbstractTextureStorageImplementation::~AbstractTextureStorageImplementation()
25+
{
26+
}
27+
28+
AbstractTextureStorageImplementation * AbstractTextureStorageImplementation::get(const Texture::StorageImplementation impl)
29+
{
30+
if (!hasExtension(GLextension::GL_ARB_texture_storage))
31+
{
32+
return TextureStorageImplementation_Fallback::instance();
33+
}
34+
35+
if (impl == Texture::StorageImplementation::DirectStateAccessARB
36+
&& hasExtension(GLextension::GL_ARB_direct_state_access))
37+
{
38+
return TextureStorageImplementation_DirectStateAccessARB::instance();
39+
}
40+
else if (impl >= Texture::StorageImplementation::DirectStateAccessEXT
41+
&& hasExtension(GLextension::GL_EXT_direct_state_access))
42+
{
43+
return TextureStorageImplementation_DirectStateAccessEXT::instance();
44+
}
45+
else
46+
{
47+
return TextureStorageImplementation_Legacy::instance();
48+
}
49+
}
50+
51+
} // namespace globjects
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#pragma once
2+
3+
#include <glbinding/gl/types.h>
4+
5+
#include <globjects/Texture.h>
6+
7+
namespace globjects
8+
{
9+
10+
class AbstractTextureStorageImplementation
11+
{
12+
public:
13+
AbstractTextureStorageImplementation();
14+
virtual ~AbstractTextureStorageImplementation();
15+
16+
static AbstractTextureStorageImplementation * get(Texture::StorageImplementation impl =
17+
Texture::StorageImplementation::DirectStateAccessARB);
18+
19+
virtual void storage1D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width) const = 0;
20+
virtual void storage2D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height) const = 0;
21+
virtual void storage3D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLsizei depth) const = 0;
22+
23+
virtual void cubeMapStorage(const Texture * texture, gl::GLint levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height) const = 0;
24+
};
25+
26+
} // namespace globjects

source/globjects/source/implementations/TextureImplementation_DirectStateAccessARB.cpp

-15
Original file line numberDiff line numberDiff line change
@@ -129,21 +129,6 @@ void TextureImplementation_DirectStateAccessARB::image3DMultisample(const Textur
129129
gl::glTextureImage3DMultisampleNV(texture->id(), texture->target(), samples, static_cast<gl::GLint>(internalFormat), width, height, depth, fixedSamplesLocations);
130130
}
131131

132-
void TextureImplementation_DirectStateAccessARB::storage1D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width) const
133-
{
134-
gl::glTextureStorage1D(texture->id(), levels, internalFormat, width);
135-
}
136-
137-
void TextureImplementation_DirectStateAccessARB::storage2D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height) const
138-
{
139-
gl::glTextureStorage2D(texture->id(), levels, internalFormat, width, height);
140-
}
141-
142-
void TextureImplementation_DirectStateAccessARB::storage3D(const Texture * texture, gl::GLsizei levels, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLsizei depth) const
143-
{
144-
gl::glTextureStorage3D(texture->id(), levels, internalFormat, width, height, depth);
145-
}
146-
147132
void TextureImplementation_DirectStateAccessARB::cubeMapImage(const Texture * texture, gl::GLint level, gl::GLenum internalFormat, gl::GLsizei width, gl::GLsizei height, gl::GLint border, gl::GLenum format, gl::GLenum type, const gl::GLvoid * data) const
148133
{
149134
get(Texture::BindlessImplementation::DirectStateAccessEXT)->cubeMapImage(texture, level, internalFormat, width, height, border, format, type, data);

0 commit comments

Comments
 (0)