#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"
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);
}
}
}
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;
}
/**
_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)
{
*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
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. */
_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);
_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);
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)
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))
.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
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);
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);