Cleaning for opengl rendering prep.

This commit is contained in:
James Grogan 2022-11-14 11:19:51 +00:00
parent 402f381d10
commit 7c6a92f4ec
58 changed files with 570 additions and 533 deletions

View file

@ -1,6 +1,5 @@
#include "XcbGlWindowInterface.h"
#include "OpenGlInterface.h"
#include "XcbGlInterface.h"
#include "FileLogger.h"
@ -22,9 +21,8 @@ XcbGlWindowInterface::~XcbGlWindowInterface()
}
}
void XcbGlWindowInterface::draw()
void XcbGlWindowInterface::afterPaint()
{
OpenGlInterface::draw(nullptr);
swapBuffers();
}

View file

@ -14,7 +14,7 @@ public:
bool initialize(xcb_window_t window);
void draw();
void afterPaint();
private:
void destroyWindow();

View file

@ -4,6 +4,7 @@
#include "Window.h"
#include "XcbWindow.h"
#include "Image.h"
class XcbImage
{
@ -11,9 +12,9 @@ public:
XcbImage(xcb_connection_t* connection, mt::Window* window, xcb_screen_t* screen)
{
mPixmap = xcb_generate_id(connection);
auto hwnd = dynamic_cast<XcbWindow*>(window->GetPlatformWindow())->getHandle();
const auto w = window->GetWidth();
const auto h = window->GetHeight();
auto hwnd = dynamic_cast<XcbWindow*>(window->getPlatformWindow())->getHandle();
const auto w = window->getWidth();
const auto h = window->getHeight();
xcb_create_pixmap(connection, screen->root_depth, mPixmap, hwnd, w, h);
}
@ -21,10 +22,10 @@ public:
{
if (!mXImage)
{
auto backing_image = window->getBackingImage();
auto backing_image = window->getImage();
const auto w = window->GetWidth();
const auto h = window->GetHeight();
const auto w = window->getWidth();
const auto h = window->getHeight();
//auto data = const_cast<unsigned char*>(backing_image->getDataPtr());
auto data = backing_image->getData();

View file

@ -40,15 +40,15 @@ void XcbInterface::initialize()
{
initializeHardwareRendering();
}
mDesktopManager->SetKeyboard(XcbKeyboard::Create());
mDesktopManager->setKeyboard(XcbKeyboard::Create());
const auto num_windows = mDesktopManager->GetWindowManager()->getNumWindows();
const auto num_windows = mDesktopManager->getWindowManager()->getNumWindows();
for(std::size_t idx=0; idx< num_windows; idx++)
{
addWindow(mDesktopManager->GetWindowManager()->getWindow(idx));
addWindow(mDesktopManager->getWindowManager()->getWindow(idx));
}
mDesktopManager->GetWindowManager()->GetMainWindow()->show();
mDesktopManager->getWindowManager()->getMainWindow()->show();
}
void XcbInterface::connect()
@ -96,7 +96,7 @@ void XcbInterface::updateScreen()
auto xcb_screen = XcbScreen::Create(screen_iter.data);
auto screen = mt::Screen::Create();
screen->SetPlatformScreen(std::move(xcb_screen));
mDesktopManager->AddScreen(std::move(screen));
mDesktopManager->addScreen(std::move(screen));
}
void XcbInterface::initializeHardwareRendering()
@ -107,11 +107,11 @@ void XcbInterface::initializeHardwareRendering()
void XcbInterface::createGraphicsContext()
{
if (!mConnection || mDesktopManager->GetDefaultScreen())
if (!mConnection || mDesktopManager->getDefaultScreen())
{
return;
}
auto xcb_screen = dynamic_cast<XcbScreen*>(mDesktopManager->GetDefaultScreen()->GetPlatformScreen());
auto xcb_screen = dynamic_cast<XcbScreen*>(mDesktopManager->getDefaultScreen()->GetPlatformScreen());
if (!xcb_screen)
{
return;
@ -145,16 +145,16 @@ uint32_t XcbInterface::getEventMask()
void XcbInterface::addWindow(mt::Window* window)
{
auto screen = mDesktopManager->GetDefaultScreen();
auto screen = mDesktopManager->getDefaultScreen();
XcbWindow::add(window, mConnection, screen, getEventMask(), mGlInterface.get());
}
void XcbInterface::onPaint()
{
mDesktopManager->OnUiEvent(PaintEvent::Create());
mDesktopManager->onUiEvent(PaintEvent::Create());
auto mainWindow = mDesktopManager->GetWindowManager()->GetMainWindow();
auto defaultScreen = mDesktopManager->GetDefaultScreen();
auto mainWindow = mDesktopManager->getWindowManager()->getMainWindow();
auto defaultScreen = mDesktopManager->getDefaultScreen();
mainWindow->doPaint(defaultScreen);
}
@ -183,26 +183,26 @@ void XcbInterface::loop()
}
case XCB_KEY_PRESS: {
auto kp = reinterpret_cast<xcb_key_press_event_t*>(event);
auto ui_event = mEventInterface->ConvertKeyPress(kp, mDesktopManager->GetKeyboard());
mDesktopManager->OnUiEvent(std::move(ui_event));
auto ui_event = mEventInterface->ConvertKeyPress(kp, mDesktopManager->getKeyboard());
mDesktopManager->onUiEvent(std::move(ui_event));
break;
}
case XCB_KEY_RELEASE: {
auto kr = reinterpret_cast<xcb_key_release_event_t*>(event);
auto ui_event = mEventInterface->ConvertKeyRelease(kr, mDesktopManager->GetKeyboard());
mDesktopManager->OnUiEvent(std::move(ui_event));
auto ui_event = mEventInterface->ConvertKeyRelease(kr, mDesktopManager->getKeyboard());
mDesktopManager->onUiEvent(std::move(ui_event));
break;
}
case XCB_BUTTON_PRESS: {
auto press = reinterpret_cast<xcb_button_press_event_t*>(event);
auto ui_event = mEventInterface->ConvertButtonPress(press);
mDesktopManager->OnUiEvent(std::move(ui_event));
mDesktopManager->onUiEvent(std::move(ui_event));
break;
}
case XCB_BUTTON_RELEASE: {
auto release = reinterpret_cast<xcb_button_release_event_t*>(event);
auto ui_event = mEventInterface->ConvertButtonRelease(release);
mDesktopManager->OnUiEvent(std::move(ui_event));
mDesktopManager->onUiEvent(std::move(ui_event));
break;
}
default:
@ -216,17 +216,17 @@ void XcbInterface::loop()
void XcbInterface::onEventsDispatched()
{
if (mDesktopManager->IsModified())
if (mDesktopManager->isModified())
{
mDesktopManager->SetIsModified(false);
auto mainWindow = mDesktopManager->GetWindowManager()->GetMainWindow();
mDesktopManager->setIsModified(false);
auto mainWindow = mDesktopManager->getWindowManager()->getMainWindow();
mainWindow->clear();
}
}
void XcbInterface::shutDown()
{
mDesktopManager->GetWindowManager()->clearPlatformWindows();
mDesktopManager->getWindowManager()->clearPlatformWindows();
if (!mConnection)
{

View file

@ -7,6 +7,7 @@
#include "Screen.h"
#include "ImagePrimitives.h"
#include "XcbGlWindowInterface.h"
#include "DrawingContext.h"
#include <xcb/xcb.h>
@ -42,14 +43,16 @@ void XcbWindow::add(mt::Window* window, xcb_connection_t* connection, mt::Screen
hwnd, /* window Id */
xcb_screen->GetNativeScreen()->root, /* parent window */
0, 0, /* x, y */
window->GetWidth(), window->GetHeight(), /* width, height */
window->getWidth(), window->getHeight(), /* width, height */
10, /* border_width */
XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class */
xcb_screen->GetNativeScreen()->root_visual, /* visual */
mask, values ); /* masks */
auto xcb_window = std::make_unique<XcbWindow>(window, hwnd, connection, xcbGlInterface);
window->SetPlatformWindow(std::move(xcb_window));
const auto drawing_mode = xcbGlInterface ? DrawingMode::GRAPH : DrawingMode::RASTER;
window->setPlatformWindow(std::move(xcb_window), drawing_mode);
}
int XcbWindow::getHandle() const
@ -67,54 +70,40 @@ void XcbWindow::show()
map();
}
void XcbWindow::paint(mt::Screen* screen)
{
auto xcb_screen = dynamic_cast<XcbScreen*>(screen->GetPlatformScreen());
if (mGlInterface)
{
paintHardware(xcb_screen);
}
else
{
paintSoftware(xcb_screen);
}
}
void XcbWindow::paintHardware(XcbScreen* screen)
void XcbWindow::beforePaint(mt::Screen* screen)
{
if (mGlInterface)
{
mGlInterface->initialize(mHandle);
mGlInterface->draw();
}
else
{
auto xcb_screen = dynamic_cast<XcbScreen*>(screen->GetPlatformScreen());
if (!mBackingImage)
{
mBackingImage = std::make_unique<XcbImage>(mConnection, mWindow, xcb_screen->GetNativeScreen());
}
}
}
void XcbWindow::paintSoftware(XcbScreen* screen)
void XcbWindow::afterPaint(mt::Screen* screen)
{
if (!mBackingImage)
if (mGlInterface)
{
mBackingImage = std::make_unique<XcbImage>(mConnection, mWindow, screen->GetNativeScreen());
mGlInterface->afterPaint();
}
auto backing_image = mWindow->getBackingImage();
backing_image->initialize();
//ImagePrimitives::drawCheckerboard(const_cast<unsigned char*>(backing_image->getDataPtr()), backing_image->getWidth(), backing_image->getHeight(), 0);
mBackingImage->update(mWindow, screen->GetNativeScreen(), mConnection, screen->GetGraphicsContext());
xcb_copy_area(mConnection, mBackingImage->getPixMap(), mHandle, screen->GetGraphicsContext(), 0, 0 ,0 , 0, backing_image->getWidth(), backing_image->getHeight());
/*
for(const auto& layer : mWindow->GetLayers())
else
{
XcbLayerInterface::AddLayer(mConnection, xcb_screen->GetNativeScreen(), mHandle, xcb_screen->GetGraphicsContext(), layer);
auto xcb_screen = dynamic_cast<XcbScreen*>(screen->GetPlatformScreen());
mBackingImage->update(mWindow, xcb_screen->GetNativeScreen(), mConnection, xcb_screen->GetGraphicsContext());
xcb_copy_area(mConnection, mBackingImage->getPixMap(), mHandle, xcb_screen->GetGraphicsContext(), 0, 0 ,0 , 0, mWindow->getWidth(), mWindow->getHeight());
}
*/
}
void XcbWindow::clear()
{
xcb_clear_area(mConnection, 1, mHandle, 0, 0, mWindow->GetWidth(), mWindow->GetHeight());
xcb_clear_area(mConnection, 1, mHandle, 0, 0, mWindow->getWidth(), mWindow->getHeight());
xcb_flush(mConnection);
}

View file

@ -26,16 +26,15 @@ public:
void show() override;
void paint(mt::Screen* screen) override;
void beforePaint(mt::Screen* screen) override;
void afterPaint(mt::Screen* screen) override;
void clear() override;
void map() override;
private:
void paintHardware(XcbScreen* screen);
void paintSoftware(XcbScreen* screen);
int mHandle{-1};
unsigned mGraphicsContext {0};
xcb_connection_t* mConnection{nullptr};