mirror of
https://thingvellir.net/git/overte
synced 2025-03-27 23:52:03 +01: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;
|
||||
#endif
|
||||
|
||||
//#define TEXTURE_TRANSFER_PBOS
|
||||
|
||||
#ifdef TEXTURE_TRANSFER_PBOS
|
||||
#define TEXTURE_TRANSFER_BLOCK_SIZE (64 * 1024)
|
||||
|
@ -62,11 +61,16 @@ void GLTextureTransferHelper::transferTexture(const gpu::TexturePointer& texture
|
|||
void GLTextureTransferHelper::setup() {
|
||||
#ifdef THREADED_TEXTURE_TRANSFER
|
||||
_context.makeCurrent();
|
||||
|
||||
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||
// FIXME don't use opengl 4.5 DSA functionality without verifying it's present
|
||||
glCreateRenderbuffers(1, &_drawRenderbuffer);
|
||||
glNamedRenderbufferStorage(_drawRenderbuffer, GL_RGBA8, 128, 128);
|
||||
glCreateFramebuffers(1, &_drawFramebuffer);
|
||||
glNamedFramebufferRenderbuffer(_drawFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _drawRenderbuffer);
|
||||
glCreateFramebuffers(1, &_readFramebuffer);
|
||||
#endif
|
||||
|
||||
#ifdef TEXTURE_TRANSFER_PBOS
|
||||
std::array<GLuint, TEXTURE_TRANSFER_PBO_COUNT> pbos;
|
||||
glCreateBuffers(TEXTURE_TRANSFER_PBO_COUNT, &pbos[0]);
|
||||
|
@ -84,7 +88,9 @@ void GLTextureTransferHelper::setup() {
|
|||
void GLTextureTransferHelper::shutdown() {
|
||||
#ifdef THREADED_TEXTURE_TRANSFER
|
||||
_context.makeCurrent();
|
||||
#endif
|
||||
|
||||
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||
glNamedFramebufferRenderbuffer(_drawFramebuffer, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, 0);
|
||||
glDeleteFramebuffers(1, &_drawFramebuffer);
|
||||
_drawFramebuffer = 0;
|
||||
|
@ -165,6 +171,11 @@ bool GLTextureTransferHelper::process() {
|
|||
}
|
||||
|
||||
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
|
||||
clientWait();
|
||||
#endif
|
||||
|
|
|
@ -21,6 +21,14 @@
|
|||
#define THREADED_TEXTURE_TRANSFER
|
||||
#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 {
|
||||
|
||||
using TextureList = std::list<TexturePointer>;
|
||||
|
@ -43,11 +51,15 @@ public:
|
|||
private:
|
||||
#ifdef THREADED_TEXTURE_TRANSFER
|
||||
::gl::OffscreenContext _context;
|
||||
#endif
|
||||
|
||||
#ifdef TEXTURE_TRANSFER_FORCE_DRAW
|
||||
// Framebuffers / renderbuffers for forcing access to the texture on the transfer thread
|
||||
GLuint _drawRenderbuffer { 0 };
|
||||
GLuint _drawFramebuffer { 0 };
|
||||
GLuint _readFramebuffer { 0 };
|
||||
#endif
|
||||
|
||||
// A mutex for protecting items access on the render and transfer threads
|
||||
Mutex _mutex;
|
||||
// Commands that have been submitted for execution on the texture transfer thread
|
||||
|
|
Loading…
Reference in a new issue