dri3: rework format/modifier caching
Cut down the unnecessary malloc/memcpy/free by utilising the explicit
copy provided by the client.
But above all: do so, after ensuring we get valid data from the
implementation.
Fixes: cef12efc15 ("glamor: Implement GetSupportedModifiers")
Cc: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Cc: Daniel Stone <daniels@collabora.com>
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
			
			
This commit is contained in:
		
							parent
							
								
									71a069fd7f
								
							
						
					
					
						commit
						a42992a4cc
					
				|  | @ -159,8 +159,10 @@ cache_formats_and_modifiers(ScreenPtr screen) | ||||||
| { | { | ||||||
|     dri3_screen_priv_ptr        ds = dri3_screen_priv(screen); |     dri3_screen_priv_ptr        ds = dri3_screen_priv(screen); | ||||||
|     const dri3_screen_info_rec *info = ds->info; |     const dri3_screen_info_rec *info = ds->info; | ||||||
|     CARD32                     *formats = NULL; |     CARD32                      num_formats; | ||||||
|     CARD64                     *modifiers = NULL; |     CARD32                     *formats; | ||||||
|  |     CARD32                      num_modifiers; | ||||||
|  |     CARD64                     *modifiers; | ||||||
|     int                         i; |     int                         i; | ||||||
| 
 | 
 | ||||||
|     if (ds->formats_cached) |     if (ds->formats_cached) | ||||||
|  | @ -176,34 +178,36 @@ cache_formats_and_modifiers(ScreenPtr screen) | ||||||
|         return Success; |         return Success; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     (*info->get_formats) (screen, &ds->num_formats, &formats); |     if (!info->get_formats(screen, &num_formats, &formats)) | ||||||
|     ds->formats = calloc(ds->num_formats, sizeof(dri3_dmabuf_format_rec)); |         return BadAlloc; | ||||||
|  | 
 | ||||||
|  |     if (!num_formats) { | ||||||
|  |         ds->num_formats = 0; | ||||||
|  |         ds->formats_cached = TRUE; | ||||||
|  |         return Success; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ds->formats = calloc(num_formats, sizeof(dri3_dmabuf_format_rec)); | ||||||
|     if (!ds->formats) |     if (!ds->formats) | ||||||
|         return BadAlloc; |         return BadAlloc; | ||||||
| 
 | 
 | ||||||
|     for (i = 0; i < ds->num_formats; i++) { |     for (i = 0; i < num_formats; i++) { | ||||||
|         dri3_dmabuf_format_ptr iter = &ds->formats[i]; |         dri3_dmabuf_format_ptr iter = &ds->formats[i]; | ||||||
| 
 | 
 | ||||||
|  |         if (!info->get_modifiers(screen, formats[i], | ||||||
|  |                                  &num_modifiers, | ||||||
|  |                                  &modifiers)) | ||||||
|  |             continue; | ||||||
|  | 
 | ||||||
|  |         if (!num_modifiers) | ||||||
|  |             continue; | ||||||
|  | 
 | ||||||
|         iter->format = formats[i]; |         iter->format = formats[i]; | ||||||
|         (*info->get_modifiers) (screen, formats[i], |         iter->num_modifiers = num_modifiers; | ||||||
|                                 &iter->num_modifiers, |         iter->modifiers = modifiers; | ||||||
|                                 &modifiers); |  | ||||||
| 
 |  | ||||||
|         iter->modifiers = malloc(iter->num_modifiers * sizeof(CARD64)); |  | ||||||
|         if (iter->modifiers == NULL) |  | ||||||
|             goto error; |  | ||||||
| 
 |  | ||||||
|         memcpy(iter->modifiers, modifiers, |  | ||||||
|                iter->num_modifiers * sizeof(CARD64)); |  | ||||||
|         goto done; |  | ||||||
| 
 |  | ||||||
| error: |  | ||||||
|         iter->num_modifiers = 0; |  | ||||||
|         free(iter->modifiers); |  | ||||||
| done: |  | ||||||
|         free(modifiers); |  | ||||||
|     } |     } | ||||||
|     free(formats); | 
 | ||||||
|  |     ds->num_formats = i; | ||||||
|     ds->formats_cached = TRUE; |     ds->formats_cached = TRUE; | ||||||
| 
 | 
 | ||||||
|     return Success; |     return Success; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue