mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 21:36:47 +02:00
More GPU api fixes, protect Buffer::flush
This commit is contained in:
parent
d34ac2cea8
commit
574737fbb5
7 changed files with 92 additions and 81 deletions
|
@ -362,7 +362,6 @@ void HmdDisplayPlugin::OverlayRenderer::build() {
|
||||||
vertices->append(sizeof(Vertex), (gpu::Byte*)&vertex);
|
vertices->append(sizeof(Vertex), (gpu::Byte*)&vertex);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
vertices->flush();
|
|
||||||
|
|
||||||
// Compute number of indices needed
|
// Compute number of indices needed
|
||||||
static const int VERTEX_PER_TRANGLE = 3;
|
static const int VERTEX_PER_TRANGLE = 3;
|
||||||
|
@ -389,7 +388,6 @@ void HmdDisplayPlugin::OverlayRenderer::build() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this->indices->append(indices);
|
this->indices->append(indices);
|
||||||
this->indices->flush();
|
|
||||||
format = std::make_shared<gpu::Stream::Format>(); // 1 for everyone
|
format = std::make_shared<gpu::Stream::Format>(); // 1 for everyone
|
||||||
format->setAttribute(gpu::Stream::POSITION, gpu::Stream::POSITION, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0);
|
format->setAttribute(gpu::Stream::POSITION, gpu::Stream::POSITION, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ), 0);
|
||||||
format->setAttribute(gpu::Stream::TEXCOORD, gpu::Stream::TEXCOORD, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV));
|
format->setAttribute(gpu::Stream::TEXCOORD, gpu::Stream::TEXCOORD, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV));
|
||||||
|
@ -438,7 +436,6 @@ void HmdDisplayPlugin::OverlayRenderer::render(HmdDisplayPlugin& plugin) {
|
||||||
for_each_eye([&](Eye eye){
|
for_each_eye([&](Eye eye){
|
||||||
uniforms.mvp = mvps[eye];
|
uniforms.mvp = mvps[eye];
|
||||||
uniformBuffers[eye]->setSubData(0, uniforms);
|
uniformBuffers[eye]->setSubData(0, uniforms);
|
||||||
uniformBuffers[eye]->flush();
|
|
||||||
});
|
});
|
||||||
plugin.render([&](gpu::Batch& batch) {
|
plugin.render([&](gpu::Batch& batch) {
|
||||||
batch.enableStereo(false);
|
batch.enableStereo(false);
|
||||||
|
|
|
@ -342,7 +342,6 @@ protected:
|
||||||
|
|
||||||
PipelineStageState() {
|
PipelineStageState() {
|
||||||
_cameraCorrectionBuffer.edit<CameraCorrection>() = CameraCorrection();
|
_cameraCorrectionBuffer.edit<CameraCorrection>() = CameraCorrection();
|
||||||
_cameraCorrectionBuffer._buffer->flush();
|
|
||||||
}
|
}
|
||||||
} _pipeline;
|
} _pipeline;
|
||||||
|
|
||||||
|
|
|
@ -8,50 +8,55 @@
|
||||||
#include "GL41Backend.h"
|
#include "GL41Backend.h"
|
||||||
#include "../gl/GLBuffer.h"
|
#include "../gl/GLBuffer.h"
|
||||||
|
|
||||||
|
namespace gpu {
|
||||||
|
namespace gl41 {
|
||||||
|
class GL41Buffer : public gl::GLBuffer {
|
||||||
|
using Parent = gpu::gl::GLBuffer;
|
||||||
|
static GLuint allocate() {
|
||||||
|
GLuint result;
|
||||||
|
glGenBuffers(1, &result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
GL41Buffer(const std::weak_ptr<gl::GLBackend>& backend, const Buffer& buffer, GL41Buffer* original) : Parent(backend, buffer, allocate()) {
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _buffer);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, _size, nullptr, GL_DYNAMIC_DRAW);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
|
||||||
|
if (original && original->_size) {
|
||||||
|
glBindBuffer(GL_COPY_WRITE_BUFFER, _buffer);
|
||||||
|
glBindBuffer(GL_COPY_READ_BUFFER, original->_buffer);
|
||||||
|
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, original->_size);
|
||||||
|
glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
|
||||||
|
glBindBuffer(GL_COPY_READ_BUFFER, 0);
|
||||||
|
(void)CHECK_GL_ERROR();
|
||||||
|
}
|
||||||
|
Backend::setGPUObject(buffer, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void transfer() override {
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, _buffer);
|
||||||
|
(void)CHECK_GL_ERROR();
|
||||||
|
Size offset;
|
||||||
|
Size size;
|
||||||
|
Size currentPage { 0 };
|
||||||
|
auto data = _gpuObject._renderSysmem.readData();
|
||||||
|
while (_gpuObject._renderPages.getNextTransferBlock(offset, size, currentPage)) {
|
||||||
|
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data + offset);
|
||||||
|
(void)CHECK_GL_ERROR();
|
||||||
|
}
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
|
(void)CHECK_GL_ERROR();
|
||||||
|
_gpuObject._renderPages._flags &= ~PageManager::DIRTY;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
using namespace gpu::gl41;
|
using namespace gpu::gl41;
|
||||||
|
|
||||||
class GL41Buffer : public gl::GLBuffer {
|
|
||||||
using Parent = gpu::gl::GLBuffer;
|
|
||||||
static GLuint allocate() {
|
|
||||||
GLuint result;
|
|
||||||
glGenBuffers(1, &result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
GL41Buffer(const std::weak_ptr<gl::GLBackend>& backend, const Buffer& buffer, GL41Buffer* original) : Parent(backend, buffer, allocate()) {
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, _buffer);
|
|
||||||
glBufferData(GL_ARRAY_BUFFER, _size, nullptr, GL_DYNAMIC_DRAW);
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
|
|
||||||
if (original && original->_size) {
|
|
||||||
glBindBuffer(GL_COPY_WRITE_BUFFER, _buffer);
|
|
||||||
glBindBuffer(GL_COPY_READ_BUFFER, original->_buffer);
|
|
||||||
glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, original->_size);
|
|
||||||
glBindBuffer(GL_COPY_WRITE_BUFFER, 0);
|
|
||||||
glBindBuffer(GL_COPY_READ_BUFFER, 0);
|
|
||||||
(void)CHECK_GL_ERROR();
|
|
||||||
}
|
|
||||||
Backend::setGPUObject(buffer, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void transfer() override {
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, _buffer);
|
|
||||||
(void)CHECK_GL_ERROR();
|
|
||||||
Size offset;
|
|
||||||
Size size;
|
|
||||||
Size currentPage { 0 };
|
|
||||||
auto data = _gpuObject._renderSysmem.readData();
|
|
||||||
while (_gpuObject._renderPages.getNextTransferBlock(offset, size, currentPage)) {
|
|
||||||
glBufferSubData(GL_ARRAY_BUFFER, offset, size, data + offset);
|
|
||||||
(void)CHECK_GL_ERROR();
|
|
||||||
}
|
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
|
||||||
(void)CHECK_GL_ERROR();
|
|
||||||
_gpuObject._renderPages._flags &= ~PageManager::DIRTY;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
GLuint GL41Backend::getBufferID(const Buffer& buffer) {
|
GLuint GL41Backend::getBufferID(const Buffer& buffer) {
|
||||||
return GL41Buffer::getId<GL41Buffer>(*this, buffer);
|
return GL41Buffer::getId<GL41Buffer>(*this, buffer);
|
||||||
|
|
|
@ -8,38 +8,43 @@
|
||||||
#include "GL45Backend.h"
|
#include "GL45Backend.h"
|
||||||
#include "../gl/GLBuffer.h"
|
#include "../gl/GLBuffer.h"
|
||||||
|
|
||||||
|
namespace gpu {
|
||||||
|
namespace gl45 {
|
||||||
|
class GL45Buffer : public gl::GLBuffer {
|
||||||
|
using Parent = gpu::gl::GLBuffer;
|
||||||
|
static GLuint allocate() {
|
||||||
|
GLuint result;
|
||||||
|
glCreateBuffers(1, &result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
GL45Buffer(const std::weak_ptr<gl::GLBackend>& backend, const Buffer& buffer, GLBuffer* original) : Parent(backend, buffer, allocate()) {
|
||||||
|
glNamedBufferStorage(_buffer, _size == 0 ? 256 : _size, nullptr, GL_DYNAMIC_STORAGE_BIT);
|
||||||
|
if (original && original->_size) {
|
||||||
|
glCopyNamedBufferSubData(original->_buffer, _buffer, 0, 0, std::min(original->_size, _size));
|
||||||
|
}
|
||||||
|
Backend::setGPUObject(buffer, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
void transfer() override {
|
||||||
|
Size offset;
|
||||||
|
Size size;
|
||||||
|
Size currentPage { 0 };
|
||||||
|
auto data = _gpuObject._renderSysmem.readData();
|
||||||
|
while (_gpuObject._renderPages.getNextTransferBlock(offset, size, currentPage)) {
|
||||||
|
glNamedBufferSubData(_buffer, (GLintptr)offset, (GLsizeiptr)size, data + offset);
|
||||||
|
}
|
||||||
|
(void)CHECK_GL_ERROR();
|
||||||
|
_gpuObject._renderPages._flags &= ~PageManager::DIRTY;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
using namespace gpu::gl45;
|
using namespace gpu::gl45;
|
||||||
|
|
||||||
class GL45Buffer : public gl::GLBuffer {
|
|
||||||
using Parent = gpu::gl::GLBuffer;
|
|
||||||
static GLuint allocate() {
|
|
||||||
GLuint result;
|
|
||||||
glCreateBuffers(1, &result);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
GL45Buffer(const std::weak_ptr<gl::GLBackend>& backend, const Buffer& buffer, GLBuffer* original) : Parent(backend, buffer, allocate()) {
|
|
||||||
glNamedBufferStorage(_buffer, _size == 0 ? 256 : _size, nullptr, GL_DYNAMIC_STORAGE_BIT);
|
|
||||||
if (original && original->_size) {
|
|
||||||
glCopyNamedBufferSubData(original->_buffer, _buffer, 0, 0, std::min(original->_size, _size));
|
|
||||||
}
|
|
||||||
Backend::setGPUObject(buffer, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
void transfer() override {
|
|
||||||
Size offset;
|
|
||||||
Size size;
|
|
||||||
Size currentPage { 0 };
|
|
||||||
auto data = _gpuObject._renderSysmem.readData();
|
|
||||||
while (_gpuObject._renderPages.getNextTransferBlock(offset, size, currentPage)) {
|
|
||||||
glNamedBufferSubData(_buffer, (GLintptr)offset, (GLsizeiptr)size, data + offset);
|
|
||||||
}
|
|
||||||
(void)CHECK_GL_ERROR();
|
|
||||||
_gpuObject._renderPages._flags &= ~PageManager::DIRTY;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
GLuint GL45Backend::getBufferID(const Buffer& buffer) {
|
GLuint GL45Backend::getBufferID(const Buffer& buffer) {
|
||||||
return GL45Buffer::getId<GL45Buffer>(*this, buffer);
|
return GL45Buffer::getId<GL45Buffer>(*this, buffer);
|
||||||
|
|
|
@ -126,6 +126,7 @@ public:
|
||||||
// Main thread operation to say that the buffer is ready to be used as a frame
|
// Main thread operation to say that the buffer is ready to be used as a frame
|
||||||
Update getUpdate() const;
|
Update getUpdate() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
// For use by the render thread to avoid the intermediate step of getUpdate/applyUpdate
|
// For use by the render thread to avoid the intermediate step of getUpdate/applyUpdate
|
||||||
void flush() const;
|
void flush() const;
|
||||||
|
|
||||||
|
@ -136,8 +137,7 @@ public:
|
||||||
|
|
||||||
mutable std::atomic<size_t> _getUpdateCount { 0 };
|
mutable std::atomic<size_t> _getUpdateCount { 0 };
|
||||||
mutable std::atomic<size_t> _applyUpdateCount { 0 };
|
mutable std::atomic<size_t> _applyUpdateCount { 0 };
|
||||||
//protected:
|
|
||||||
public:
|
|
||||||
void markDirty(Size offset, Size bytes);
|
void markDirty(Size offset, Size bytes);
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
@ -153,10 +153,15 @@ public:
|
||||||
Sysmem _sysmem;
|
Sysmem _sysmem;
|
||||||
|
|
||||||
|
|
||||||
// FIXME find a more generic way to do this.
|
|
||||||
friend class gl::GLBuffer;
|
|
||||||
friend class BufferView;
|
friend class BufferView;
|
||||||
friend class Frame;
|
friend class Frame;
|
||||||
|
friend class Batch;
|
||||||
|
|
||||||
|
// FIXME find a more generic way to do this.
|
||||||
|
friend class gl::GLBackend;
|
||||||
|
friend class gl::GLBuffer;
|
||||||
|
friend class gl41::GL41Buffer;
|
||||||
|
friend class gl45::GL45Buffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
using BufferUpdates = std::vector<Buffer::Update>;
|
using BufferUpdates = std::vector<Buffer::Update>;
|
||||||
|
|
|
@ -118,15 +118,18 @@ namespace gpu {
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace gl {
|
namespace gl {
|
||||||
|
class GLBackend;
|
||||||
class GLBuffer;
|
class GLBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace gl41 {
|
namespace gl41 {
|
||||||
class GL41Backend;
|
class GL41Backend;
|
||||||
|
class GL41Buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace gl45 {
|
namespace gl45 {
|
||||||
class GL45Backend;
|
class GL45Backend;
|
||||||
|
class GL45Buffer;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -378,9 +378,6 @@ void GeometryCache::buildShapes() {
|
||||||
//Torus,
|
//Torus,
|
||||||
//Cone,
|
//Cone,
|
||||||
//Cylinder,
|
//Cylinder,
|
||||||
|
|
||||||
_shapeIndices->flush();
|
|
||||||
_shapeVertices->flush();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gpu::Stream::FormatPointer& getSolidStreamFormat() {
|
gpu::Stream::FormatPointer& getSolidStreamFormat() {
|
||||||
|
|
Loading…
Reference in a new issue