mirror of
				https://github.com/jojo61/vdr-plugin-softhdcuvid.git
				synced 2025-03-01 10:39:28 +00:00 
			
		
		
		
	Enabled -C Option for DRM
This commit is contained in:
		
							
								
								
									
										248
									
								
								drm.c
									
									
									
									
									
								
							
							
						
						
									
										248
									
								
								drm.c
									
									
									
									
									
								
							@@ -22,7 +22,7 @@ struct _Drm_Render_
 | 
				
			|||||||
    int bpp;
 | 
					    int bpp;
 | 
				
			||||||
    uint32_t connector_id, crtc_id, video_plane;
 | 
					    uint32_t connector_id, crtc_id, video_plane;
 | 
				
			||||||
    uint32_t hdr_metadata;
 | 
					    uint32_t hdr_metadata;
 | 
				
			||||||
	uint32_t mmWidth,mmHeight;   // Size in mm
 | 
					    uint32_t mmWidth,mmHeight;   // Size in mm
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
typedef struct _Drm_Render_ VideoRender;
 | 
					typedef struct _Drm_Render_ VideoRender;
 | 
				
			||||||
@@ -37,6 +37,53 @@ VideoRender *render;
 | 
				
			|||||||
//----------------------------------------------------------------------------
 | 
					//----------------------------------------------------------------------------
 | 
				
			||||||
//  Helper functions
 | 
					//  Helper functions
 | 
				
			||||||
