@@ -771,13 +771,45 @@ static void qxl_calc_dumb_shadow(struct qxl_device *qdev,
771
771
DRM_DEBUG ("%dx%d\n" , surf -> width , surf -> height );
772
772
}
773
773
774
+ static void qxl_prepare_shadow (struct qxl_device * qdev , struct qxl_bo * user_bo ,
775
+ int crtc_index )
776
+ {
777
+ struct qxl_surface surf ;
778
+
779
+ qxl_update_dumb_head (qdev , crtc_index ,
780
+ user_bo );
781
+ qxl_calc_dumb_shadow (qdev , & surf );
782
+ if (!qdev -> dumb_shadow_bo ||
783
+ qdev -> dumb_shadow_bo -> surf .width != surf .width ||
784
+ qdev -> dumb_shadow_bo -> surf .height != surf .height ) {
785
+ if (qdev -> dumb_shadow_bo ) {
786
+ drm_gem_object_put
787
+ (& qdev -> dumb_shadow_bo -> tbo .base );
788
+ qdev -> dumb_shadow_bo = NULL ;
789
+ }
790
+ qxl_bo_create (qdev , surf .height * surf .stride ,
791
+ true, true, QXL_GEM_DOMAIN_SURFACE , 0 ,
792
+ & surf , & qdev -> dumb_shadow_bo );
793
+ }
794
+ if (user_bo -> shadow != qdev -> dumb_shadow_bo ) {
795
+ if (user_bo -> shadow ) {
796
+ qxl_bo_unpin (user_bo -> shadow );
797
+ drm_gem_object_put
798
+ (& user_bo -> shadow -> tbo .base );
799
+ user_bo -> shadow = NULL ;
800
+ }
801
+ drm_gem_object_get (& qdev -> dumb_shadow_bo -> tbo .base );
802
+ user_bo -> shadow = qdev -> dumb_shadow_bo ;
803
+ qxl_bo_pin (user_bo -> shadow );
804
+ }
805
+ }
806
+
774
807
static int qxl_plane_prepare_fb (struct drm_plane * plane ,
775
808
struct drm_plane_state * new_state )
776
809
{
777
810
struct qxl_device * qdev = to_qxl (plane -> dev );
778
811
struct drm_gem_object * obj ;
779
812
struct qxl_bo * user_bo ;
780
- struct qxl_surface surf ;
781
813
782
814
if (!new_state -> fb )
783
815
return 0 ;
@@ -787,32 +819,7 @@ static int qxl_plane_prepare_fb(struct drm_plane *plane,
787
819
788
820
if (plane -> type == DRM_PLANE_TYPE_PRIMARY &&
789
821
user_bo -> is_dumb ) {
790
- qxl_update_dumb_head (qdev , new_state -> crtc -> index ,
791
- user_bo );
792
- qxl_calc_dumb_shadow (qdev , & surf );
793
- if (!qdev -> dumb_shadow_bo ||
794
- qdev -> dumb_shadow_bo -> surf .width != surf .width ||
795
- qdev -> dumb_shadow_bo -> surf .height != surf .height ) {
796
- if (qdev -> dumb_shadow_bo ) {
797
- drm_gem_object_put
798
- (& qdev -> dumb_shadow_bo -> tbo .base );
799
- qdev -> dumb_shadow_bo = NULL ;
800
- }
801
- qxl_bo_create (qdev , surf .height * surf .stride ,
802
- true, true, QXL_GEM_DOMAIN_SURFACE , 0 ,
803
- & surf , & qdev -> dumb_shadow_bo );
804
- }
805
- if (user_bo -> shadow != qdev -> dumb_shadow_bo ) {
806
- if (user_bo -> shadow ) {
807
- qxl_bo_unpin (user_bo -> shadow );
808
- drm_gem_object_put
809
- (& user_bo -> shadow -> tbo .base );
810
- user_bo -> shadow = NULL ;
811
- }
812
- drm_gem_object_get (& qdev -> dumb_shadow_bo -> tbo .base );
813
- user_bo -> shadow = qdev -> dumb_shadow_bo ;
814
- qxl_bo_pin (user_bo -> shadow );
815
- }
822
+ qxl_prepare_shadow (qdev , user_bo , new_state -> crtc -> index );
816
823
}
817
824
818
825
return qxl_bo_pin (user_bo );
0 commit comments