All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Arora, Gagandeep S" <gagandeep.s.arora@intel.com>
To: rodrigo.vivi@intel.com, damien.lespiau@intel.com
Cc: intel-gfx@lists.freedesktop.org, manikandan.k.pillai@intel.com
Subject: Re: [PATCH] demos/intel_sprite_on: Added support to display all sprites.
Date: Tue, 07 Oct 2014 23:58:24 +0530	[thread overview]
Message-ID: <543430C8.1080600@intel.com> (raw)
In-Reply-To: <1410551764-28211-1-git-send-email-gagandeep.s.arora@intel.com>


[-- Attachment #1.1: Type: text/plain, Size: 9034 bytes --]

Hi Rodrigo/Damien,

Could you please help me in getting this patch reviewed.

Thanks and Regards,
Gagan

On 9/13/2014 1:26 AM, Gagandeep S Arora wrote:
> From: gsarora<gagandeep.s.arora@intel.com>
>
> Extended intel_sprite_on functionality to display all the
> available sprite planes on a particular connector.
>
> Signed-off-by: Gagandeep S Arora<gagandeep.s.arora@intel.com>
> ---
>   demos/intel_sprite_on.c | 138 ++++++++++++++++++++++++++++++------------------
>   1 file changed, 87 insertions(+), 51 deletions(-)
>
> diff --git a/demos/intel_sprite_on.c b/demos/intel_sprite_on.c
> index a1c6a34..23fc56c 100644
> --- a/demos/intel_sprite_on.c
> +++ b/demos/intel_sprite_on.c
> @@ -279,12 +279,12 @@ static void connector_find_preferred_mode(int gfx_fd,
>   	c->connector = connector;
>   }
>   
> -static int connector_find_plane(int gfx_fd, struct connector *c)
> +static int connector_find_plane(int gfx_fd, struct connector *c,
> +				unsigned int **sprite_plane_id)
>   {
>   	drmModePlaneRes *plane_resources;
>   	drmModePlane *ovr;
> -	uint32_t id = 0;
> -	int i;
> +	int i, sprite_plane_count = 0;
>   
>   	plane_resources = drmModeGetPlaneResources(gfx_fd);
>   	if (!plane_resources) {
> @@ -293,6 +293,12 @@ static int connector_find_plane(int gfx_fd, struct connector *c)
>   		return 0;
>   	}
>   
> +	/* Allocating buffer to hold sprite plane ids of the
> +         * current connector.
> +         */
> +	*sprite_plane_id = (unsigned int *) malloc(plane_resources->count_planes *
> +						   sizeof(unsigned int));
> +
>   	for (i = 0; i < plane_resources->count_planes; i++) {
>   		ovr = drmModeGetPlane(gfx_fd, plane_resources->planes[i]);
>   		if (!ovr) {
> @@ -300,16 +306,15 @@ static int connector_find_plane(int gfx_fd, struct connector *c)
>   				strerror(errno));
>   			continue;
>   		}
> -
> +		/* Add the available sprite id to the buffer sprite_plane_id.
> +                 */
>   		if (ovr->possible_crtcs & (1 << c->pipe)) {
> -			id = ovr->plane_id;
> -			drmModeFreePlane(ovr);
> -			break;
> +			(*sprite_plane_id)[sprite_plane_count++] = ovr->plane_id;
>   		}
>   		drmModeFreePlane(ovr);
>   	}
>   
> -	return id;
> +	return sprite_plane_count;
>   }
>   
>   static int prepare_primary_surface(int fd, int prim_width, int prim_height,
> @@ -479,8 +484,8 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   	const int                           num_surfaces = 3;
>   	uint32_t                            sprite_handles[num_surfaces];
>   	uint32_t                            sprite_fb_id[num_surfaces];
> -	int                                 sprite_x;
> -	int                                 sprite_y;
> +	int                                 *sprite_x = NULL;
> +	int                                 *sprite_y = NULL;
>   	uint32_t                            sprite_stride;
>   	uint32_t                            sprite_size;
>   	uint32_t                            handles[4],
> @@ -499,10 +504,10 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   					    curr_term;
>   	int                                 c_index;
>   	int                                 sprite_index;
> -	unsigned int                        sprite_plane_id;
> +	unsigned int                        *sprite_plane_id = NULL;
>   	uint32_t                            plane_flags = 0;
> -	int                                 delta_x,
> -					    delta_y;
> +	int                                 *delta_x = NULL,
> +					    *delta_y = NULL;
>   	struct timeval                      stTimeVal;
>   	long long                           currTime,
>   	     prevFlipTime,
> @@ -511,7 +516,8 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   	     deltaMoveTime,
>   	     SleepTime;
>   	char                                key;
> -
> +	int				    sprite_plane_count = 0;
> +	int 				    i;
>   	// Open up I915 graphics device
>   	gfx_fd = drmOpen("i915", NULL);
>   	if (gfx_fd < 0) {
> @@ -564,8 +570,9 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   
>   		// Determine if sprite hardware is available on pipe
>   		// associated with this connector.
> -		sprite_plane_id = connector_find_plane(gfx_fd, &curr_connector);
> -		if (!sprite_plane_id) {
> +		sprite_plane_count = connector_find_plane(gfx_fd, &curr_connector,
> +							  &sprite_plane_id);
> +		if (!sprite_plane_count) {
>   			printf("Failed to find sprite plane on crtc\n");
>   			goto out;
>   		}
> @@ -704,12 +711,15 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   		}
>   
>   		// Set the sprite colorkey state
> -		set.plane_id = sprite_plane_id;
> -		set.min_value = 0;
> -		set.max_value = 0;
> -		set.flags = I915_SET_COLORKEY_NONE;
> -		ret = drmCommandWrite(gfx_fd, DRM_I915_SET_SPRITE_COLORKEY, &set, sizeof(set));
> -		assert(ret == 0);
> +		for(i = 0; i < sprite_plane_count; i++) {
> +			set.plane_id = sprite_plane_id[i];
> +			set.min_value = 0;
> +			set.max_value = 0;
> +			set.flags = I915_SET_COLORKEY_NONE;
> +			ret = drmCommandWrite(gfx_fd, DRM_I915_SET_SPRITE_COLORKEY, &set,
> +					      sizeof(set));
> +			assert(ret == 0);
> +		}
>   
>   		// Set up sprite output dimensions, initial position, etc.
>   		if (out_w > prim_width / 2)
> @@ -717,10 +727,21 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   		if (out_h > prim_height / 2)
>   			out_h = prim_height / 2;
>   
> -		delta_x = 3;
> -		delta_y = 4;
> -		sprite_x = (prim_width / 2) - (out_w / 2);
> -		sprite_y = (prim_height / 2) - (out_h / 2);
> +		delta_x = (int *) malloc(sprite_plane_count * sizeof(int));
> +		delta_y = (int *) malloc(sprite_plane_count * sizeof(int));
> +		sprite_x = (int *) malloc(sprite_plane_count * sizeof(int));
> +		sprite_y = (int *) malloc(sprite_plane_count * sizeof(int));
> +
> +		/* Initializing the coordinates (x,y) of the available sprites on the
> +		 * connector, equally spaced along the diagonal of the rectangle
> +		 * {(0,0),(prim_width/2, prim_height/2)}.
> +		 */
> +		for(i = 0; i < sprite_plane_count; i++) {
> +			delta_x[i] = 3;
> +			delta_y[i] = 4;
> +			sprite_x[i] = i * (prim_width / (2 * sprite_plane_count));
> +			sprite_y[i] = i * (prim_height / (2 * sprite_plane_count));
> +		}
>   
>   		currTime = 0;
>   		prevFlipTime = 0;       // Will force immediate sprite flip
> @@ -748,38 +769,44 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   			// Move the sprite on the screen and flip
>   			// the surface if the index has changed
>   			// NB: sprite_w and sprite_h must be 16.16 fixed point, herego << 16
> -			if (drmModeSetPlane(gfx_fd, sprite_plane_id, curr_connector.crtc,
> -					    sprite_fb_id[sprite_index], plane_flags,
> -					    sprite_x, sprite_y,
> -					    out_w, out_h,
> -					    0, 0,
> -					    sprite_w << 16, sprite_h << 16))
> -				printf("Failed to enable sprite plane: %s\n", strerror(errno));
> +			for(i = 0; i < sprite_plane_count; i++) {
> +				if (drmModeSetPlane(gfx_fd, sprite_plane_id[i],
> +						    curr_connector.crtc,
> +						    sprite_fb_id[sprite_index],
> +						    plane_flags,
> +						    sprite_x[i], sprite_y[i],
> +						    out_w, out_h,
> +						    0, 0,
> +						    sprite_w << 16, sprite_h << 16))
> +					printf("Failed to enable sprite plane: %s\n",
> +						strerror(errno));
> +			}
>   
>   			// Check if it's time to move the sprite surface
>   			if (currTime - prevMoveTime > deltaMoveTime)  {
>   
>   				// Compute the next position for sprite
> -				sprite_x += delta_x;
> -				sprite_y += delta_y;
> -				if (sprite_x < 0) {
> -					sprite_x = 0;
> -					delta_x = -delta_x;
> -				}
> -				else if (sprite_x > prim_width - out_w) {
> -					sprite_x = prim_width - out_w;
> -					delta_x = -delta_x;
> -				}
> +				for(i = 0; i < sprite_plane_count; i++) {
> +					sprite_x[i] += delta_x[i];
> +					sprite_y[i] += delta_y[i];
> +					if (sprite_x[i] < 0) {
> +						sprite_x[i] = 0;
> +						delta_x[i] = -delta_x[i];
> +					}
> +					else if (sprite_x[i] > prim_width - out_w) {
> +						sprite_x[i] = prim_width - out_w;
> +						delta_x[i] = -delta_x[i];
> +					}
>   
> -				if (sprite_y < 0) {
> -					sprite_y = 0;
> -					delta_y = -delta_y;
> -				}
> -				else if (sprite_y > prim_height - out_h) {
> -					sprite_y = prim_height - out_h;
> -					delta_y = -delta_y;
> +					if (sprite_y[i] < 0) {
> +						sprite_y[i] = 0;
> +						delta_y[i] = -delta_y[i];
> +					}
> +					else if (sprite_y[i] > prim_height - out_h) {
> +						sprite_y[i] = prim_height - out_h;
> +						delta_y[i] = -delta_y[i];
> +					}
>   				}
> -
>   				prevMoveTime = currTime;
>   			}
>   
> @@ -829,6 +856,15 @@ static void ricochet(int tiled, int sprite_w, int sprite_h,
>   				deltaFlipTime : deltaMoveTime;
>   			usleep(SleepTime);
>   		}
> +
> +		free(sprite_plane_id);
> +		free(sprite_x);
> +		free(sprite_y);
> +		free(delta_x);
> +		free(delta_y);
> +		sprite_plane_id = NULL;
> +		sprite_plane_count = 0;
> +		sprite_x = sprite_y = delta_x = delta_y = NULL;
>   	}
>   
>   out:


[-- Attachment #1.2: Type: text/html, Size: 83609 bytes --]

[-- Attachment #2: Type: text/plain, Size: 159 bytes --]

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2014-10-07 18:28 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-09-12 19:56 [PATCH] demos/intel_sprite_on: Added support to display all sprites Gagandeep S Arora
2014-10-07 18:28 ` Arora, Gagandeep S [this message]
  -- strict thread matches above, loose matches on Subject: below --
2014-09-12 19:28 Gagandeep S Arora

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=543430C8.1080600@intel.com \
    --to=gagandeep.s.arora@intel.com \
    --cc=damien.lespiau@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=manikandan.k.pillai@intel.com \
    --cc=rodrigo.vivi@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.