Untitled
// rdprail_output.c #include <assert.h> #include <stdlib.h> #include <wlr/interfaces/wlr_output.h> #include <wlr/util/log.h> #include "backend/rdprail/rdprail_output.h" // Remove the gamma size function as it's not needed // rdprail_output.c static bool output_test(struct wlr_output *wlr_output, const struct wlr_output_state *state) { return true; // Always allow test state } static bool output_commit(struct wlr_output *wlr_output, const struct wlr_output_state *state) { struct wlr_rdp_output *output = (struct wlr_rdp_output *)wlr_output; if (state->committed & WLR_OUTPUT_STATE_BUFFER && state->buffer) { void *data; uint32_t format; size_t stride; if (wlr_buffer_begin_data_ptr_access(state->buffer, 0, &data, &format, &stride)) { // Get damage region pixman_box32_t *rects; int n_rects; rects = pixman_region32_rectangles(&output->pending.damage, &n_rects); for (int i = 0; i < n_rects; i++) { RECTANGLE_16 rect = { .left = (uint16_t)rects[i].x1, .top = (uint16_t)rects[i].y1, .right = (uint16_t)rects[i].x2, .bottom = (uint16_t)rects[i].y2 }; output->backend->redir_ctx->SurfaceCommand( output->backend->redir_ctx, output, GFX_REDIR_SURFACE_COMMAND_UPDATEREGION, &rect, data); } wlr_buffer_end_data_ptr_access(state->buffer); } } return true; } static void output_destroy(struct wlr_output *wlr_output) { struct wlr_rdp_output *output = (struct wlr_rdp_output *)wlr_output; wl_list_remove(&output->link); free(output); } static const struct wlr_output_impl output_impl = { .destroy = output_destroy, .test = output_test, .commit = output_commit, }; struct wlr_rdp_output *wlr_rdp_output_create(struct wlr_rdp_backend *backend) { struct wlr_rdp_output *output = calloc(1, sizeof(*output)); if (!output) { return NULL; } struct wl_event_loop *event_loop = wl_display_get_event_loop(backend->display); wlr_output_init(&output->base, &backend->base, // backend &output_impl, // impl event_loop, // event_loop NULL); // state output->backend = backend; output->width = 1920; output->height = 1080; output->refresh_rate = 60000; pixman_region32_init(&output->pending.damage); wl_list_insert(&backend->outputs, &output->link); wlr_signal_emit_safe(&backend->events.new_output, output); return output; }
Leave a Comment