diff options
Diffstat (limited to 'kms')
-rw-r--r-- | kms/kms_shared.h | 10 | ||||
-rw-r--r-- | kms/server/kms_server.c | 91 |
2 files changed, 34 insertions, 67 deletions
diff --git a/kms/kms_shared.h b/kms/kms_shared.h index ca13e7e..2dbb655 100644 --- a/kms/kms_shared.h +++ b/kms/kms_shared.h @@ -5,7 +5,7 @@ #include <stdbool.h> #include <drm_mode.h> -#define GSR_KMS_PROTOCOL_VERSION 5 +#define GSR_KMS_PROTOCOL_VERSION 4 #define GSR_KMS_MAX_ITEMS 8 #define GSR_KMS_MAX_DMA_BUFS 4 @@ -39,12 +39,6 @@ struct gsr_kms_response_dma_buf { uint32_t offset; }; -typedef enum { - KMS_PLANE_TYPE_PRIMARY, - KMS_PLANE_TYPE_CURSOR, - KMS_PLANE_TYPE_OVERLAY -} gsr_kms_plane_type; - struct gsr_kms_response_item { gsr_kms_response_dma_buf dma_buf[GSR_KMS_MAX_DMA_BUFS]; int num_dma_bufs; @@ -53,7 +47,7 @@ struct gsr_kms_response_item { uint32_t pixel_format; uint64_t modifier; uint32_t connector_id; /* 0 if unknown */ - gsr_kms_plane_type plane_type; + bool is_cursor; bool has_hdr_metadata; int x; int y; diff --git a/kms/server/kms_server.c b/kms/server/kms_server.c index 88d4b73..070875b 100644 --- a/kms/server/kms_server.c +++ b/kms/server/kms_server.c @@ -145,13 +145,12 @@ typedef enum { PLANE_PROPERTY_SRC_H = 1 << 5, PLANE_PROPERTY_IS_CURSOR = 1 << 6, PLANE_PROPERTY_IS_PRIMARY = 1 << 7, - PLANE_PROPERTY_IS_OVERLAY = 1 << 8, } plane_property_mask; /* Returns plane_property_mask */ -static uint32_t plane_get_properties(int drmfd, uint32_t plane_id, int *crtc_x, int *crtc_y, int *src_x, int *src_y, int *src_w, int *src_h) { - *crtc_x = 0; - *crtc_y = 0; +static uint32_t plane_get_properties(int drmfd, uint32_t plane_id, int *x, int *y, int *src_x, int *src_y, int *src_w, int *src_h) { + *x = 0; + *y = 0; *src_x = 0; *src_y = 0; *src_w = 0; @@ -172,10 +171,10 @@ static uint32_t plane_get_properties(int drmfd, uint32_t plane_id, int *crtc_x, // SRC_* values are fixed 16.16 points const uint32_t type = prop->flags & (DRM_MODE_PROP_LEGACY_TYPE | DRM_MODE_PROP_EXTENDED_TYPE); if((type & DRM_MODE_PROP_SIGNED_RANGE) && strcmp(prop->name, "CRTC_X") == 0) { - *crtc_x = (int)props->prop_values[i]; + *x = (int)props->prop_values[i]; property_mask |= PLANE_PROPERTY_X; } else if((type & DRM_MODE_PROP_SIGNED_RANGE) && strcmp(prop->name, "CRTC_Y") == 0) { - *crtc_y = (int)props->prop_values[i]; + *y = (int)props->prop_values[i]; property_mask |= PLANE_PROPERTY_Y; } else if((type & DRM_MODE_PROP_RANGE) && strcmp(prop->name, "SRC_X") == 0) { *src_x = (int)(props->prop_values[i] >> 16); @@ -198,9 +197,6 @@ static uint32_t plane_get_properties(int drmfd, uint32_t plane_id, int *crtc_x, } else if(prop->enums[j].value == current_enum_value && strcmp(prop->enums[j].name, "Cursor") == 0) { property_mask |= PLANE_PROPERTY_IS_CURSOR; break; - } else if(prop->enums[j].value == current_enum_value && strcmp(prop->enums[j].name, "Overlay") == 0) { - property_mask |= PLANE_PROPERTY_IS_OVERLAY; - break; } } } @@ -293,16 +289,6 @@ static int drm_prime_handles_to_fds(gsr_drm *drm, drmModeFB2Ptr drmfb, int *fb_f return GSR_KMS_MAX_DMA_BUFS; } -static int plane_property_get_plane_type(plane_property_mask property_mask) { - if(property_mask & PLANE_PROPERTY_IS_PRIMARY) - return KMS_PLANE_TYPE_PRIMARY; - else if(property_mask & PLANE_PROPERTY_IS_CURSOR) - return KMS_PLANE_TYPE_CURSOR; - else if(property_mask & PLANE_PROPERTY_IS_OVERLAY) - return KMS_PLANE_TYPE_OVERLAY; - return -1; -} - static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response) { int result = -1; @@ -354,10 +340,9 @@ static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response) { // TODO: Check if dimensions have changed by comparing width and height to previous time this was called. // TODO: Support other plane formats than rgb (with multiple planes, such as direct YUV420 on wayland). - int crtc_x = 0, crtc_y = 0, src_x = 0, src_y = 0, src_w = 0, src_h = 0; - const plane_property_mask property_mask = plane_get_properties(drm->drmfd, plane->plane_id, &crtc_x, &crtc_y, &src_x, &src_y, &src_w, &src_h); - const int plane_type = plane_property_get_plane_type(property_mask); - if(plane_type == -1) + int x = 0, y = 0, src_x = 0, src_y = 0, src_w = 0, src_h = 0; + plane_property_mask property_mask = plane_get_properties(drm->drmfd, plane->plane_id, &x, &y, &src_x, &src_y, &src_w, &src_h); + if(!(property_mask & PLANE_PROPERTY_IS_PRIMARY) && !(property_mask & PLANE_PROPERTY_IS_CURSOR)) continue; int fb_fds[GSR_KMS_MAX_DMA_BUFS]; @@ -369,50 +354,38 @@ static int kms_get_fb(gsr_drm *drm, gsr_kms_response *response) { goto cleanup_handles; } - gsr_kms_response_item *response_item = &response->items[response->num_items]; + const int item_index = response->num_items; const connector_crtc_pair *crtc_pair = get_connector_pair_by_crtc_id(&c2crtc_map, plane->crtc_id); if(crtc_pair && crtc_pair->hdr_metadata_blob_id) { - response_item->has_hdr_metadata = get_hdr_metadata(drm->drmfd, crtc_pair->hdr_metadata_blob_id, &response_item->hdr_metadata); + response->items[item_index].has_hdr_metadata = get_hdr_metadata(drm->drmfd, crtc_pair->hdr_metadata_blob_id, &response->items[item_index].hdr_metadata); } else { - response_item->has_hdr_metadata = false; + response->items[item_index].has_hdr_metadata = false; } for(int j = 0; j < num_fb_fds; ++j) { - response_item->dma_buf[j].fd = fb_fds[j]; - response_item->dma_buf[j].pitch = drmfb->pitches[j]; - response_item->dma_buf[j].offset = drmfb->offsets[j]; + response->items[item_index].dma_buf[j].fd = fb_fds[j]; + response->items[item_index].dma_buf[j].pitch = drmfb->pitches[j]; + response->items[item_index].dma_buf[j].offset = drmfb->offsets[j]; } - response_item->num_dma_bufs = num_fb_fds; - - response_item->width = drmfb->width; - response_item->height = drmfb->height; - response_item->pixel_format = drmfb->pixel_format; - response_item->modifier = drmfb->flags & DRM_MODE_FB_MODIFIERS ? drmfb->modifier : DRM_FORMAT_MOD_INVALID; - response_item->connector_id = crtc_pair ? crtc_pair->connector_id : 0; - response_item->plane_type = plane_type; - switch(response_item->plane_type) { - case KMS_PLANE_TYPE_PRIMARY: { - response_item->x = src_x; - response_item->y = src_y; - response_item->src_w = src_w; - response_item->src_h = src_h; - break; - } - case KMS_PLANE_TYPE_CURSOR: { - response_item->x = crtc_x; - response_item->y = crtc_y; - response_item->src_w = 0; - response_item->src_h = 0; - break; - } - case KMS_PLANE_TYPE_OVERLAY: { - response_item->x = crtc_x; - response_item->y = crtc_y; - response_item->src_w = src_w; - response_item->src_h = src_y; - break; - } + response->items[item_index].num_dma_bufs = num_fb_fds; + + response->items[item_index].width = drmfb->width; + response->items[item_index].height = drmfb->height; + response->items[item_index].pixel_format = drmfb->pixel_format; + response->items[item_index].modifier = drmfb->flags & DRM_MODE_FB_MODIFIERS ? drmfb->modifier : DRM_FORMAT_MOD_INVALID; + response->items[item_index].connector_id = crtc_pair ? crtc_pair->connector_id : 0; + response->items[item_index].is_cursor = property_mask & PLANE_PROPERTY_IS_CURSOR; + if(property_mask & PLANE_PROPERTY_IS_CURSOR) { + response->items[item_index].x = x; + response->items[item_index].y = y; + response->items[item_index].src_w = 0; + response->items[item_index].src_h = 0; + } else { + response->items[item_index].x = src_x; + response->items[item_index].y = src_y; + response->items[item_index].src_w = src_w; + response->items[item_index].src_h = src_h; } ++response->num_items; |