Browse Source

Take out a few useless things from the headless build

Signed-off-by: falkTX <falktx@falktx.com>
tags/22.02
falkTX 3 years ago
parent
commit
533ec1de2e
Signed by: falkTX <falktx@falktx.com> GPG Key ID: CDBAA37ABC74FBA0
3 changed files with 31 additions and 302 deletions
  1. +26
    -3
      src/CardinalPlugin.cpp
  2. +4
    -0
      src/WindowParameters.hpp
  3. +1
    -299
      src/override/RemoteWindow.cpp

+ 26
- 3
src/CardinalPlugin.cpp View File

@@ -43,10 +43,17 @@
#include "DistrhoPluginUtils.hpp"
#include "PluginDriver.hpp"
#include "WindowParameters.hpp"
#include "extra/Base64.hpp"
#include "extra/SharedResourcePointer.hpp"
#ifndef HEADLESS
# include "WindowParameters.hpp"
static const constexpr uint kCardinalStateCount = 2; // patch, windowSize
#else
# define kWindowParameterCount 0
static const constexpr uint kCardinalStateCount = 1; // patch
#endif
#define REMOTE_HOST_PORT "2228"
namespace rack {
@@ -54,7 +61,7 @@ namespace plugin {
void initStaticPlugins();
void destroyStaticPlugins();
}
#if defined(__MOD_DEVICES__) && !defined(HEADLESS)
#ifndef HEADLESS
namespace window {
void WindowInit(Window* window, DISTRHO_NAMESPACE::Plugin* plugin);
}
@@ -342,12 +349,14 @@ class CardinalPlugin : public CardinalBasePlugin
uint64_t fPreviousFrame;
Mutex fDeviceMutex;
#ifndef HEADLESS
// real values, not VCV interpreted ones
float fWindowParameters[kWindowParameterCount];
#endif
public:
CardinalPlugin()
: CardinalBasePlugin(kModuleParameters + kWindowParameterCount, 0, 2),
: CardinalBasePlugin(kModuleParameters + kWindowParameterCount, 0, kCardinalStateCount),
fInitializer(this),
fAudioBufferIn(nullptr),
fAudioBufferOut(nullptr),
@@ -357,6 +366,7 @@ public:
fCurrentMidiOutputs(nullptr),
fPreviousFrame(0)
{
#ifndef HEADLESS
fWindowParameters[kWindowParameterShowTooltips] = 1.0f;
fWindowParameters[kWindowParameterCableOpacity] = 50.0f;
fWindowParameters[kWindowParameterCableTension] = 75.0f;
@@ -366,6 +376,7 @@ public:
fWindowParameters[kWindowParameterWheelKnobControl] = 0.0f;
fWindowParameters[kWindowParameterWheelSensitivity] = 1.0f;
fWindowParameters[kWindowParameterLockModulePositions] = 0.0f;
#endif
// create unique temporary path for this instance
try {
@@ -652,6 +663,7 @@ protected:
return;
}
#ifndef HEADLESS
switch (index - kModuleParameters)
{
case kWindowParameterShowTooltips:
@@ -740,6 +752,7 @@ protected:
parameter.ranges.max = 1.0f;
break;
}
#endif
}
void initState(const uint32_t index, String& stateKey, String& defaultStateValue) override
@@ -751,9 +764,11 @@ protected:
case 0:
stateKey = "patch";
break;
#ifndef HEADLESS
case 1:
stateKey = "windowSize";
break;
#endif
}
}
@@ -765,10 +780,12 @@ protected:
if (index < kModuleParameters)
return context->parameters[index];
#ifndef HEADLESS
index -= kModuleParameters;
if (index < kWindowParameterCount)
return fWindowParameters[index];
#endif
return 0.0f;
}
@@ -781,6 +798,7 @@ protected:
return;
}
#ifndef HEADLESS
index -= kModuleParameters;
if (index < kWindowParameterCount)
@@ -788,12 +806,15 @@ protected:
fWindowParameters[index] = value;
return;
}
#endif
}
String getState(const char* const key) const override
{
#ifndef HEADLESS
if (std::strcmp(key, "windowSize") == 0)
return fWindowSize;
#endif
if (std::strcmp(key, "patch") != 0)
return String();
@@ -820,11 +841,13 @@ protected:
void setState(const char* const key, const char* const value) override
{
#ifndef HEADLESS
if (std::strcmp(key, "windowSize") == 0)
{
fWindowSize = value;
return;
}
#endif
if (std::strcmp(key, "patch") != 0)
return;


+ 4
- 0
src/WindowParameters.hpp View File

@@ -15,6 +15,10 @@
* For a full copy of the GNU General Public License see the LICENSE file.
*/

#ifdef HEADLESS
# error wrong include
#endif

#pragma once

#include "DistrhoUtils.hpp"


+ 1
- 299
src/override/RemoteWindow.cpp View File

@@ -36,29 +36,12 @@
#include <context.hpp>
#include <patch.hpp>
#include <settings.hpp>
#include <plugin.hpp> // used in Window::screenshot
#include <system.hpp> // used in Window::screenshot
#include <system.hpp>

#ifdef NDEBUG
# undef DEBUG
#endif

#include "DistrhoPlugin.hpp"
#include "../WindowParameters.hpp"

#ifdef WITH_MESA
# include "../src/Rack/dep/glfw/deps/stb_image_write.h"
# include "extra/Thread.hpp"
# include <GL/osmesa.h>
#endif


namespace rack {
namespace app {
widget::Widget* createMenuBar() { return new widget::Widget; }
}
}


namespace rack {
namespace window {
@@ -112,19 +95,9 @@ struct WindowParams {
};

struct Window::Internal
#ifdef WITH_MESA
: public Thread
#endif
{
DISTRHO_NAMESPACE::Plugin* plugin = nullptr;
DISTRHO_NAMESPACE::WindowParameters params;
DISTRHO_NAMESPACE::WindowParametersCallback* callback = nullptr;
Context* context = nullptr;
Window* self = nullptr;
#ifdef WITH_MESA
OSMesaContext mesa = nullptr;
GLubyte* mesaBuffer = nullptr;
#endif

math::Vec size = minWindowSize;
std::string lastWindowTitle;
@@ -141,28 +114,6 @@ struct Window::Internal

bool fbDirtyOnSubpixelChange = true;
int fbCount = 0;

#ifdef WITH_MESA
void run() override {
self->run();
int i=0;
while (! shouldThreadExit()) {
// d_msleep(500);
d_stdout("thread idle %i - start", i);
contextSet(context);
d_stdout("thread idle %i - context was set", i);
self->step();
d_stdout("thread idle %i - did step", i);
if (i++ == 0)
{
// render to png
stbi_write_png("testing.png", 1228, 666, 4, mesaBuffer, 666 * 4);
d_stdout("thread idle %i - wrote to png", i);
}
}
d_stdout("thread quit");
}
#endif
};

Window::Window() {
@@ -171,142 +122,6 @@ Window::Window() {
internal->self = this;
}

#ifdef WITH_MESA
static void flipBitmap(uint8_t* pixels, int width, int height, int depth) {
for (int y = 0; y < height / 2; y++) {
int flipY = height - y - 1;
uint8_t tmp[width * depth];
std::memcpy(tmp, &pixels[y * width * depth], width * depth);
std::memcpy(&pixels[y * width * depth], &pixels[flipY * width * depth], width * depth);
std::memcpy(&pixels[flipY * width * depth], tmp, width * depth);
}
}
#endif

void WindowInit(Window* const window, DISTRHO_NAMESPACE::Plugin* const plugin)
{
window->internal->plugin = plugin;

#ifdef WITH_MESA
window->internal->mesa = OSMesaCreateContextExt(OSMESA_RGBA, 24, 8, 0, nullptr);
DISTRHO_SAFE_ASSERT_RETURN(window->internal->mesa != nullptr,);

int width = 1228;
int height = 666;

window->internal->mesaBuffer = new GLubyte[1228 * 666 * 4]; // 4 for RGBA
bool ok = OSMesaMakeCurrent(window->internal->mesa, window->internal->mesaBuffer, GL_UNSIGNED_BYTE, 1228, 666);

{
int z, s, a;
glGetIntegerv(GL_DEPTH_BITS, &z);
glGetIntegerv(GL_STENCIL_BITS, &s);
glGetIntegerv(GL_ACCUM_RED_BITS, &a);
printf("Depth=%d Stencil=%d Accum=%d\n", z, s, a);
}

// Set up NanoVG
int nvgFlags = NVG_ANTIALIAS;
// #if defined NANOVG_GL2
window->vg = nvgCreateGL2(nvgFlags);
window->fbVg = nvgCreateSharedGL2(window->vg, nvgFlags);
// #elif defined NANOVG_GL3
// window->vg = nvgCreateGL3(nvgFlags);
// #elif defined NANOVG_GLES2
// window->vg = nvgCreateGLES2(nvgFlags);
// window->fbVg = nvgCreateSharedGLES2(window->vg, nvgFlags);
// #endif
#endif

// Load default Blendish font
window->uiFont = window->loadFont(asset::system("res/fonts/DejaVuSans.ttf"));
if (window->uiFont != nullptr)
bndSetFont(window->uiFont->handle);

// Init settings
WindowParametersRestore(window);

if (APP->scene) {
widget::Widget::ContextCreateEvent e;
APP->scene->onContextCreate(e);
}

#ifdef WITH_MESA
d_stdout("all good with mesa and GL? %d | %p %p %p", ok, window->internal->mesa, window->vg, window->fbVg);
// window->internal->startThread();

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, static_cast<GLdouble>(width), static_cast<GLdouble>(height), 0.0, 0.0, 1.0);
glViewport(0, 0, static_cast<GLsizei>(width), static_cast<GLsizei>(height));
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

glColor3f(0.5f, 0.2f, 0.9f);

glBegin(GL_QUADS);

{
const int x = width / 4;
const int y = height / 4;
const int w = width / 2;
const int h = height / 2;

glTexCoord2f(0.0f, 0.0f);
glVertex2d(x, y);

glTexCoord2f(1.0f, 0.0f);
glVertex2d(x+w, y);

glTexCoord2f(1.0f, 1.0f);
glVertex2d(x+w, y+h);

glTexCoord2f(0.0f, 1.0f);
glVertex2d(x, y+h);
}

glEnd();

for (int i=0; i<5; ++i)
{
d_stdout("idle %i - before step", i);
window->step();
d_stdout("idle %i - after step", i);
}

glFinish();

// render to png
d_stdout("idle - before png");
// flipBitmap(window->internal->mesaBuffer, width, height, 4);
// stbi_write_png("testing.png", 1228, 666, 4, window->internal->mesaBuffer, 666 * 4);

// Allocate pixel color buffer
uint8_t* pixels = new uint8_t[height * width * 4];

// glReadPixels defaults to GL_BACK, but the back-buffer is unstable, so use the front buffer (what the user sees)
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels);

// Write pixels to PNG
flipBitmap(pixels, width, height, 4);
stbi_write_png("testing.png", width, height, 4, pixels, width * 4);

delete[] pixels;

d_stdout("idle - after png");
#endif
}

void WindowMods(Window* const window, const int mods)
{
window->internal->mods = mods;
}

Window::~Window() {
// internal->stopThread(5000);

@@ -319,23 +134,6 @@ Window::~Window() {
internal->fontCache.clear();
internal->imageCache.clear();

#ifdef WITH_MESA
// #if defined NANOVG_GL2
nvgDeleteGL2(vg);
nvgDeleteGL2(fbVg);
// #elif defined NANOVG_GL3
// nvgDeleteGL3(vg);
// #elif defined NANOVG_GLES2
// nvgDeleteGLES2(vg);
// nvgDeleteGLES2(fbVg);
// #endif

if (internal->mesa != nullptr)
OSMesaDestroyContext(internal->mesa);

delete[] internal->mesaBuffer;
#endif

delete internal;
}

@@ -516,99 +314,3 @@ int& Window::fbCount() {

} // namespace window
} // namespace rack


START_NAMESPACE_DISTRHO

void WindowParametersSave(rack::window::Window* const window)
{
if (d_isNotEqual(window->internal->params.cableOpacity, rack::settings::cableOpacity))
{
window->internal->params.cableOpacity = rack::settings::cableOpacity;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterCableOpacity,
rack::settings::cableOpacity);
}
if (d_isNotEqual(window->internal->params.cableTension, rack::settings::cableTension))
{
window->internal->params.cableTension = rack::settings::cableTension;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterCableTension,
rack::settings::cableTension);
}
if (d_isNotEqual(window->internal->params.rackBrightness, rack::settings::rackBrightness))
{
window->internal->params.rackBrightness = rack::settings::rackBrightness;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterRackBrightness,
rack::settings::rackBrightness);
}
if (d_isNotEqual(window->internal->params.haloBrightness, rack::settings::haloBrightness))
{
window->internal->params.haloBrightness = rack::settings::haloBrightness;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterHaloBrightness,
rack::settings::haloBrightness);
}
if (d_isNotEqual(window->internal->params.knobScrollSensitivity, rack::settings::knobScrollSensitivity))
{
window->internal->params.knobScrollSensitivity = rack::settings::knobScrollSensitivity;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterWheelSensitivity,
rack::settings::knobScrollSensitivity);
}
if (window->internal->params.knobMode != rack::settings::knobMode)
{
window->internal->params.knobMode = rack::settings::knobMode;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterKnobMode,
rack::settings::knobMode);
}
if (window->internal->params.tooltips != rack::settings::tooltips)
{
window->internal->params.tooltips = rack::settings::tooltips;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterShowTooltips,
rack::settings::tooltips);
}
if (window->internal->params.knobScroll != rack::settings::knobScroll)
{
window->internal->params.knobScroll = rack::settings::knobScroll;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterWheelKnobControl,
rack::settings::knobScroll);
}
if (window->internal->params.lockModules != rack::settings::lockModules)
{
window->internal->params.lockModules = rack::settings::lockModules;
if (window->internal->callback != nullptr)
window->internal->callback->WindowParametersChanged(kWindowParameterLockModulePositions,
rack::settings::lockModules);
}
}

void WindowParametersRestore(rack::window::Window* const window)
{
rack::settings::cableOpacity = window->internal->params.cableOpacity;
rack::settings::cableTension = window->internal->params.cableTension;
rack::settings::rackBrightness = window->internal->params.rackBrightness;
rack::settings::haloBrightness = window->internal->params.haloBrightness;
rack::settings::knobScrollSensitivity = window->internal->params.knobScrollSensitivity;
rack::settings::knobMode = static_cast<rack::settings::KnobMode>(window->internal->params.knobMode);
rack::settings::tooltips = window->internal->params.tooltips;
rack::settings::knobScroll = window->internal->params.knobScroll;
rack::settings::lockModules = window->internal->params.lockModules;
}

void WindowParametersSetCallback(rack::window::Window* const window, WindowParametersCallback* const callback)
{
window->internal->callback = callback;
}

void WindowParametersSetValues(rack::window::Window* const window, const WindowParameters& params)
{
window->internal->params = params;
}

END_NAMESPACE_DISTRHO


Loading…
Cancel
Save