i965/fs: Add support for translating ir_triop_fma into MAD.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_context.c
index d170b24b76c2fa5b0c6efd14a0e3c0c5ce1421a0..23210761d4312da960586dd9644fc5d1a1f87eff 100644 (file)
@@ -62,11 +62,11 @@ static size_t
 brw_query_samples_for_format(struct gl_context *ctx, GLenum target,
                              GLenum internalFormat, int samples[16])
 {
-   struct intel_context *intel = intel_context(ctx);
+   struct brw_context *brw = brw_context(ctx);
 
    (void) target;
 
-   switch (intel->gen) {
+   switch (brw->gen) {
    case 7:
       samples[0] = 8;
       samples[1] = 4;
@@ -111,8 +111,7 @@ static void brwInitDriverFunctions(struct intel_screen *screen,
 static void
 brw_initialize_context_constants(struct brw_context *brw)
 {
-   struct intel_context *intel = &brw->intel;
-   struct gl_context *ctx = &intel->ctx;
+   struct gl_context *ctx = &brw->ctx;
 
    ctx->Const.QueryCounterBits.Timestamp = 36;
 
@@ -136,7 +135,7 @@ brw_initialize_context_constants(struct brw_context *brw)
    ctx->Const.Max3DTextureLevels = 9;
    ctx->Const.MaxCubeTextureLevels = 12;
 
-   if (intel->gen >= 7)
+   if (brw->gen >= 7)
       ctx->Const.MaxArrayTextureLayers = 2048;
    else
       ctx->Const.MaxArrayTextureLayers = 512;
@@ -167,12 +166,12 @@ brw_initialize_context_constants(struct brw_context *brw)
    ctx->Const.MaxTransformFeedbackSeparateComponents =
       BRW_MAX_SOL_BINDINGS / BRW_MAX_SOL_BUFFERS;
 
-   if (intel->gen == 6) {
+   if (brw->gen == 6) {
       ctx->Const.MaxSamples = 4;
       ctx->Const.MaxColorTextureSamples = 4;
       ctx->Const.MaxDepthTextureSamples = 4;
       ctx->Const.MaxIntegerSamples = 4;
-   } else if (intel->gen >= 7) {
+   } else if (brw->gen >= 7) {
       ctx->Const.MaxSamples = 8;
       ctx->Const.MaxColorTextureSamples = 8;
       ctx->Const.MaxDepthTextureSamples = 8;
@@ -191,7 +190,7 @@ brw_initialize_context_constants(struct brw_context *brw)
    ctx->Const.MaxPointSizeAA = 255.0;
    ctx->Const.PointSizeGranularity = 1.0;
 
-   if (intel->gen >= 6)
+   if (brw->gen >= 5 || brw->is_g4x)
       ctx->Const.MaxClipPlanes = 8;
 
    ctx->Const.VertexProgram.MaxNativeInstructions = 16 * 1024;
@@ -235,7 +234,7 @@ brw_initialize_context_constants(struct brw_context *brw)
     * that affect provoking vertex decision. Always use last vertex
     * convention for quad primitive which works as expected for now.
     */
-   if (intel->gen >= 6)
+   if (brw->gen >= 6)
       ctx->Const.QuadsFollowProvokingVertexConvention = false;
 
    ctx->Const.NativeIntegers = true;
@@ -249,8 +248,8 @@ brw_initialize_context_constants(struct brw_context *brw)
       driQueryOptionb(&brw->optionCache, "disable_glsl_line_continuations");
 
    /* We want the GLSL compiler to emit code that uses condition codes */
-   for (int i = 0; i <= MESA_SHADER_FRAGMENT; i++) {
-      ctx->ShaderCompilerOptions[i].MaxIfDepth = intel->gen < 6 ? 16 : UINT_MAX;
+   for (int i = 0; i < MESA_SHADER_TYPES; i++) {
+      ctx->ShaderCompilerOptions[i].MaxIfDepth = brw->gen < 6 ? 16 : UINT_MAX;
       ctx->ShaderCompilerOptions[i].EmitCondCodes = true;
       ctx->ShaderCompilerOptions[i].EmitNoNoise = true;
       ctx->ShaderCompilerOptions[i].EmitNoMainReturn = true;
@@ -291,14 +290,13 @@ brwCreateContext(int api,
    /* brwInitVtbl needs to know the chipset generation so that it can set the
     * right pointers.
     */
-   brw->intel.gen = screen->gen;
+   brw->gen = screen->gen;
 
    brwInitVtbl( brw );
 
    brwInitDriverFunctions(screen, &functions);
 
-   struct intel_context *intel = &brw->intel;
-   struct gl_context *ctx = &intel->ctx;
+   struct gl_context *ctx = &brw->ctx;
 
    if (!intelInitContext( brw, api, major_version, minor_version,
                           mesaVis, driContextPriv,
@@ -313,7 +311,7 @@ brwCreateContext(int api,
    /* Reinitialize the context point state.  It depends on ctx->Const values. */
    _mesa_init_point(ctx);
 
-   if (intel->gen >= 6) {
+   if (brw->gen >= 6) {
       /* Create a new hardware context.  Using a hardware context means that
        * our GPU state will be saved/restored on context switch, allowing us
        * to assume that the GPU is in the same state we left it in.
@@ -341,11 +339,11 @@ brwCreateContext(int api,
    ctx->DriverFlags.NewRasterizerDiscard = BRW_NEW_RASTERIZER_DISCARD;
    ctx->DriverFlags.NewUniformBuffer = BRW_NEW_UNIFORM_BUFFER;
 
-   if (intel->is_g4x || intel->gen >= 5) {
+   if (brw->is_g4x || brw->gen >= 5) {
       brw->CMD_VF_STATISTICS = GM45_3DSTATE_VF_STATISTICS;
       brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_GM45;
       brw->has_surface_tile_offset = true;
-      if (intel->gen < 6)
+      if (brw->gen < 6)
          brw->has_compr4 = true;
       brw->has_aa_line_parameters = true;
       brw->has_pln = true;
@@ -355,37 +353,40 @@ brwCreateContext(int api,
    }
 
    /* WM maximum threads is number of EUs times number of threads per EU. */
-   assert(intel->gen <= 7);
+   assert(brw->gen <= 7);
 
-   if (intel->is_haswell) {
-      if (intel->gt == 1) {
+   if (brw->is_haswell) {
+      if (brw->gt == 1) {
         brw->max_wm_threads = 102;
         brw->max_vs_threads = 70;
+        brw->max_gs_threads = 70;
         brw->urb.size = 128;
         brw->urb.max_vs_entries = 640;
         brw->urb.max_gs_entries = 256;
-      } else if (intel->gt == 2) {
+      } else if (brw->gt == 2) {
         brw->max_wm_threads = 204;
         brw->max_vs_threads = 280;
+        brw->max_gs_threads = 256;
         brw->urb.size = 256;
         brw->urb.max_vs_entries = 1664;
         brw->urb.max_gs_entries = 640;
-      } else if (intel->gt == 3) {
+      } else if (brw->gt == 3) {
         brw->max_wm_threads = 408;
         brw->max_vs_threads = 280;
+        brw->max_gs_threads = 256;
         brw->urb.size = 512;
         brw->urb.max_vs_entries = 1664;
         brw->urb.max_gs_entries = 640;
       }
-   } else if (intel->gen == 7) {
-      if (intel->gt == 1) {
+   } else if (brw->gen == 7) {
+      if (brw->gt == 1) {
         brw->max_wm_threads = 48;
         brw->max_vs_threads = 36;
         brw->max_gs_threads = 36;
         brw->urb.size = 128;
         brw->urb.max_vs_entries = 512;
         brw->urb.max_gs_entries = 192;
-      } else if (intel->gt == 2) {
+      } else if (brw->gt == 2) {
         brw->max_wm_threads = 172;
         brw->max_vs_threads = 128;
         brw->max_gs_threads = 128;
@@ -395,8 +396,8 @@ brwCreateContext(int api,
       } else {
         assert(!"Unknown gen7 device.");
       }
-   } else if (intel->gen == 6) {
-      if (intel->gt == 2) {
+   } else if (brw->gen == 6) {
+      if (brw->gt == 2) {
         brw->max_wm_threads = 80;
         brw->max_vs_threads = 60;
         brw->max_gs_threads = 60;
@@ -412,17 +413,17 @@ brwCreateContext(int api,
         brw->urb.max_gs_entries = 256;
       }
       brw->urb.gen6_gs_previously_active = false;
-   } else if (intel->gen == 5) {
+   } else if (brw->gen == 5) {
       brw->urb.size = 1024;
       brw->max_vs_threads = 72;
       brw->max_gs_threads = 32;
       brw->max_wm_threads = 12 * 6;
-   } else if (intel->is_g4x) {
+   } else if (brw->is_g4x) {
       brw->urb.size = 384;
       brw->max_vs_threads = 32;
       brw->max_gs_threads = 2;
       brw->max_wm_threads = 10 * 5;
-   } else if (intel->gen < 6) {
+   } else if (brw->gen < 6) {
       brw->urb.size = 256;
       brw->max_vs_threads = 16;
       brw->max_gs_threads = 2;
@@ -430,7 +431,7 @@ brwCreateContext(int api,
       brw->has_negative_rhw_bug = true;
    }
 
-   if (intel->gen <= 7) {
+   if (brw->gen <= 7) {
       brw->needs_unlit_centroid_workaround = true;
    }
 
@@ -439,15 +440,22 @@ brwCreateContext(int api,
 
    brw_init_state( brw );
 
-   brw->curbe.last_buf = calloc(1, 4096);
-   brw->curbe.next_buf = calloc(1, 4096);
+   if (brw->gen < 6) {
+      brw->curbe.last_buf = calloc(1, 4096);
+      brw->curbe.next_buf = calloc(1, 4096);
+   }
 
    brw->state.dirty.mesa = ~0;
    brw->state.dirty.brw = ~0;
 
+   /* Make sure that brw->state.dirty.brw has enough bits to hold all possible
+    * dirty flags.
+    */
+   STATIC_ASSERT(BRW_NUM_STATE_BITS <= 8 * sizeof(brw->state.dirty.brw));
+
    brw->emit_state_always = 0;
 
-   intel->batch.need_workaround_flush = true;
+   brw->batch.need_workaround_flush = true;
 
    ctx->VertexProgram._MaintainTnlProgram = true;
    ctx->FragmentProgram._MaintainTexEnvProgram = true;
@@ -464,10 +472,11 @@ brwCreateContext(int api,
       ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_DEBUG_BIT;
 
       /* Turn on some extra GL_ARB_debug_output generation. */
-      intel->perf_debug = true;
+      brw->perf_debug = true;
    }
 
    brw_fs_alloc_reg_sets(brw);
+   brw_vec4_alloc_reg_set(brw);
 
    if (INTEL_DEBUG & DEBUG_SHADER_TIME)
       brw_init_shader_time(brw);