v3d: request the kernel to flush caches when TMU is dirty
[mesa.git] / src / gallium / drivers / v3d / v3d_screen.c
index 957420a5311b7886fc41ded015d53fcbe11f7061..2d63a43e2ddd3c152aa6c888eeca839f5e222373 100644 (file)
@@ -175,7 +175,10 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                 return 4;
 
         case PIPE_CAP_SHADER_BUFFER_OFFSET_ALIGNMENT:
-                return 4;
+                if (screen->has_cache_flush)
+                        return 4;
+                else
+                        return 0; /* Disables shader storage */
 
         case PIPE_CAP_GLSL_FEATURE_LEVEL:
                 return 330;
@@ -356,16 +359,24 @@ v3d_screen_get_shader_param(struct pipe_screen *pscreen, unsigned shader,
                 return V3D_MAX_TEXTURE_SAMPLERS;
 
         case PIPE_SHADER_CAP_MAX_SHADER_BUFFERS:
-                if (shader == PIPE_SHADER_VERTEX)
-                        return 0;
+                if (screen->has_cache_flush) {
+                        if (shader == PIPE_SHADER_VERTEX)
+                                return 0;
 
-                return PIPE_MAX_SHADER_BUFFERS;
+                        return PIPE_MAX_SHADER_BUFFERS;
+                 } else {
+                        return 0;
+                 }
 
         case PIPE_SHADER_CAP_MAX_SHADER_IMAGES:
-                if (screen->devinfo.ver < 41)
+                if (screen->has_cache_flush) {
+                        if (screen->devinfo.ver < 41)
+                                return 0;
+                        else
+                                return PIPE_MAX_SHADER_IMAGES;
+                } else {
                         return 0;
-                else
-                        return PIPE_MAX_SHADER_IMAGES;
+                }
 
         case PIPE_SHADER_CAP_PREFERRED_IR:
                 return PIPE_SHADER_IR_NIR;
@@ -670,6 +681,8 @@ v3d_screen_create(int fd, const struct pipe_screen_config *config,
         slab_create_parent(&screen->transfer_pool, sizeof(struct v3d_transfer), 16);
 
         screen->has_csd = v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_CSD);
+        screen->has_cache_flush =
+                v3d_has_feature(screen, DRM_V3D_PARAM_SUPPORTS_CACHE_FLUSH);
 
         v3d_fence_init(screen);