On Wed, Mar 23, 2016 at 11:38:05AM +0000, Lionel Landwerlin wrote:
> All properties can be listed regardless of whether we're dealing with
> an atomic enabled driver, so load all of the properties ids regardless
> at init time.
> 
> Also, we can have only one function loading the property ids and reuse
> that for different DRM objects.
> 
> Signed-off-by: Lionel Landwerlin <[email protected]>
> ---
>  lib/igt_kms.c | 185 
> +++++++++++++++++++++-------------------------------------
>  lib/igt_kms.h |  21 +++----
>  2 files changed, 76 insertions(+), 130 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 5ef89cf..3321738 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -173,85 +173,31 @@ static const char 
> *igt_connector_prop_names[IGT_NUM_CONNECTOR_PROPS] = {
>  };
>  
>  /*
> - * Retrieve all the properies specified in props_name and store them into
> - * plane->atomic_props_plane.
> + * Retrieve all the properies specified in props_name from object_id
typo.
> + * and store them into prop_ids.
>   */
>  static void
> -igt_atomic_fill_plane_props(igt_display_t *display, igt_plane_t *plane,
> -                     int num_props, const char **prop_names)
> +igt_atomic_fill_props(igt_display_t *display,
> +                   uint32_t object_id, uint32_t object_type,
> +                   uint32_t *prop_ids, const char **prop_names,
> +                   int num_props)
>  {
>       drmModeObjectPropertiesPtr props;
> -     int i, j, fd;
> -
> -     fd = display->drm_fd;
> +     int i, j;
>  
> -     props = drmModeObjectGetProperties(fd, plane->drm_plane->plane_id, 
> DRM_MODE_OBJECT_PLANE);
> +     props = drmModeObjectGetProperties(display->drm_fd,
> +                                        object_id, object_type);
>       igt_assert(props);
>  
>       for (i = 0; i < props->count_props; i++) {
>               drmModePropertyPtr prop =
> -                     drmModeGetProperty(fd, props->props[i]);
> +                     drmModeGetProperty(display->drm_fd, props->props[i]);
>  
>               for (j = 0; j < num_props; j++) {
>                       if (strcmp(prop->name, prop_names[j]) != 0)
>                               continue;
>  
> -                     plane->atomic_props_plane[j] = props->props[i];
> -                     break;
> -             }
> -
> -             drmModeFreeProperty(prop);
> -     }
> -
> -     drmModeFreeObjectProperties(props);
> -}
> -
> -/*
> - * Retrieve all the properies specified in props_name and store them into
> - * config->atomic_props_crtc and config->atomic_props_connector.
> - */
> -static void
> -igt_atomic_fill_props(igt_display_t *display, igt_output_t *output,
> -                     int num_crtc_props, const char **crtc_prop_names,
> -                     int num_connector_props, const char **conn_prop_names)
> -{
> -     drmModeObjectPropertiesPtr props;
> -     int i, j, fd;
> -
> -     fd = display->drm_fd;
> -
> -     props = drmModeObjectGetProperties(fd, output->config.crtc->crtc_id, 
> DRM_MODE_OBJECT_CRTC);
> -     igt_assert(props);
> -
> -     for (i = 0; i < props->count_props; i++) {
> -             drmModePropertyPtr prop =
> -                     drmModeGetProperty(fd, props->props[i]);
> -
> -             for (j = 0; j < num_crtc_props; j++) {
> -                     if (strcmp(prop->name, crtc_prop_names[j]) != 0)
> -                             continue;
> -
> -                     output->config.atomic_props_crtc[j] = props->props[i];
> -                     break;
> -             }
> -
> -             drmModeFreeProperty(prop);
> -     }
> -
> -     drmModeFreeObjectProperties(props);
> -     props = NULL;
> -     props = drmModeObjectGetProperties(fd, 
> output->config.connector->connector_id, DRM_MODE_OBJECT_CONNECTOR);
> -     igt_assert(props);
> -
> -     for (i = 0; i < props->count_props; i++) {
> -             drmModePropertyPtr prop =
> -                     drmModeGetProperty(fd, props->props[i]);
> -
> -             for (j = 0; j < num_connector_props; j++) {
> -                     if (strcmp(prop->name, conn_prop_names[j]) != 0)
> -                             continue;
> -
> -                     output->config.atomic_props_connector[j] = 
> props->props[i];
> +                     prop_ids[j] = props->props[i];
>                       break;
>               }
>  
> @@ -259,7 +205,6 @@ igt_atomic_fill_props(igt_display_t *display, 
> igt_output_t *output,
>       }
>  
>       drmModeFreeObjectProperties(props);
> -
>  }
>  
>  const unsigned char* igt_kms_get_alt_edid(void)
> @@ -1118,8 +1063,9 @@ static void igt_output_refresh(igt_output_t *output)
>           kmstest_pipe_name(output->config.pipe));
>  
>       display->pipes_in_use |= 1 << output->config.pipe;
> -     igt_atomic_fill_props(display, output, IGT_NUM_CRTC_PROPS, 
> igt_crtc_prop_names,
> -             IGT_NUM_CONNECTOR_PROPS, igt_connector_prop_names);
> +     igt_atomic_fill_props(display, output->id, DRM_MODE_OBJECT_CONNECTOR,
> +                           output->properties, igt_connector_prop_names,
> +                           IGT_NUM_CONNECTOR_PROPS);

