diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_frontbuffer.h')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_frontbuffer.h | 70 | 
1 files changed, 48 insertions, 22 deletions
diff --git a/drivers/gpu/drm/i915/display/intel_frontbuffer.h b/drivers/gpu/drm/i915/display/intel_frontbuffer.h index 5727320c8084..adc64d61a4a5 100644 --- a/drivers/gpu/drm/i915/display/intel_frontbuffer.h +++ b/drivers/gpu/drm/i915/display/intel_frontbuffer.h @@ -24,7 +24,10 @@  #ifndef __INTEL_FRONTBUFFER_H__  #define __INTEL_FRONTBUFFER_H__ -#include "gem/i915_gem_object.h" +#include <linux/atomic.h> +#include <linux/kref.h> + +#include "i915_active.h"  struct drm_i915_private;  struct drm_i915_gem_object; @@ -37,23 +40,30 @@ enum fb_op_origin {  	ORIGIN_DIRTYFB,  }; -void intel_frontbuffer_flip_prepare(struct drm_i915_private *dev_priv, +struct intel_frontbuffer { +	struct kref ref; +	atomic_t bits; +	struct i915_active write; +	struct drm_i915_gem_object *obj; +}; + +void intel_frontbuffer_flip_prepare(struct drm_i915_private *i915,  				    unsigned frontbuffer_bits); -void intel_frontbuffer_flip_complete(struct drm_i915_private *dev_priv, +void intel_frontbuffer_flip_complete(struct drm_i915_private *i915,  				     unsigned frontbuffer_bits); -void intel_frontbuffer_flip(struct drm_i915_private *dev_priv, +void intel_frontbuffer_flip(struct drm_i915_private *i915,  			    unsigned frontbuffer_bits); -void __intel_fb_obj_invalidate(struct drm_i915_gem_object *obj, -			       enum fb_op_origin origin, -			       unsigned int frontbuffer_bits); -void __intel_fb_obj_flush(struct drm_i915_gem_object *obj, -			  enum fb_op_origin origin, -			  unsigned int frontbuffer_bits); +struct intel_frontbuffer * +intel_frontbuffer_get(struct drm_i915_gem_object *obj); + +void __intel_fb_invalidate(struct intel_frontbuffer *front, +			   enum fb_op_origin origin, +			   unsigned int frontbuffer_bits);  /** - * intel_fb_obj_invalidate - invalidate frontbuffer object - * @obj: GEM object to invalidate + * intel_frontbuffer_invalidate - invalidate frontbuffer object + * @front: GEM object to invalidate   * @origin: which operation caused the invalidation   *   * This function gets called every time rendering on the given object starts and @@ -62,37 +72,53 @@ void __intel_fb_obj_flush(struct drm_i915_gem_object *obj,   * until the rendering completes or a flip on this frontbuffer plane is   * scheduled.   */ -static inline bool intel_fb_obj_invalidate(struct drm_i915_gem_object *obj, -					   enum fb_op_origin origin) +static inline bool intel_frontbuffer_invalidate(struct intel_frontbuffer *front, +						enum fb_op_origin origin)  {  	unsigned int frontbuffer_bits; -	frontbuffer_bits = atomic_read(&obj->frontbuffer_bits); +	if (!front) +		return false; + +	frontbuffer_bits = atomic_read(&front->bits);  	if (!frontbuffer_bits)  		return false; -	__intel_fb_obj_invalidate(obj, origin, frontbuffer_bits); +	__intel_fb_invalidate(front, origin, frontbuffer_bits);  	return true;  } +void __intel_fb_flush(struct intel_frontbuffer *front, +		      enum fb_op_origin origin, +		      unsigned int frontbuffer_bits); +  /** - * intel_fb_obj_flush - flush frontbuffer object - * @obj: GEM object to flush + * intel_frontbuffer_flush - flush frontbuffer object + * @front: GEM object to flush   * @origin: which operation caused the flush   *   * This function gets called every time rendering on the given object has   * completed and frontbuffer caching can be started again.   */ -static inline void intel_fb_obj_flush(struct drm_i915_gem_object *obj, -				      enum fb_op_origin origin) +static inline void intel_frontbuffer_flush(struct intel_frontbuffer *front, +					   enum fb_op_origin origin)  {  	unsigned int frontbuffer_bits; -	frontbuffer_bits = atomic_read(&obj->frontbuffer_bits); +	if (!front) +		return; + +	frontbuffer_bits = atomic_read(&front->bits);  	if (!frontbuffer_bits)  		return; -	__intel_fb_obj_flush(obj, origin, frontbuffer_bits); +	__intel_fb_flush(front, origin, frontbuffer_bits);  } +void intel_frontbuffer_track(struct intel_frontbuffer *old, +			     struct intel_frontbuffer *new, +			     unsigned int frontbuffer_bits); + +void intel_frontbuffer_put(struct intel_frontbuffer *front); +  #endif /* __INTEL_FRONTBUFFER_H__ */  |