diff --git a/DrmHwcTwo.cpp b/DrmHwcTwo.cpp
index 7f5d639..0647cf1 100644
--- a/DrmHwcTwo.cpp
+++ b/DrmHwcTwo.cpp
@@ -865,19 +865,6 @@
   return HWC2::Error::None;
 }
 
-uint32_t DrmHwcTwo::HwcDisplay::CalcPixOps(
-    std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map, size_t first_z,
-    size_t size) {
-  uint32_t pixops = 0;
-  for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map) {
-    if (l.first >= first_z && l.first < first_z + size) {
-      hwc_rect_t df = l.second->display_frame();
-      pixops += (df.right - df.left) * (df.bottom - df.top);
-    }
-  }
-  return pixops;
-}
-
 void DrmHwcTwo::HwcDisplay::MarkValidated(
     std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map, size_t client_first_z,
     size_t client_size) {
diff --git a/DrmHwcTwo.h b/DrmHwcTwo.h
index 6c5431e..1a16dce 100644
--- a/DrmHwcTwo.h
+++ b/DrmHwcTwo.h
@@ -175,8 +175,6 @@
                                  hwc2_function_pointer_t func);
     HWC2::Error CreateComposition(bool test);
     bool HardwareSupportsLayerType(HWC2::Composition comp_type);
-    uint32_t CalcPixOps(std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map,
-                        size_t first_z, size_t size);
     void MarkValidated(std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map,
                        size_t client_first_z, size_t client_size);
 
diff --git a/backend/Backend.cpp b/backend/Backend.cpp
index 9e9e2b9..80b22d4 100644
--- a/backend/Backend.cpp
+++ b/backend/Backend.cpp
@@ -49,7 +49,7 @@
   for (std::pair<const uint32_t, DrmHwcTwo::HwcLayer *> &l : z_map_tmp)
     z_map.emplace(std::make_pair(z_index++, l.second));
 
-  uint32_t total_pixops = display->CalcPixOps(z_map, 0, z_map.size());
+  uint32_t total_pixops = CalcPixOps(z_map, 0, z_map.size());
   uint32_t gpu_pixops = 0;
 
   int client_start = -1;
@@ -82,7 +82,7 @@
 
       gpu_pixops = INT_MAX;
       for (int i = 0; i < steps; i++) {
-        uint32_t po = display->CalcPixOps(z_map, start + i, client_size);
+        uint32_t po = CalcPixOps(z_map, start + i, client_size);
         if (po < gpu_pixops) {
           gpu_pixops = po;
           client_start = start + i;
@@ -139,6 +139,18 @@
           display->resource_manager()->ForcedScalingWithGpu());
 }
 
+uint32_t Backend::CalcPixOps(const std::vector<DrmHwcTwo::HwcLayer *> &layers,
+                             size_t first_z, size_t size) {
+  uint32_t pixops = 0;
+  for (auto & [ z_order, layer ] : z_map) {
+    if (z_order >= first_z && z_order < first_z + size) {
+      hwc_rect_t df = layer->display_frame();
+      pixops += (df.right - df.left) * (df.bottom - df.top);
+    }
+  }
+  return pixops;
+}
+
 // clang-format off
 // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables, cert-err58-cpp)
 REGISTER_BACKEND("generic", Backend);
diff --git a/backend/Backend.h b/backend/Backend.h
index 2725809..8658efa 100644
--- a/backend/Backend.h
+++ b/backend/Backend.h
@@ -32,6 +32,10 @@
       const std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map);
   virtual bool IsClientLayer(DrmHwcTwo::HwcDisplay *display,
                              DrmHwcTwo::HwcLayer *layer);
+
+ protected:
+  uint32_t CalcPixOps(const std::map<uint32_t, DrmHwcTwo::HwcLayer *> &z_map,
+                      size_t first_z, size_t size);
 };
 }  // namespace android
 
