mirror of
https://github.com/overte-org/overte.git
synced 2025-08-06 22:39:18 +02:00
Merge pull request #8695 from jherico/texture_transfer_crash
Fix crash in initializing texture transfer thread
This commit is contained in:
commit
769a29332c
2 changed files with 24 additions and 1 deletions
|
@ -18,7 +18,6 @@
|
||||||
std::unordered_map<TexturePointer, nvtxRangeId_t> _map;
|
std::unordered_map<TexturePointer, nvtxRangeId_t> _map;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//#define TEXTURE_TRANSFER_PBOS
|
|
||||||
|
|
||||||
#ifdef TEXTURE_TRANSFER_PBOS
|
#ifdef TEXTURE_TRANSFER_PBOS
|
||||||
#define TEXTURE_TRANSFER_BLOCK_SIZE (64 * 1024)
|
#define TEXTURE_TRANSFER_BLOCK_SIZE (64 * 1024)
|
||||||
|
@ -62,11 +61,16 @@ void GLTextureTransferHelper::transferTexture(const gpu::TexturePointer& texture
|
||||||
void GLTextureTransferHelper::setup() {
|
void GLTextureTransferHelper::setup() {
|
||||||
#ifdef THREADED_TEXTURE_TRANSFER
|
#ifdef THREADED_TEXTURE_TRANSFER
|
||||||
_context.makeCurrent();
|
_context.makeCurrent();
|
||||||
|
|
||||||
|
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||||
|
// FIXME don't use opengl 4.5 DSA functionality without verifying it's present
|
||||||
glCreateRenderbuffers(1, &_drawRenderbuffer);
|
glCreateRenderbuffers(1, &_drawRenderbuffer);
|
||||||
glNamedRenderbufferStorage(_drawRenderbuffer, GL_RGBA8, 128, 128);
|
glNamedRenderbufferStorage(_drawRenderbuffer, GL_RGBA8, 128, 128);
|
||||||
glCreateFramebuffers(1, &_drawFramebuffer);
|
glCreateFramebuffers(1, &_drawFramebuffer);
|
||||||
glNamedFramebufferRenderbuffer(_drawFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _drawRenderbuffer);
|
glNamedFramebufferRenderbuffer(_drawFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _drawRenderbuffer);
|
||||||
glCreateFramebuffers(1, &_readFramebuffer);
|
glCreateFramebuffers(1, &_readFramebuffer);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef TEXTURE_TRANSFER_PBOS
|
#ifdef TEXTURE_TRANSFER_PBOS
|
||||||
std::array<GLuint, TEXTURE_TRANSFER_PBO_COUNT> pbos;
|
std::array<GLuint, TEXTURE_TRANSFER_PBO_COUNT> pbos;
|
||||||
glCreateBuffers(TEXTURE_TRANSFER_PBO_COUNT, &pbos[0]);
|
glCreateBuffers(TEXTURE_TRANSFER_PBO_COUNT, &pbos[0]);
|
||||||
|
@ -84,7 +88,9 @@ void GLTextureTransferHelper::setup() {
|
||||||
void GLTextureTransferHelper::shutdown() {
|
void GLTextureTransferHelper::shutdown() {
|
||||||
#ifdef THREADED_TEXTURE_TRANSFER
|
#ifdef THREADED_TEXTURE_TRANSFER
|
||||||
_context.makeCurrent();
|
_context.makeCurrent();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||||
glNamedFramebufferRenderbuffer(_drawFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
|
glNamedFramebufferRenderbuffer(_drawFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
|
||||||
glDeleteFramebuffers(1, &_drawFramebuffer);
|
glDeleteFramebuffers(1, &_drawFramebuffer);
|
||||||
_drawFramebuffer = 0;
|
_drawFramebuffer = 0;
|
||||||
|
@ -165,6 +171,11 @@ bool GLTextureTransferHelper::process() {
|
||||||
}
|
}
|
||||||
|
|
||||||
gltexture->finishTransfer();
|
gltexture->finishTransfer();
|
||||||
|
|
||||||
|
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||||
|
// FIXME force a draw on the texture transfer thread before passing the texture to the main thread for use
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef THREADED_TEXTURE_TRANSFER
|
#ifdef THREADED_TEXTURE_TRANSFER
|
||||||
clientWait();
|
clientWait();
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,6 +21,14 @@
|
||||||
#define THREADED_TEXTURE_TRANSFER
|
#define THREADED_TEXTURE_TRANSFER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef THREADED_TEXTURE_TRANSFER
|
||||||
|
// FIXME when sparse textures are enabled, it's harder to force a draw on the transfer thread
|
||||||
|
// also, the current draw code is implicitly using OpenGL 4.5 functionality
|
||||||
|
//#define TEXTURE_TRANSFER_FORCE_DRAW
|
||||||
|
// FIXME PBO's increase the complexity and don't seem to work reliably
|
||||||
|
//#define TEXTURE_TRANSFER_PBOS
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace gpu { namespace gl {
|
namespace gpu { namespace gl {
|
||||||
|
|
||||||
using TextureList = std::list<TexturePointer>;
|
using TextureList = std::list<TexturePointer>;
|
||||||
|
@ -43,11 +51,15 @@ public:
|
||||||
private:
|
private:
|
||||||
#ifdef THREADED_TEXTURE_TRANSFER
|
#ifdef THREADED_TEXTURE_TRANSFER
|
||||||
::gl::OffscreenContext _context;
|
::gl::OffscreenContext _context;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||||
// Framebuffers / renderbuffers for forcing access to the texture on the transfer thread
|
// Framebuffers / renderbuffers for forcing access to the texture on the transfer thread
|
||||||
GLuint _drawRenderbuffer { 0 };
|
GLuint _drawRenderbuffer { 0 };
|
||||||
GLuint _drawFramebuffer { 0 };
|
GLuint _drawFramebuffer { 0 };
|
||||||
GLuint _readFramebuffer { 0 };
|
GLuint _readFramebuffer { 0 };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// A mutex for protecting items access on the render and transfer threads
|
// A mutex for protecting items access on the render and transfer threads
|
||||||
Mutex _mutex;
|
Mutex _mutex;
|
||||||
// Commands that have been submitted for execution on the texture transfer thread
|
// Commands that have been submitted for execution on the texture transfer thread
|
||||||
|
|
Loading…
Reference in a new issue