fixed OpenGL isolation issue if nvg

pull/3471/head
kallaballa 2 years ago
parent 56574ab8a2
commit 4fbc8c0016
  1. 4
      src/common/detail/clglcontext.cpp
  2. 1
      src/common/detail/clglcontext.hpp
  3. 24
      src/common/detail/nanovgcontext.cpp
  4. 24
      src/common/util.cpp
  5. 10
      src/common/util.hpp
  6. 25
      src/common/viz2d.cpp
  7. 11
      src/common/viz2d.hpp
  8. 6
      src/font/font-demo.cpp
  9. 2
      src/tetra/tetra-demo.cpp
  10. 3
      src/video/video-demo.cpp

@ -74,11 +74,13 @@ void CLGLContext::begin() {
GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, renderBufferID));
GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, renderBufferID));
frameBufferTex_->bind();
GL_CHECK(glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, frameBufferTex_->texId(), 0));
assert(glCheckFramebufferStatus(GL_FRAMEBUFFER) == GL_FRAMEBUFFER_COMPLETE);
}
void CLGLContext::end() {
GL_CHECK(glBindTexture(GL_TEXTURE_2D, 0));
// GL_CHECK(glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, 0));
GL_CHECK(glBindRenderbuffer(GL_RENDERBUFFER, 0));
GL_CHECK(glBindFramebuffer(GL_FRAMEBUFFER, 0));
//glFlush seems enough but i wanna make sure that there won't be race conditions.

@ -11,6 +11,7 @@
#include <opencv2/core/opengl.hpp>
#define GLFW_INCLUDE_GLCOREARB
#include <GLFW/glfw3.h>
#include <iostream>
#include "../util.hpp"

@ -22,7 +22,30 @@ void NanoVGContext::render(std::function<void(const cv::Size&)> fn) {
fn(clglContext_.getSize());
}
void push() {
GL_CHECK(glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS));
GL_CHECK(glPushAttrib(GL_ALL_ATTRIB_BITS));
GL_CHECK(glMatrixMode(GL_MODELVIEW));
GL_CHECK(glPushMatrix());
GL_CHECK(glMatrixMode(GL_PROJECTION));
GL_CHECK(glPushMatrix());
GL_CHECK(glMatrixMode(GL_TEXTURE));
GL_CHECK(glPushMatrix());
}
void pop() {
GL_CHECK(glMatrixMode(GL_TEXTURE));
GL_CHECK(glPopMatrix());
GL_CHECK(glMatrixMode(GL_PROJECTION));
GL_CHECK(glPopMatrix());
GL_CHECK(glMatrixMode(GL_MODELVIEW));
GL_CHECK(glPopMatrix());
GL_CHECK(glPopClientAttrib());
GL_CHECK(glPopAttrib());
}
void NanoVGContext::begin() {
push();
float w = v2d_.getVideoFrameSize().width;
float h = v2d_.getVideoFrameSize().height;
float r = v2d_.getXPixelRatio();
@ -36,6 +59,7 @@ void NanoVGContext::end() {
//FIXME make nvgCancelFrame possible
nvgEndFrame(context_);
nvgRestore(context_);
pop();
}
}
}

@ -6,19 +6,6 @@
namespace kb {
namespace viz2d {
void gl_check_error(const std::filesystem::path &file, unsigned int line, const char *expression) {
int errorCode = glGetError();
if (errorCode != 0) {
std::cerr << "GL failed in " << file.filename() << " (" << line << ") : " << "\nExpression:\n " << expression << "\nError code:\n " << errorCode << "\n " << std::endl;
assert(false);
}
}
void error_callback(int error, const char *description) {
fprintf(stderr, "GLFW Error: %s\n", description);
}
std::string get_gl_info() {
return reinterpret_cast<const char*>(glGetString(GL_VERSION));
}
@ -89,16 +76,5 @@ void update_fps(cv::Ptr<kb::viz2d::Viz2D> window, bool graphically) {
++cnt;
}
cv::Scalar convert(const cv::Scalar& src, cv::ColorConversionCodes code) {
cv::Mat tmpIn(1,1,CV_8UC3);
cv::Mat tmpOut(1,1,CV_8UC3);
tmpIn.at<cv::Vec3b>(0,0) = cv::Vec3b(src[0], src[1], src[2]);
cvtColor(tmpIn, tmpOut, code);
const cv::Vec3b& vdst = tmpOut.at<cv::Vec3b>(0,0);
cv::Scalar dst(vdst[0],vdst[1],vdst[2], src[3]);
return dst;
}
}
}