Does it make sense to call it if !display->atomic?

>  }
>  
>  static bool
> @@ -1189,7 +1135,6 @@ void igt_display_init(igt_display_t *display, int 
> drm_fd)
>       drmModeRes *resources;
>       drmModePlaneRes *plane_resources;
>       int i;
> -     int is_atomic = 0;
>  
>       memset(display, 0, sizeof(igt_display_t));
>  
> @@ -1207,7 +1152,7 @@ void igt_display_init(igt_display_t *display, int 
> drm_fd)
>       display->n_pipes = resources->count_crtcs;
>  
>       drmSetClientCap(drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 1);
> -     is_atomic = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC, 1);
> +     display->is_atomic = drmSetClientCap(drm_fd, DRM_CLIENT_CAP_ATOMIC, 1) 
> == 0;
>       plane_resources = drmModeGetPlaneResources(display->drm_fd);
>       igt_assert(plane_resources);
>  
> @@ -1265,10 +1210,12 @@ void igt_display_init(igt_display_t *display, int 
> drm_fd)
>  
>                       plane->pipe = pipe;
>                       plane->drm_plane = drm_plane;
> -                     if (is_atomic == 0) {
> -                             display->is_atomic = 1;
> -                             igt_atomic_fill_plane_props(display, plane, 
> IGT_NUM_PLANE_PROPS, igt_plane_prop_names);
> -                     }
> +                     igt_atomic_fill_props(display,
> +                                           plane->drm_plane->plane_id,
> +                                           DRM_MODE_OBJECT_PLANE,
> +                                           plane->properties,
> +                                           igt_plane_prop_names,
> +                                           IGT_NUM_PLANE_PROPS);
>  
>                       get_plane_property(display->drm_fd, drm_plane->plane_id,
>                                          "rotation",
> @@ -1316,6 +1263,36 @@ void igt_display_init(igt_display_t *display, int 
> drm_fd)
>               /* planes = 1 primary, (p-1) sprites, 1 cursor */
>               pipe->n_planes = p + 1;
>  
> +             igt_atomic_fill_props(display, pipe->crtc_id, 
> DRM_MODE_OBJECT_CRTC,
> +                                   pipe->properties, igt_crtc_prop_names,
> +                                   IGT_NUM_CRTC_PROPS);
> +             if (pipe->crtc_id) {
> +                     uint64_t prop_value;
> +
> +                     get_crtc_property(display->drm_fd, pipe->crtc_id,
> +                                       "background_color",
> +                                       &pipe->background_property,
> +                                       &prop_value,
> +                                       NULL);
> +                     pipe->background = (uint32_t)prop_value;
> +                     get_crtc_property(display->drm_fd, pipe->crtc_id,
> +                                       "DEGAMMA_LUT",
> +                                       &pipe->degamma_property,
> +                                       NULL,
> +                                       NULL);
> +                     get_crtc_property(display->drm_fd, pipe->crtc_id,
> +                                       "CTM",
> +                                       &pipe->ctm_property,
> +                                       NULL,
> +                                       NULL);
> +                     get_crtc_property(display->drm_fd, pipe->crtc_id,
> +                                       "GAMMA_LUT",
> +                                       &pipe->gamma_property,
> +                                       NULL,
> +                                       NULL);
> +             }
> +
> +
>               /* make sure we don't overflow the plane array */
>               igt_assert(pipe->n_planes <= IGT_MAX_PLANES);
>       }
> @@ -1330,7 +1307,6 @@ void igt_display_init(igt_display_t *display, int 
> drm_fd)
>       igt_assert(display->outputs);
>  
>       for (i = 0; i < display->n_outputs; i++) {
> -             int j;
>               igt_output_t *output = &display->outputs[i];
>  
>               /*
> @@ -1342,35 +1318,6 @@ void igt_display_init(igt_display_t *display, int 
> drm_fd)
>               output->display = display;
>  
>               igt_output_refresh(output);
> -
> -             for (j = 0; j < display->n_pipes; j++) {
> -                     uint64_t prop_value;
> -                     igt_pipe_t *pipe = &display->pipes[j];
> -
> -                     if (output->config.crtc) {
> -                             get_crtc_property(display->drm_fd, 
> output->config.crtc->crtc_id,
> -                                                "background_color",
> -                                                &pipe->background_property,
> -                                                &prop_value,
> -                                                NULL);
> -                             pipe->background = (uint32_t)prop_value;
> -                             get_crtc_property(display->drm_fd, 
> output->config.crtc->crtc_id,
> -                                               "DEGAMMA_LUT",
> -                                               &pipe->degamma_property,
> -                                               NULL,
> -                                               NULL);
> -                             get_crtc_property(display->drm_fd, 
> output->config.crtc->crtc_id,
> -                                               "CTM",
> -                                               &pipe->ctm_property,
> -                                               NULL,
> -                                               NULL);
> -                             get_crtc_property(display->drm_fd, 
> output->config.crtc->crtc_id,
> -                                               "GAMMA_LUT",
> -                                               &pipe->gamma_property,
> -                                               NULL,
> -                                               NULL);
> -                     }
> -             }
>       }
>  
>       drmModeFreePlaneResources(plane_resources);
> @@ -1945,22 +1892,19 @@ static int igt_output_commit(igt_output_t *output,
>  /*
>   * Add crtc property changes to the atomic property set
>   */
> -static void igt_atomic_prepare_crtc_commit(igt_output_t *output, 
> drmModeAtomicReq *req)
> +static void igt_atomic_prepare_pipe_commit(igt_pipe_t *pipe, 
> drmModeAtomicReq *req)
>  {
> +     if (pipe->background_changed)
> +             igt_atomic_populate_pipe_req(req, pipe, IGT_CRTC_BACKGROUND, 
> pipe->background);
>  
> -     igt_pipe_t *pipe_obj = igt_output_get_driving_pipe(output);
> -
> -     if (pipe_obj->background_changed)
> -             igt_atomic_populate_crtc_req(req, output, IGT_CRTC_BACKGROUND, 
> pipe_obj->background);
> -
> -     if (pipe_obj->color_mgmt_changed) {
> -             igt_atomic_populate_crtc_req(req, output, IGT_CRTC_DEGAMMA_LUT, 
> pipe_obj->degamma_blob);
> -             igt_atomic_populate_crtc_req(req, output, IGT_CRTC_CTM, 
> pipe_obj->ctm_blob);
> -             igt_atomic_populate_crtc_req(req, output, IGT_CRTC_GAMMA_LUT, 
> pipe_obj->gamma_blob);
> +     if (pipe->color_mgmt_changed) {
> +             igt_atomic_populate_pipe_req(req, pipe, IGT_CRTC_DEGAMMA_LUT, 
> pipe->degamma_blob);
> +             igt_atomic_populate_pipe_req(req, pipe, IGT_CRTC_CTM, 
> pipe->ctm_blob);
> +             igt_atomic_populate_pipe_req(req, pipe, IGT_CRTC_GAMMA_LUT, 
> pipe->gamma_blob);
>       }
>  
> -     pipe_obj->background_changed = false;
> -     pipe_obj->color_mgmt_changed = false;
> +     pipe->background_changed = false;
> +     pipe->color_mgmt_changed = false;
>  }
>  
>  /*
> @@ -2001,10 +1945,14 @@ static int igt_atomic_commit(igt_display_t *display)
>               igt_plane_t *plane;
>               enum pipe pipe;
>  
> +             pipe_obj = igt_output_get_driving_pipe(output);
> +
> +             pipe = pipe_obj->pipe;
> +
>               /*
>                * Add CRTC Properties to the property set
>                */
> -             igt_atomic_prepare_crtc_commit(output, req);
> +             igt_atomic_prepare_pipe_commit(pipe_obj, req);
>  
>               /*
>                * Add Connector Properties to the property set
> @@ -2012,9 +1960,6 @@ static int igt_atomic_commit(igt_display_t *display)
>               igt_atomic_prepare_connector_commit(output, req);
>  
>  
> -             pipe_obj = igt_output_get_driving_pipe(output);
> -
> -             pipe = pipe_obj->pipe;
>  
>               for_each_plane_on_pipe(display, pipe, plane) {
>                       igt_atomic_prepare_plane_commit(plane, output, req);
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 8ae1192..9f04f72 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -129,8 +129,6 @@ struct kmstest_connector_config {
>       bool connector_scaling_mode_changed;
>       uint64_t connector_dpms;
>       bool connector_dpms_changed;
> -     uint32_t atomic_props_crtc[IGT_NUM_CRTC_PROPS];
> -     uint32_t atomic_props_connector[IGT_NUM_CONNECTOR_PROPS];
>       int crtc_idx;
>       int pipe;
>  };
> @@ -246,7 +244,7 @@ typedef struct {
>       /* panning offset within the fb */
>       unsigned int pan_x, pan_y;
>       igt_rotation_t rotation;
> -     uint32_t atomic_props_plane[IGT_NUM_PLANE_PROPS];
> +     uint32_t properties[IGT_NUM_PLANE_PROPS];
>  } igt_plane_t;
>  
>  struct igt_pipe {
> @@ -269,6 +267,8 @@ struct igt_pipe {
>       uint32_t color_mgmt_changed : 1;
>  
>       uint32_t crtc_id;
> +
> +     uint32_t properties[IGT_NUM_CRTC_PROPS];
>  };
So the macro remain as CRTCs?

>  
>  typedef struct {
> @@ -281,6 +281,7 @@ typedef struct {
>       unsigned long pending_crtc_idx_mask;
>       bool use_override_mode;
>       drmModeModeInfo override_mode;
> +     uint32_t properties[IGT_NUM_CONNECTOR_PROPS];
>  } igt_output_t;
>  
>  struct igt_display {
> @@ -355,18 +356,18 @@ void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
>   */
>  #define igt_atomic_populate_plane_req(req, plane, prop, value) \
>       igt_assert_lt(0, drmModeAtomicAddProperty(req, 
> plane->drm_plane->plane_id,\
> -                                               
> plane->atomic_props_plane[prop], value))
> +                                               plane->properties[prop], 
> value))
>  
>  /**
> - * igt_atomic_populate_crtc_req:
> + * igt_atomic_populate_pipe_req:
>   * @req: A pointer to drmModeAtomicReq
> - * @output: A pointer igt_output_t
> + * @pipe: A pointer igt_pipe_t
>   * @prop: one of igt_atomic_crtc_properties
>   * @value: the value to add
>   */
> -#define igt_atomic_populate_crtc_req(req, output, prop, value) \
> -     igt_assert_lt(0, drmModeAtomicAddProperty(req, 
> output->config.crtc->crtc_id,\
> -                                               
> output->config.atomic_props_crtc[prop], value))
> +#define igt_atomic_populate_pipe_req(req, pipe, prop, value) \
> +     igt_assert_lt(0, drmModeAtomicAddProperty(req, pipe->crtc_id,\
> +                                               pipe->properties[prop], 
> value))
>  /**
>   * igt_atomic_populate_connector_req:
>   * @req: A pointer to drmModeAtomicReq
> @@ -376,7 +377,7 @@ void igt_wait_for_vblank(int drm_fd, enum pipe pipe);
>   */
>  #define igt_atomic_populate_connector_req(req, output, prop, value) \
>       igt_assert_lt(0, drmModeAtomicAddProperty(req, 
> output->config.connector->connector_id,\
> -                                               
> output->config.atomic_props_connector[prop], value))
> +                                               output->properties[prop], 
> value))
>  
>  void igt_enable_connectors(void);
>  void igt_reset_connectors(void);
> -- 
> 2.8.0.rc3
> 
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Attachment: signature.asc
Description: Digital signature

_______________________________________________
Intel-gfx mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to