i965/gen7: Enable HiZ
[mesa.git] / src / mesa / drivers / dri / intel / intel_screen.c
index f67bef95566eab5d8c9dd7302e70dab71576e0b5..ce96ddda85cbe48116a32ec997c043a49885d7aa 100644 (file)
@@ -33,6 +33,8 @@
 #include "main/hash.h"
 #include "main/fbobject.h"
 #include "main/mfeatures.h"
+#include "main/version.h"
+#include "swrast/s_renderbuffer.h"
 
 #include "utils.h"
 #include "xmlpool.h"
@@ -470,13 +472,13 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,
       }
 
       /* now add any/all software-based renderbuffers we may need */
-      _mesa_add_soft_renderbuffers(fb,
-                                   false, /* never sw color */
-                                   false, /* never sw depth */
-                                   false, /* never sw stencil */
-                                   mesaVis->accumRedBits > 0,
-                                   false, /* never sw alpha */
-                                   false  /* never sw aux */ );
+      _swrast_add_soft_renderbuffers(fb,
+                                     false, /* never sw color */
+                                     false, /* never sw depth */
+                                     false, /* never sw stencil */
+                                     mesaVis->accumRedBits > 0,
+                                     false, /* never sw alpha */
+                                     false  /* never sw aux */ );
       driDrawPriv->driverPrivate = fb;
 
       return true;
@@ -515,27 +517,52 @@ static GLboolean
 intelCreateContext(gl_api api,
                   const struct gl_config * mesaVis,
                    __DRIcontext * driContextPriv,
+                  unsigned major_version,
+                  unsigned minor_version,
+                  uint32_t flags,
+                  unsigned *error,
                    void *sharedContextPrivate)
 {
    __DRIscreen *sPriv = driContextPriv->driScreenPriv;
    struct intel_screen *intelScreen = sPriv->driverPrivate;
+   bool success;
 
 #ifdef I915
    if (IS_9XX(intelScreen->deviceID)) {
       if (!IS_965(intelScreen->deviceID)) {
-        return i915CreateContext(api, mesaVis, driContextPriv,
-                                 sharedContextPrivate);
+        success = i915CreateContext(api, mesaVis, driContextPriv,
+                                    sharedContextPrivate);
       }
    } else {
       intelScreen->no_vbo = true;
-      return i830CreateContext(mesaVis, driContextPriv, sharedContextPrivate);
+      success = i830CreateContext(mesaVis, driContextPriv,
+                                 sharedContextPrivate);
    }
 #else
    if (IS_965(intelScreen->deviceID))
-      return brwCreateContext(api, mesaVis,
-                             driContextPriv, sharedContextPrivate);
+      success = brwCreateContext(api, mesaVis,
+                             driContextPriv,
+                             sharedContextPrivate);
 #endif
-   fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID);
+
+   if (success) {
+      struct gl_context *ctx =
+        (struct gl_context *) driContextPriv->driverPrivate;
+
+      _mesa_compute_version(ctx);
+      if (ctx->VersionMajor > major_version
+         || (ctx->VersionMajor == major_version
+             && ctx->VersionMinor >= minor_version)) {
+        *error = __DRI_CTX_ERROR_BAD_VERSION;
+        return true;
+      }
+
+      intelDestroyContext(driContextPriv);
+   } else {
+      *error = __DRI_CTX_ERROR_NO_MEMORY;
+      fprintf(stderr, "Unrecognized deviceID 0x%x\n", intelScreen->deviceID);
+   }
+
    return false;
 }
 
@@ -670,6 +697,10 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
       intelScreen->deviceID = strtod(devid_override, NULL);
    }
 
+   intelScreen->kernel_has_gen7_sol_reset =
+      intel_get_boolean(intelScreen->driScrnPriv,
+                       I915_PARAM_HAS_GEN7_SOL_RESET);
+
    if (IS_GEN7(intelScreen->deviceID)) {
       intelScreen->gen = 7;
    } else if (IS_GEN6(intelScreen->deviceID)) {
@@ -686,7 +717,7 @@ __DRIconfig **intelInitScreen2(__DRIscreen *psp)
 
    intelScreen->hw_has_separate_stencil = intelScreen->gen >= 6;
    intelScreen->hw_must_use_separate_stencil = intelScreen->gen >= 7;
-   intelScreen->hw_has_hiz = intelScreen->gen == 6; /* Not yet for gen7. */
+   intelScreen->hw_has_hiz = intelScreen->gen >= 6;
    intelScreen->dri2_has_hiz = INTEL_DRI2_HAS_HIZ_UNKNOWN;
 
    intel_override_hiz(intelScreen);