i965/fs: Lower 32x32 bit multiplication on BXT.
[mesa.git] / src / mesa / drivers / dri / i965 / brw_meta_stencil_blit.c
index 61f6f51ac984217443185942622c41df81db817d..aa6df16eb046ef85beeb8a468c7d367d32a6a6f8 100644 (file)
@@ -57,7 +57,7 @@
 #include "main/blend.h"
 #include "main/varray.h"
 #include "main/shaderapi.h"
-#include "glsl/ralloc.h"
+#include "util/ralloc.h"
 
 #include "drivers/common/meta.h"
 #include "brw_meta_util.h"
@@ -239,10 +239,10 @@ setup_coord_coeff(GLuint prog, GLuint multiplier, GLuint offset,
 
    if (mirror) {
       _mesa_Uniform1f(multiplier, -scale);
-      _mesa_Uniform1f(offset, src_0 + (dst_1 - 0.5) * scale);
+      _mesa_Uniform1f(offset, src_0 + (dst_1 - 0.5f) * scale);
    } else {
       _mesa_Uniform1f(multiplier, scale);
-      _mesa_Uniform1f(offset, src_0 + (-dst_0 + 0.5) * scale);
+      _mesa_Uniform1f(offset, src_0 + (-dst_0 + 0.5f) * scale);
    }
 }
 
@@ -272,28 +272,30 @@ setup_coord_transform(GLuint prog, const struct blit_dims *dims)
 }
 
 static GLuint
-setup_program(struct gl_context *ctx, bool msaa_tex)
+setup_program(struct brw_context *brw, bool msaa_tex)
 {
+   struct gl_context *ctx = &brw->ctx;
    struct blit_state *blit = &ctx->Meta->Blit;
-   static GLuint prog_cache[] = { 0, 0 };
    char *fs_source;
    const struct sampler_and_fetch *sampler = &samplers[msaa_tex];
 
    _mesa_meta_setup_vertex_objects(&blit->VAO, &blit->VBO, true, 2, 2, 0);
 
-   if (prog_cache[msaa_tex]) {
-      _mesa_UseProgram(prog_cache[msaa_tex]);
-      return prog_cache[msaa_tex];
+   GLuint *prog_id = &brw->meta_stencil_blit_programs[msaa_tex];
+
+   if (*prog_id) {
+      _mesa_UseProgram(*prog_id);
+      return *prog_id;
    }
   
    fs_source = ralloc_asprintf(NULL, fs_tmpl, sampler->sampler,
                                sampler->fetch);
    _mesa_meta_compile_and_link_program(ctx, vs_source, fs_source,
                                        "i965 stencil blit",
-                                       &prog_cache[msaa_tex]);
+                                       prog_id);
    ralloc_free(fs_source);
 
-   return prog_cache[msaa_tex];
+   return *prog_id;
 }
 
 /**
@@ -369,7 +371,7 @@ prepare_vertex_data(void)
    _mesa_BufferSubData(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts);
 }
 
-static void
+static bool
 set_read_rb_tex_image(struct gl_context *ctx, struct fb_tex_blit_state *blit,
                       GLenum *target)
 {
@@ -385,14 +387,18 @@ set_read_rb_tex_image(struct gl_context *ctx, struct fb_tex_blit_state *blit,
       *target = tex_obj->Target;
       level = att->TextureLevel;
    } else {
-      _mesa_meta_bind_rb_as_tex_image(ctx, rb, &blit->tempTex, &tex_obj,
-                                      target);
+      if (!_mesa_meta_bind_rb_as_tex_image(ctx, rb, &blit->tempTex, &tex_obj,
+                                          target)) {
+         return false;
+      }
    }
 
    blit->baseLevelSave = tex_obj->BaseLevel;
    blit->maxLevelSave = tex_obj->MaxLevel;
+   blit->stencilSamplingSave = tex_obj->StencilSampling;
    blit->sampler = _mesa_meta_setup_sampler(ctx, tex_obj, *target,
                                             GL_NEAREST, level);
+   return true;
 }
 
 static void
@@ -408,6 +414,12 @@ brw_meta_stencil_blit(struct brw_context *brw,
    GLenum target;
 
    _mesa_meta_fb_tex_blit_begin(ctx, &blit);
+   /* XXX: Pretend to support stencil textures so _mesa_base_tex_format()
+    * returns a valid format.  When we properly support the extension, we
+    * should remove this.
+    */
+   assert(ctx->Extensions.ARB_texture_stencil8 == false);
+   ctx->Extensions.ARB_texture_stencil8 = true;
 
    _mesa_GenFramebuffers(1, &fbo);
    /* Force the surface to be configured for level zero. */