//----------------------------------------------------------------------------
 | 
					//----------------------------------------------------------------------------
 | 
				
			||||||
 | 
					#ifndef ARRAY_SIZE
 | 
				
			||||||
 | 
					#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					struct type_name {
 | 
				
			||||||
 | 
					    unsigned int type;
 | 
				
			||||||
 | 
					    const char *name;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *util_lookup_type_name(unsigned int type,
 | 
				
			||||||
 | 
					                     const struct type_name *table,
 | 
				
			||||||
 | 
					                     unsigned int count)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for (i = 0; i < count; i++)
 | 
				
			||||||
 | 
					        if (table[i].type == type)
 | 
				
			||||||
 | 
					            return table[i].name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct type_name connector_type_names[] = {
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_Unknown, "unknown" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_VGA, "VGA" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_DVII, "DVI-I" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_DVID, "DVI-D" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_DVIA, "DVI-A" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_Composite, "composite" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_SVIDEO, "s-video" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_LVDS, "LVDS" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_Component, "component" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_9PinDIN, "9-pin DIN" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_DisplayPort, "DP" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_HDMIA, "HDMI-A" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_HDMIB, "HDMI-B" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_TV, "TV" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_eDP, "eDP" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_VIRTUAL, "Virtual" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_DSI, "DSI" },
 | 
				
			||||||
 | 
					    { DRM_MODE_CONNECTOR_DPI, "DPI" },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *util_lookup_connector_type_name(unsigned int type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return util_lookup_type_name(type, connector_type_names,
 | 
				
			||||||
 | 
					                     ARRAY_SIZE(connector_type_names));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static uint64_t GetPropertyValue(int fd_drm, uint32_t objectID,
 | 
					static uint64_t GetPropertyValue(int fd_drm, uint32_t objectID,
 | 
				
			||||||
                        uint32_t objectType, const char *propName)
 | 
					                        uint32_t objectType, const char *propName)
 | 
				
			||||||
@@ -149,6 +196,8 @@ static int FindDevice(VideoRender * render)
 | 
				
			|||||||
    uint64_t has_dumb;
 | 
					    uint64_t has_dumb;
 | 
				
			||||||
    uint64_t has_prime;
 | 
					    uint64_t has_prime;
 | 
				
			||||||
    int i,ii=0;
 | 
					    int i,ii=0;
 | 
				
			||||||
 | 
					    char connectorstr[10];
 | 
				
			||||||
 | 
					    int found = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    render->fd_drm = open("/dev/dri/card0", O_RDWR);
 | 
					    render->fd_drm = open("/dev/dri/card0", O_RDWR);
 | 
				
			||||||
    if (render->fd_drm < 0) {
 | 
					    if (render->fd_drm < 0) {
 | 
				
			||||||
@@ -160,24 +209,24 @@ static int FindDevice(VideoRender * render)
 | 
				
			|||||||
    version = drmGetVersion(render->fd_drm);
 | 
					    version = drmGetVersion(render->fd_drm);
 | 
				
			||||||
    fprintf(stderr, "FindDevice: open /dev/dri/card0: %i %s\n", version->name_len, version->name);
 | 
					    fprintf(stderr, "FindDevice: open /dev/dri/card0: %i %s\n", version->name_len, version->name);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
	// check capability
 | 
					    // check capability
 | 
				
			||||||
	if (drmGetCap(render->fd_drm, DRM_CAP_DUMB_BUFFER, &has_dumb) < 0 || has_dumb == 0)
 | 
					    if (drmGetCap(render->fd_drm, DRM_CAP_DUMB_BUFFER, &has_dumb) < 0 || has_dumb == 0)
 | 
				
			||||||
		fprintf(stderr, "FindDevice: drmGetCap DRM_CAP_DUMB_BUFFER failed or doesn't have dumb buffer\n");
 | 
					        fprintf(stderr, "FindDevice: drmGetCap DRM_CAP_DUMB_BUFFER failed or doesn't have dumb buffer\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drmSetClientCap(render->fd_drm, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1) != 0)
 | 
					    if (drmSetClientCap(render->fd_drm, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1) != 0)
 | 
				
			||||||
		fprintf(stderr, "FindDevice: DRM_CLIENT_CAP_UNIVERSAL_PLANES not available.\n");
 | 
					        fprintf(stderr, "FindDevice: DRM_CLIENT_CAP_UNIVERSAL_PLANES not available.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drmSetClientCap(render->fd_drm, DRM_CLIENT_CAP_ATOMIC, 1) != 0)
 | 
					    if (drmSetClientCap(render->fd_drm, DRM_CLIENT_CAP_ATOMIC, 1) != 0)
 | 
				
			||||||
		fprintf(stderr, "FindDevice: DRM_CLIENT_CAP_ATOMIC not available.\n");
 | 
					        fprintf(stderr, "FindDevice: DRM_CLIENT_CAP_ATOMIC not available.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drmGetCap(render->fd_drm, DRM_CAP_PRIME, &has_prime) < 0)
 | 
					    if (drmGetCap(render->fd_drm, DRM_CAP_PRIME, &has_prime) < 0)
 | 
				
			||||||
		fprintf(stderr, "FindDevice: DRM_CAP_PRIME not available.\n");
 | 
					        fprintf(stderr, "FindDevice: DRM_CAP_PRIME not available.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_EXPORT, &has_prime) < 0)
 | 
					    if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_EXPORT, &has_prime) < 0)
 | 
				
			||||||
		fprintf(stderr, "FindDevice: DRM_PRIME_CAP_EXPORT not available.\n");
 | 
					        fprintf(stderr, "FindDevice: DRM_PRIME_CAP_EXPORT not available.\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_IMPORT, &has_prime) < 0)
 | 
					    if (drmGetCap(render->fd_drm, DRM_PRIME_CAP_IMPORT, &has_prime) < 0)
 | 
				
			||||||
		fprintf(stderr, "FindDevice: DRM_PRIME_CAP_IMPORT not available.\n");
 | 
					        fprintf(stderr, "FindDevice: DRM_PRIME_CAP_IMPORT not available.\n");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if ((resources = drmModeGetResources(render->fd_drm)) == NULL){
 | 
					    if ((resources = drmModeGetResources(render->fd_drm)) == NULL){
 | 
				
			||||||
        fprintf(stderr, "FindDevice: cannot retrieve DRM resources (%d): %m\n", errno);
 | 
					        fprintf(stderr, "FindDevice: cannot retrieve DRM resources (%d): %m\n", errno);
 | 
				
			||||||
@@ -195,13 +244,18 @@ static int FindDevice(VideoRender * render)
 | 
				
			|||||||
        connector = drmModeGetConnector(render->fd_drm, resources->connectors[i]);
 | 
					        connector = drmModeGetConnector(render->fd_drm, resources->connectors[i]);
 | 
				
			||||||
        if (!connector) {
 | 
					        if (!connector) {
 | 
				
			||||||
            fprintf(stderr, "FindDevice: cannot retrieve DRM connector (%d): %m\n", errno);
 | 
					            fprintf(stderr, "FindDevice: cannot retrieve DRM connector (%d): %m\n", errno);
 | 
				
			||||||
        	return -errno;
 | 
					            return -errno;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        sprintf(connectorstr,"%s-%u",util_lookup_connector_type_name(connector->connector_type),connector->connector_type_id);
 | 
				
			||||||
 | 
					        printf("Connector >%s< is %sconnected\n",connectorstr,connector->connection == DRM_MODE_CONNECTED?"":"not ");
 | 
				
			||||||
 | 
					        if (DRMConnector && strcmp(DRMConnector,connectorstr))
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) {
 | 
					        if (connector->connection == DRM_MODE_CONNECTED && connector->count_modes > 0) {
 | 
				
			||||||
            render->connector_id = connector->connector_id;
 | 
					            render->connector_id = connector->connector_id;
 | 
				
			||||||
			render->mmHeight     = connector->mmHeight;
 | 
					            render->mmHeight     = connector->mmHeight;
 | 
				
			||||||
			render->mmWidth      = connector->mmWidth;
 | 
					            render->mmWidth      = connector->mmWidth;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            // FIXME: use default encoder/crtc pair
 | 
					            // FIXME: use default encoder/crtc pair
 | 
				
			||||||
            if ((encoder = drmModeGetEncoder(render->fd_drm, connector->encoder_id)) == NULL){
 | 
					            if ((encoder = drmModeGetEncoder(render->fd_drm, connector->encoder_id)) == NULL){
 | 
				
			||||||
@@ -214,36 +268,45 @@ static int FindDevice(VideoRender * render)
 | 
				
			|||||||
                            DRM_MODE_OBJECT_CONNECTOR, "HDR_OUTPUT_METADATA");      
 | 
					                            DRM_MODE_OBJECT_CONNECTOR, "HDR_OUTPUT_METADATA");      
 | 
				
			||||||
            printf("ID %d of METADATA in Connector %d connected %d\n",render->hdr_metadata,connector->connector_id,connector->connection);
 | 
					            printf("ID %d of METADATA in Connector %d connected %d\n",render->hdr_metadata,connector->connector_id,connector->connection);
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
			memcpy(&render->mode, &connector->modes[0], sizeof(drmModeModeInfo));  // set fallback
 | 
					            memcpy(&render->mode, &connector->modes[0], sizeof(drmModeModeInfo));  // set fallback
 | 
				
			||||||
			// search Modes for Connector
 | 
					            // search Modes for Connector
 | 
				
			||||||
			for (ii = 0; ii < connector->count_modes; ii++) {
 | 
					            for (ii = 0; ii < connector->count_modes; ii++) {
 | 
				
			||||||
				mode = &connector->modes[ii];
 | 
					                mode = &connector->modes[ii];
 | 
				
			||||||
				printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh);
 | 
					                
 | 
				
			||||||
				if (VideoWindowWidth && VideoWindowHeight) { // preset by command line 
 | 
					                printf("Mode %d %dx%d Rate %d\n",ii,mode->hdisplay,mode->vdisplay,mode->vrefresh);
 | 
				
			||||||
					if (VideoWindowWidth == mode->hdisplay && 
 | 
					                
 | 
				
			||||||
							VideoWindowHeight == mode->vdisplay && 
 | 
					                if (VideoWindowWidth && VideoWindowHeight) { // preset by command line 
 | 
				
			||||||
							mode->vrefresh == DRMRefresh &&
 | 
					                    if (VideoWindowWidth == mode->hdisplay && 
 | 
				
			||||||
							!(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
 | 
					                            VideoWindowHeight == mode->vdisplay && 
 | 
				
			||||||
						memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
 | 
					                            mode->vrefresh == DRMRefresh &&
 | 
				
			||||||
						break;
 | 
					                            !(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
 | 
				
			||||||
					}
 | 
					                        memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
 | 
				
			||||||
				} 
 | 
					                        break;
 | 
				
			||||||
				else {
 | 
					                    }
 | 
				
			||||||
					if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
 | 
					                } 
 | 
				
			||||||
						memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
 | 
					                else {
 | 
				
			||||||
						VideoWindowWidth = mode->hdisplay;
 | 
					                    if (!(mode->flags & DRM_MODE_FLAG_INTERLACE)) {
 | 
				
			||||||
						VideoWindowHeight = mode->vdisplay;
 | 
					                        memcpy(&render->mode, mode, sizeof(drmModeModeInfo));
 | 
				
			||||||
						break;
 | 
					                        VideoWindowWidth = mode->hdisplay;
 | 
				
			||||||
					}
 | 
					                        VideoWindowHeight = mode->vdisplay;
 | 
				
			||||||
				}
 | 
					                        break;
 | 
				
			||||||
			}
 | 
					                    }
 | 
				
			||||||
			i = resources->count_connectors;   // uuuuhh 
 | 
					                }
 | 
				
			||||||
		}
 | 
					            }
 | 
				
			||||||
		VideoWindowWidth = render->mode.hdisplay;
 | 
					            found = 1;
 | 
				
			||||||
		VideoWindowHeight = render->mode.vdisplay;
 | 
					            i = resources->count_connectors;   // uuuuhh 
 | 
				
			||||||
		printf("Use Mode %d %dx%d Rate %d\n",ii,render->mode.hdisplay,render->mode.vdisplay,render->mode.vrefresh);
 | 
					        }
 | 
				
			||||||
 | 
					        VideoWindowWidth = render->mode.hdisplay;
 | 
				
			||||||
 | 
					        VideoWindowHeight = render->mode.vdisplay;
 | 
				
			||||||
 | 
					        if (found)
 | 
				
			||||||
 | 
					            printf("Use Mode %d %dx%d Rate %d\n",ii,render->mode.hdisplay,render->mode.vdisplay,render->mode.vrefresh);
 | 
				
			||||||
        drmModeFreeConnector(connector);
 | 
					        drmModeFreeConnector(connector);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    if (!found) {
 | 
				
			||||||
 | 
					        Debug(3,"Requested Connector not found or not connected\n");
 | 
				
			||||||
 | 
					        printf("Requested Connector not found or not connected\n");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    // find first plane
 | 
					    // find first plane
 | 
				
			||||||
    if ((plane_res = drmModeGetPlaneResources(render->fd_drm)) == NULL)
 | 
					    if ((plane_res = drmModeGetPlaneResources(render->fd_drm)) == NULL)
 | 
				
			||||||
@@ -315,12 +378,12 @@ void VideoInitDrm()
 | 
				
			|||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (!(render = calloc(1, sizeof(*render)))) {
 | 
					    if (!(render = calloc(1, sizeof(*render)))) {
 | 
				
			||||||
        Error(_("video/DRM: out of memory\n"));
 | 
					        Fatal(_("video/DRM: out of memory\n"));
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (FindDevice(render)){
 | 
					    if (FindDevice(render)){
 | 
				
			||||||
        fprintf(stderr, "VideoInit: FindDevice() failed\n");
 | 
					        Fatal(_( "VideoInit: FindDevice() failed\n"));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    gbm.dev = gbm_create_device (render->fd_drm);
 | 
					    gbm.dev = gbm_create_device (render->fd_drm);
 | 
				
			||||||
@@ -359,8 +422,8 @@ void VideoInitDrm()
 | 
				
			|||||||
    if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
 | 
					    if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
 | 
				
			||||||
        fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
 | 
					        fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
	if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0)
 | 
					    if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0)
 | 
				
			||||||
		fprintf(stderr, "cannot destroy prperty blob (%d): %m\n", errno);
 | 
					        fprintf(stderr, "cannot destroy prperty blob (%d): %m\n", errno);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    drmModeAtomicFree(ModeReq);
 | 
					    drmModeAtomicFree(ModeReq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -368,8 +431,8 @@ void VideoInitDrm()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void get_drm_aspect(int *num,int *den)
 | 
					void get_drm_aspect(int *num,int *den)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	*num = VideoWindowWidth * render->mmHeight;
 | 
					    *num = VideoWindowWidth * render->mmHeight;
 | 
				
			||||||
	*den = VideoWindowHeight * render->mmWidth;
 | 
					    *den = VideoWindowHeight * render->mmWidth;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct gbm_bo *bo = NULL, *next_bo=NULL;
 | 
					struct gbm_bo *bo = NULL, *next_bo=NULL;
 | 
				
			||||||
@@ -381,8 +444,8 @@ void InitBo(int bpp) {
 | 
				
			|||||||
    // create the GBM and EGL surface
 | 
					    // create the GBM and EGL surface
 | 
				
			||||||
    render->bpp = bpp;
 | 
					    render->bpp = bpp;
 | 
				
			||||||
    gbm.surface = gbm_surface_create (gbm.dev, VideoWindowWidth,VideoWindowHeight, 
 | 
					    gbm.surface = gbm_surface_create (gbm.dev, VideoWindowWidth,VideoWindowHeight, 
 | 
				
			||||||
									  bpp==10?GBM_FORMAT_XRGB2101010:GBM_FORMAT_ARGB8888, 
 | 
					                                      bpp==10?GBM_FORMAT_XRGB2101010:GBM_FORMAT_ARGB8888, 
 | 
				
			||||||
									  GBM_BO_USE_SCANOUT|GBM_BO_USE_RENDERING);
 | 
					                                      GBM_BO_USE_SCANOUT|GBM_BO_USE_RENDERING);
 | 
				
			||||||
    assert(gbm.surface != NULL);
 | 
					    assert(gbm.surface != NULL);
 | 
				
			||||||
    eglSurface = eglCreateWindowSurface (eglDisplay, eglConfig, gbm.surface, NULL);
 | 
					    eglSurface = eglCreateWindowSurface (eglDisplay, eglConfig, gbm.surface, NULL);
 | 
				
			||||||
    assert(eglSurface != NULL);
 | 
					    assert(eglSurface != NULL);
 | 
				
			||||||
@@ -398,8 +461,8 @@ static void drm_swap_buffers () {
 | 
				
			|||||||
    eglSwapBuffers (eglDisplay, eglSurface);
 | 
					    eglSwapBuffers (eglDisplay, eglSurface);
 | 
				
			||||||
    struct gbm_bo *bo = gbm_surface_lock_front_buffer (gbm.surface);
 | 
					    struct gbm_bo *bo = gbm_surface_lock_front_buffer (gbm.surface);
 | 
				
			||||||
#if 1
 | 
					#if 1
 | 
				
			||||||
	if (bo == NULL)
 | 
					    if (bo == NULL)
 | 
				
			||||||
		bo = gbm_surface_lock_front_buffer (gbm.surface);
 | 
					        bo = gbm_surface_lock_front_buffer (gbm.surface);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
    assert (bo != NULL);
 | 
					    assert (bo != NULL);
 | 
				
			||||||
    uint32_t handle = gbm_bo_get_handle (bo).u32;
 | 
					    uint32_t handle = gbm_bo_get_handle (bo).u32;
 | 
				
			||||||
@@ -407,50 +470,50 @@ static void drm_swap_buffers () {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    drmModeAddFB (render->fd_drm, VideoWindowWidth,VideoWindowHeight,render->bpp==10? 30:24, 32, pitch, handle, &fb);
 | 
					    drmModeAddFB (render->fd_drm, VideoWindowWidth,VideoWindowHeight,render->bpp==10? 30:24, 32, pitch, handle, &fb);
 | 
				
			||||||
//	drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode);
 | 
					//  drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode);
 | 
				
			||||||
   
 | 
					   
 | 
				
			||||||
	if (m_need_modeset) {
 | 
					    if (m_need_modeset) {
 | 
				
			||||||
		drmModeAtomicReqPtr ModeReq;
 | 
					        drmModeAtomicReqPtr ModeReq;
 | 
				
			||||||
		const uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
 | 
					        const uint32_t flags = DRM_MODE_ATOMIC_ALLOW_MODESET;
 | 
				
			||||||
		uint32_t modeID = 0;
 | 
					        uint32_t modeID = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (drmModeCreatePropertyBlob(render->fd_drm, &render->mode, sizeof(render->mode), &modeID) != 0) {
 | 
					        if (drmModeCreatePropertyBlob(render->fd_drm, &render->mode, sizeof(render->mode), &modeID) != 0) {
 | 
				
			||||||
			fprintf(stderr, "Failed to create mode property.\n");
 | 
					            fprintf(stderr, "Failed to create mode property.\n");
 | 
				
			||||||
			return;
 | 
					            return;
 | 
				
			||||||
		}
 | 
					        }
 | 
				
			||||||
		if (!(ModeReq = drmModeAtomicAlloc())) {
 | 
					        if (!(ModeReq = drmModeAtomicAlloc())) {
 | 
				
			||||||
			fprintf(stderr, "cannot allocate atomic request (%d): %m\n", errno);
 | 
					            fprintf(stderr, "cannot allocate atomic request (%d): %m\n", errno);
 | 
				
			||||||
			return;
 | 
					            return;
 | 
				
			||||||
		}
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
		// Need to disable the CRTC in order to submit the HDR data.... 
 | 
					        // Need to disable the CRTC in order to submit the HDR data.... 
 | 
				
			||||||
		SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
 | 
					        SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
 | 
				
			||||||
							DRM_MODE_OBJECT_CRTC, "ACTIVE", 0);		
 | 
					                            DRM_MODE_OBJECT_CRTC, "ACTIVE", 0);     
 | 
				
			||||||
		if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
 | 
					        if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
 | 
				
			||||||
			fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
 | 
					            fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
 | 
				
			||||||
		sleep(2);
 | 
					        sleep(2);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
	    SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id,
 | 
					        SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id,
 | 
				
			||||||
	                        DRM_MODE_OBJECT_CONNECTOR, "Colorspace",old_color==AVCOL_PRI_BT2020?9:2 );
 | 
					                            DRM_MODE_OBJECT_CONNECTOR, "Colorspace",old_color==AVCOL_PRI_BT2020?9:2 );
 | 
				
			||||||
		SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
 | 
					        SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
 | 
				
			||||||
							DRM_MODE_OBJECT_CRTC, "MODE_ID", modeID);
 | 
					                            DRM_MODE_OBJECT_CRTC, "MODE_ID", modeID);
 | 
				
			||||||
		SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id,
 | 
					        SetPropertyRequest(ModeReq, render->fd_drm, render->connector_id,
 | 
				
			||||||
							DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id);
 | 
					                            DRM_MODE_OBJECT_CONNECTOR, "CRTC_ID", render->crtc_id);
 | 
				
			||||||
		SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
 | 
					        SetPropertyRequest(ModeReq, render->fd_drm, render->crtc_id,
 | 
				
			||||||
							DRM_MODE_OBJECT_CRTC, "ACTIVE", 1);
 | 
					                            DRM_MODE_OBJECT_CRTC, "ACTIVE", 1);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
		if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
 | 
					        if (drmModeAtomicCommit(render->fd_drm, ModeReq, flags, NULL) != 0)
 | 
				
			||||||
			fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
 | 
					            fprintf(stderr, "cannot set atomic mode (%d): %m\n", errno);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0)
 | 
					        if (drmModeDestroyPropertyBlob(render->fd_drm, modeID) != 0)
 | 
				
			||||||
			fprintf(stderr, "cannot destroy prperty blob (%d): %m\n", errno);
 | 
					            fprintf(stderr, "cannot destroy prperty blob (%d): %m\n", errno);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		drmModeAtomicFree(ModeReq);
 | 
					        drmModeAtomicFree(ModeReq);
 | 
				
			||||||
		m_need_modeset = 0;
 | 
					        m_need_modeset = 0;
 | 
				
			||||||
	}
 | 
					    }
 | 
				
			||||||
	drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode);
 | 
					    drmModeSetCrtc (render->fd_drm, render->crtc_id, fb, 0, 0, &render->connector_id, 1, &render->mode);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
	if (previous_bo) {
 | 
					    if (previous_bo) {
 | 
				
			||||||
        drmModeRmFB (render->fd_drm, previous_fb);
 | 
					        drmModeRmFB (render->fd_drm, previous_fb);
 | 
				
			||||||
        gbm_surface_release_buffer (gbm.surface, previous_bo);
 | 
					        gbm_surface_release_buffer (gbm.surface, previous_bo);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
@@ -461,6 +524,9 @@ static void drm_swap_buffers () {
 | 
				
			|||||||
static void drm_clean_up () {
 | 
					static void drm_clean_up () {
 | 
				
			||||||
    // set the previous crtc
 | 
					    // set the previous crtc
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    if (!render)
 | 
				
			||||||
 | 
					        return;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    drmModeSetCrtc (render->fd_drm, render->saved_crtc->crtc_id, render->saved_crtc->buffer_id,
 | 
					    drmModeSetCrtc (render->fd_drm, render->saved_crtc->crtc_id, render->saved_crtc->buffer_id,
 | 
				
			||||||
                    render->saved_crtc->x, render->saved_crtc->y, &render->connector_id, 1, &render->saved_crtc->mode);
 | 
					                    render->saved_crtc->x, render->saved_crtc->y, &render->connector_id, 1, &render->saved_crtc->mode);
 | 
				
			||||||
    drmModeFreeCrtc (render->saved_crtc);
 | 
					    drmModeFreeCrtc (render->saved_crtc);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user