diff --git a/native/android/surface_control.cpp b/native/android/surface_control.cpp
index 93a5444..693a027 100644
--- a/native/android/surface_control.cpp
+++ b/native/android/surface_control.cpp
@@ -44,70 +44,14 @@
     LOG_ALWAYS_FATAL_IF(!static_cast<const Rect&>(name).isValid(), \
                         "invalid arg passed as " #name " argument");
 
-static bool getWideColorSupport(const sp<SurfaceControl>& surfaceControl) {
-    sp<SurfaceComposerClient> client = surfaceControl->getClient();
-
-    const sp<IBinder> display = client->getInternalDisplayToken();
-    if (display == nullptr) {
-        ALOGE("unable to get wide color support for disconnected internal display");
-        return false;
-    }
-
-    bool isWideColorDisplay = false;
-    status_t err = client->isWideColorDisplay(display, &isWideColorDisplay);
-    if (err) {
-        ALOGE("unable to get wide color support");
-        return false;
-    }
-    return isWideColorDisplay;
-}
-
-static bool getHdrSupport(const sp<SurfaceControl>& surfaceControl) {
-    sp<SurfaceComposerClient> client = surfaceControl->getClient();
-
-    const sp<IBinder> display = client->getInternalDisplayToken();
-    if (display == nullptr) {
-        ALOGE("unable to get hdr capabilities for disconnected internal display");
-        return false;
-    }
-
-    ui::DynamicDisplayInfo info;
-    if (status_t err = client->getDynamicDisplayInfo(display, &info); err != NO_ERROR) {
-        ALOGE("unable to get hdr capabilities");
-        return err;
-    }
-
-    return !info.hdrCapabilities.getSupportedHdrTypes().empty();
-}
-
-static bool isDataSpaceValid(const sp<SurfaceControl>& surfaceControl, ADataSpace dataSpace) {
-    static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
-    static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) == static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
-    static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
-    static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
-    static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) == static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
-    static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
-
-    switch (static_cast<android_dataspace_t>(dataSpace)) {
-        case HAL_DATASPACE_UNKNOWN:
-        case HAL_DATASPACE_V0_SRGB:
-            return true;
-        // These data space need wide gamut support.
-        case HAL_DATASPACE_V0_SCRGB_LINEAR:
-        case HAL_DATASPACE_V0_SCRGB:
-        case HAL_DATASPACE_DISPLAY_P3:
-            return getWideColorSupport(surfaceControl);
-        // These data space need HDR support.
-        case HAL_DATASPACE_BT2020_PQ:
-            if (!getHdrSupport(surfaceControl)) {
-                ALOGE("Invalid dataspace - device does not support hdr");
-                return false;
-            }
-            return true;
-        default:
-            return false;
-    }
-}
+static_assert(static_cast<int>(ADATASPACE_UNKNOWN) == static_cast<int>(HAL_DATASPACE_UNKNOWN));
+static_assert(static_cast<int>(ADATASPACE_SCRGB_LINEAR) ==
+              static_cast<int>(HAL_DATASPACE_V0_SCRGB_LINEAR));
+static_assert(static_cast<int>(ADATASPACE_SRGB) == static_cast<int>(HAL_DATASPACE_V0_SRGB));
+static_assert(static_cast<int>(ADATASPACE_SCRGB) == static_cast<int>(HAL_DATASPACE_V0_SCRGB));
+static_assert(static_cast<int>(ADATASPACE_DISPLAY_P3) ==
+              static_cast<int>(HAL_DATASPACE_DISPLAY_P3));
+static_assert(static_cast<int>(ADATASPACE_BT2020_PQ) == static_cast<int>(HAL_DATASPACE_BT2020_PQ));
 
 Transaction* ASurfaceTransaction_to_Transaction(ASurfaceTransaction* aSurfaceTransaction) {
     return reinterpret_cast<Transaction*>(aSurfaceTransaction);
@@ -580,10 +524,6 @@
     CHECK_NOT_NULL(aSurfaceControl);
 
     sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
-    if (!isDataSpaceValid(surfaceControl, aDataSpace)) {
-        ALOGE("Failed to set buffer dataspace - invalid dataspace");
-        return;
-    }
     Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
     transaction->setDataspace(surfaceControl, static_cast<ui::Dataspace>(aDataSpace));
 }
@@ -650,10 +590,6 @@
     CHECK_NOT_NULL(aSurfaceControl);
 
     sp<SurfaceControl> surfaceControl = ASurfaceControl_to_SurfaceControl(aSurfaceControl);
-    if (!isDataSpaceValid(surfaceControl, dataspace)) {
-        ALOGE("Failed to set buffer dataspace - invalid dataspace");
-        return;
-    }
     Transaction* transaction = ASurfaceTransaction_to_Transaction(aSurfaceTransaction);
 
     half3 color;
