The validation for it ends up being quite simple, but I hadn't got around to it before merging the driver. For backwards compatibility, we also need to add a flag so that the userspace GL driver can easily tell if the kernel will allow ETC1 textures (on an old kernel, it will continue to convert to RGBA8)
Unified · Split
| @@ -78,6 +78,7 @@ static int vc4_get_param_ioctl(struct drm_device *dev, void *data, · 77 unmodified lines | |||
| 78 | pm_runtime_put(&vc4->v3d->pdev->dev); | 78 | pm_runtime_put(&vc4->v3d->pdev->dev); |
| 79 | break; | 79 | break; |
| 80 | case DRM_VC4_PARAM_SUPPORTS_BRANCHES: | 80 | case DRM_VC4_PARAM_SUPPORTS_BRANCHES: |
| 81 | case DRM_VC4_PARAM_SUPPORTS_ETC1: | ||
| 81 | args->value = true; | 82 | args->value = true; |
| 82 | break; | 83 | break; |
| 83 | default: | 84 | default: |
| @@ -644,6 +644,13 @@ reloc_tex(struct vc4_exec_info *exec, · 643 unmodified lines | |||
| 644 | cpp = 1; | 644 | cpp = 1; |
| 645 | break; | 645 | break; |
| 646 | case VC4_TEXTURE_TYPE_ETC1: | 646 | case VC4_TEXTURE_TYPE_ETC1: |
| 647 | /* ETC1 is arranged as 64-bit blocks, where each block is 4x4 | ||
| 648 | * pixels. | ||
| 649 | */ | ||
| 650 | cpp = 8; | ||
| 651 | width = (width + 3) >> 2; | ||
| 652 | height = (height + 3) >> 2; | ||
| 653 | break; | ||
| 647 | case VC4_TEXTURE_TYPE_BW1: | 654 | case VC4_TEXTURE_TYPE_BW1: |
| 648 | case VC4_TEXTURE_TYPE_A4: | 655 | case VC4_TEXTURE_TYPE_A4: |
| 649 | case VC4_TEXTURE_TYPE_A1: | 656 | case VC4_TEXTURE_TYPE_A1: |
| @@ -286,6 +286,7 @@ struct drm_vc4_get_hang_state { · 285 unmodified lines | |||
| 286 | #define DRM_VC4_PARAM_V3D_IDENT1 1 | 286 | #define DRM_VC4_PARAM_V3D_IDENT1 1 |
| 287 | #define DRM_VC4_PARAM_V3D_IDENT2 2 | 287 | #define DRM_VC4_PARAM_V3D_IDENT2 2 |
| 288 | #define DRM_VC4_PARAM_SUPPORTS_BRANCHES 3 | 288 | #define DRM_VC4_PARAM_SUPPORTS_BRANCHES 3 |
| 289 | #define DRM_VC4_PARAM_SUPPORTS_ETC1 4 | ||
| 289 | 290 | ||
| 290 | struct drm_vc4_get_param { | 291 | struct drm_vc4_get_param { |
| 291 | __u32 param; | 292 | __u32 param; |