|
1 | 1 | #include <config.hpp> |
2 | 2 | #include <opendx.h> |
3 | 3 | #include "../idirect3d9.hpp" |
| 4 | +#include "cairo.h" |
4 | 5 | #include "gtk/gtk.h" |
5 | 6 | #include "idirect3d9.hpp" |
6 | 7 | #include <drm/drm.h> |
@@ -212,6 +213,24 @@ export IDirect3DDevice9* IDirect3D9_i915::createDevice( |
212 | 213 | // save_to_ppm("framebuffer.ppm", framebuffer, create_req.width, create_req.height, create_req.pitch); |
213 | 214 | // munmap(framebuffer, create_req.pitch * create_req.height); |
214 | 215 |
|
| 216 | + //experiment: set master if config allows it |
| 217 | + #ifdef DEBUG |
| 218 | + //if tty, force master |
| 219 | + const char* term = std::getenv("TERM"); |
| 220 | + if (term != nullptr && strcmp(term, "linux") == 0) { |
| 221 | + DLOG(" Setting DRM master (experimental)"); |
| 222 | + if (drmSetMaster(fd) != 0) { |
| 223 | + std::cerr << "\033[1;31m" //RED BOLD |
| 224 | + << "[IDirect3D9_i915] ODX ERROR: Failed to set DRM master" << std::endl |
| 225 | + << "[IDirect3D9_i915] IDirect3DC9::CreateDevice fails and returns NULL.\033[0;0m" << std::endl |
| 226 | + << std::endl; |
| 227 | + // return nullptr; |
| 228 | + } else { |
| 229 | + DLOG(" DRM master set"); |
| 230 | + } |
| 231 | + } |
| 232 | + #endif |
| 233 | + |
215 | 234 | // drmSetMaster(fd); |
216 | 235 |
|
217 | 236 | //inject framebuffer into HWND (through GdkD3DContext) |
@@ -253,26 +272,26 @@ static void on_drawing_area_realize(GtkWidget *widget, gpointer user_data) { |
253 | 272 | gtk_drawing_area_set_draw_func( |
254 | 273 | GTK_DRAWING_AREA(widget), |
255 | 274 | draw_function, |
256 | | - &framebuffer, |
| 275 | + framebuffer, |
257 | 276 | NULL |
258 | 277 | ); |
259 | 278 | // gdk_draw_context_begin_draw(GDK_DRAW_CONTEXT(context), nullptr); |
260 | 279 | // gdk_draw_context_end_draw(GDK_DRAW_CONTEXT(context)); |
261 | 280 | } |
262 | 281 |
|
263 | 282 | static void draw_function(GtkDrawingArea *area, cairo_t *cr, int width, int height, gpointer user_data) { |
264 | | - |
265 | | - DLOG("libopendx.so: gdk_d3d_context_draw(): Drawing framebuffer to widget"); |
266 | | - uint32_t* framebuffer = *(uint32_t**)user_data; |
| 283 | + |
| 284 | + DLOG("d3d9_i915.so: draw_function(): Drawing framebuffer to widget"); |
| 285 | + uint32_t* framebuffer = (uint32_t*)user_data; |
267 | 286 | if (framebuffer == nullptr) { |
268 | | - DLOG("libopendx.so: gdk_d3d_context_draw(): No framebuffer set, skipping draw"); |
| 287 | + DLOG("d3d9_i915.so: draw_function(): No framebuffer set, skipping draw"); |
269 | 288 | return; |
270 | 289 | } |
271 | 290 |
|
272 | 291 | cairo_surface_t *cairo_surface = |
273 | 292 | cairo_image_surface_create_for_data( |
274 | 293 | (unsigned char*)framebuffer, |
275 | | - CAIRO_FORMAT_ARGB32, |
| 294 | + CAIRO_FORMAT_RGB24, |
276 | 295 | width, |
277 | 296 | height, |
278 | 297 | width * 4 // pitch (bytes per row) |
|
0 commit comments