@@ -421,12 +433,14 @@ brw_meta_stencil_blit(struct brw_context *brw,
    _mesa_DrawBuffer(GL_COLOR_ATTACHMENT0);
    ctx->DrawBuffer->_Status = GL_FRAMEBUFFER_COMPLETE;
 
-   set_read_rb_tex_image(ctx, &blit, &target);
+   if (!set_read_rb_tex_image(ctx, &blit, &target)) {
+      goto error;
+   }
 
    _mesa_TexParameteri(target, GL_DEPTH_STENCIL_TEXTURE_MODE,
                        GL_STENCIL_INDEX);
 
-   prog = setup_program(ctx, target != GL_TEXTURE_2D);
+   prog = setup_program(brw, target != GL_TEXTURE_2D);
    setup_bounding_rect(prog, orig_dims);
    setup_drawing_rect(prog, &dims);
    setup_coord_transform(prog, orig_dims);
@@ -442,6 +456,8 @@ brw_meta_stencil_blit(struct brw_context *brw,
 
    _mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
 
+error:
+   ctx->Extensions.ARB_texture_stencil8 = false;
    _mesa_meta_fb_tex_blit_end(ctx, target, &blit);
    _mesa_meta_end(ctx);
 
@@ -451,15 +467,17 @@ brw_meta_stencil_blit(struct brw_context *brw,
 
 void
 brw_meta_fbo_stencil_blit(struct brw_context *brw,
+                          struct gl_framebuffer *read_fb,
+                          struct gl_framebuffer *draw_fb,
                           GLfloat src_x0, GLfloat src_y0,
                           GLfloat src_x1, GLfloat src_y1,
                           GLfloat dst_x0, GLfloat dst_y0,
                           GLfloat dst_x1, GLfloat dst_y1)
 {
    struct gl_context *ctx = &brw->ctx;
-   struct gl_renderbuffer *draw_fb =
-      ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
-   const struct intel_renderbuffer *dst_irb = intel_renderbuffer(draw_fb);
+   struct gl_renderbuffer *draw_rb =
+      draw_fb->Attachment[BUFFER_STENCIL].Renderbuffer;
+   const struct intel_renderbuffer *dst_irb = intel_renderbuffer(draw_rb);
    struct intel_mipmap_tree *dst_mt = dst_irb->mt;
 
    if (!dst_mt)
@@ -469,7 +487,7 @@ brw_meta_fbo_stencil_blit(struct brw_context *brw,
       dst_mt = dst_mt->stencil_mt;
 
    bool mirror_x, mirror_y;
-   if (brw_meta_mirror_clip_and_scissor(ctx,
+   if (brw_meta_mirror_clip_and_scissor(ctx, read_fb, draw_fb,
                                         &src_x0, &src_y0, &src_x1, &src_y1,
                                         &dst_x0, &dst_y0, &dst_x1, &dst_y1,
                                         &mirror_x, &mirror_y))
@@ -482,11 +500,11 @@ brw_meta_fbo_stencil_blit(struct brw_context *brw,
                              .mirror_x = mirror_x, .mirror_y = mirror_y };
    adjust_mip_level(dst_mt, dst_irb->mt_level, dst_irb->mt_layer, &dims);
 
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_emit_mi_flush(brw);
    _mesa_meta_begin(ctx, MESA_META_ALL);
    brw_meta_stencil_blit(brw,
                          dst_mt, dst_irb->mt_level, dst_irb->mt_layer, &dims);
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_emit_mi_flush(brw);
 }
 
 void
@@ -506,7 +524,7 @@ brw_meta_stencil_updownsample(struct brw_context *brw,
    if (dst->stencil_mt)
       dst = dst->stencil_mt;
 
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_emit_mi_flush(brw);
    _mesa_meta_begin(ctx, MESA_META_ALL);
 
    _mesa_GenFramebuffers(1, &fbo);
@@ -517,7 +535,7 @@ brw_meta_stencil_updownsample(struct brw_context *brw,
                                  GL_RENDERBUFFER, rbo);
 
    brw_meta_stencil_blit(brw, dst, 0, 0, &dims);
-   intel_batchbuffer_emit_mi_flush(brw);
+   brw_emit_mi_flush(brw);
 
    _mesa_DeleteRenderbuffers(1, &rbo);
    _mesa_DeleteFramebuffers(1, &fbo);