@ -2,7 +2,6 @@
#define SRC_COMMON_UTIL_HPP_
#include <string>
#include <filesystem>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
@ -10,19 +9,10 @@
namespace kb {
namespace viz2d {
class Viz2D;
void gl_check_error(const std::filesystem::path &file, unsigned int line, const char *expression);
#define GL_CHECK(expr) \
expr; \
kb::viz2d::gl_check_error(__FILE__, __LINE__, #expr);
void error_callback(int error, const char *description);
std::string get_gl_info();
std::string get_cl_info();
void print_system_info();
void update_fps(cv::Ptr<Viz2D> viz2d, bool graphical);
cv::Scalar convert(const cv::Scalar& src, cv::ColorConversionCodes code);
}
}

@ -5,6 +5,31 @@
namespace kb {
namespace viz2d {
namespace detail {
void gl_check_error(const std::filesystem::path &file, unsigned int line, const char *expression) {
int errorCode = glGetError();
if (errorCode != 0) {
std::cerr << "GL failed in " << file.filename() << " (" << line << ") : " << "\nExpression:\n " << expression << "\nError code:\n " << errorCode << "\n " << std::endl;
assert(false);
}
}
void error_callback(int error, const char *description) {
fprintf(stderr, "GLFW Error: %s\n", description);
}
}
cv::Scalar convert(const cv::Scalar& src, cv::ColorConversionCodes code) {
cv::Mat tmpIn(1,1,CV_8UC3);
cv::Mat tmpOut(1,1,CV_8UC3);
tmpIn.at<cv::Vec3b>(0,0) = cv::Vec3b(src[0], src[1], src[2]);
cvtColor(tmpIn, tmpOut, code);
const cv::Vec3b& vdst = tmpOut.at<cv::Vec3b>(0,0);
cv::Scalar dst(vdst[0],vdst[1],vdst[2], src[3]);
return dst;
}
Viz2D::Viz2D(const cv::Size &size, const cv::Size& frameBufferSize, bool offscreen, const string &title, int major, int minor, int samples, bool debug) :
size_(size), frameBufferSize_(frameBufferSize), offscreen_(offscreen), title_(title), major_(major), minor_(minor), samples_(samples), debug_(debug) {

@ -1,6 +1,7 @@
#ifndef SRC_COMMON_VIZ2D_HPP_
#define SRC_COMMON_VIZ2D_HPP_
#include <filesystem>
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/videoio.hpp>
@ -18,7 +19,17 @@ namespace detail {
class CLGLContext;
class CLVAContext;
class NanoVGContext;
void gl_check_error(const std::filesystem::path &file, unsigned int line, const char *expression);
#define GL_CHECK(expr) \
expr; \
kb::viz2d::gl_check_error(__FILE__, __LINE__, #expr);
void error_callback(int error, const char *description);
}
cv::Scalar convert(const cv::Scalar& src, cv::ColorConversionCodes code);
using namespace kb::viz2d::detail;
class NVG;

@ -28,8 +28,8 @@ constexpr int MIN_STAR_COUNT = 1000;
constexpr int MAX_STAR_COUNT = 3000;
constexpr float MIN_STAR_LIGHTNESS = 1.0f;
constexpr int MIN_STAR_ALPHA = 5;
// Intensity of glow defined by kernel size. The default scales with the image diagonal.
constexpr int glow_kernel_size = std::max(int(DIAG / 138 % 2 == 0 ? DIAG / 138 + 1 : DIAG / 138), 1);
// Intensity of bloom effect defined by kernel size. The default scales with the image diagonal.
constexpr int bloom_kernel_size = std::max(int(DIAG / 200 % 2 == 0 ? DIAG / 200 + 1 : DIAG / 200), 1);
using std::cerr;
using std::endl;
@ -97,7 +97,7 @@ int main(int argc, char **argv) {
nvg::beginPath();
nvg::fontSize(FONT_SIZE);
nvg::fontFace("libertine");
nvg::fillColor(convert(cv::Scalar(0.15 * 180.0, 128, 128, 255), cv::COLOR_HLS2BGR));
nvg::fillColor(convert(cv::Scalar(0.15 * 180.0, 128, 255, 255), cv::COLOR_HLS2BGR));
nvg::textAlign(NVG_ALIGN_CENTER | NVG_ALIGN_TOP);
/** only draw lines that are visible **/

@ -6,7 +6,7 @@
constexpr long unsigned int WIDTH = 1920;
constexpr long unsigned int HEIGHT = 1080;
constexpr double FPS = 60;
constexpr bool OFFSCREEN = true;
constexpr bool OFFSCREEN = false;
constexpr const char* OUTPUT_FILENAME = "tetra-demo.mkv";
constexpr const int VA_HW_DEVICE_INDEX = 0;
constexpr unsigned long DIAG = hypot(double(WIDTH), double(HEIGHT));

@ -12,8 +12,7 @@ constexpr bool OFFSCREEN = false;
constexpr const char* OUTPUT_FILENAME = "video-demo.mkv";
constexpr unsigned long DIAG = hypot(double(WIDTH), double(HEIGHT));
constexpr int glow_kernel_size = std::max(int(DIAG / 138 % 2 == 0 ? DIAG / 138 + 1 : DIAG / 138), 1);
constexpr int glow_kernel_size = std::max(int(DIAG / 500 % 2 == 0 ? DIAG / 500 + 1 : DIAG / 500), 1);
using std::cerr;
using std::endl;
using std::string;

Loading…
Cancel
Save