浏览代码

i965: Fix fp fragment.position handling and enable HW part of ARB_fcc.

As with swrast, this fixes the default pixel center behavior which was
broken, and implements the previous behavior for integer.  Fixes
piglit fp-arb-fragment-coord-conventions-none.  The extension won't be
exposed until we get the GLSL part implemented.

The DRI1 origin_x/y parts are dropped since they're no longer relevant.
tags/7.8-rc1
Eric Anholt 15 年前
父节点
当前提交
f62c2a0bb8
共有 3 个文件被更改,包括 35 次插入16 次删除
  1. 1
    5
      src/mesa/drivers/dri/i965/brw_wm.c
  2. 0
    1
      src/mesa/drivers/dri/i965/brw_wm.h
  3. 34
    10
      src/mesa/drivers/dri/i965/brw_wm_emit.c

+ 1
- 5
src/mesa/drivers/dri/i965/brw_wm.c 查看文件

@@ -336,11 +336,7 @@ static void brw_wm_populate_key( struct brw_context *brw,
* drawable height in order to invert the Y axis.
*/
if (fp->program.Base.InputsRead & FRAG_BIT_WPOS) {
if (brw->intel.driDrawable != NULL) {
key->origin_x = brw->intel.driDrawable->x;
key->origin_y = brw->intel.driDrawable->y;
key->drawable_height = brw->intel.driDrawable->h;
}
key->drawable_height = ctx->DrawBuffer->Height;
}

key->nr_color_regions = brw->state.nr_color_regions;

+ 0
- 1
src/mesa/drivers/dri/i965/brw_wm.h 查看文件

@@ -76,7 +76,6 @@ struct brw_wm_prog_key {

GLushort tex_swizzles[BRW_MAX_TEX_UNIT];

GLushort origin_x, origin_y;
GLushort drawable_height;
GLbitfield64 vp_outputs_written;
GLuint program_string_id:32;

+ 34
- 10
src/mesa/drivers/dri/i965/brw_wm_emit.c 查看文件

@@ -138,19 +138,43 @@ void emit_wpos_xy(struct brw_wm_compile *c,
* X and Y channels.
*/
if (mask & WRITEMASK_X) {
/* X' = X - origin */
brw_ADD(p,
dst[0],
retype(arg0[0], BRW_REGISTER_TYPE_W),
brw_imm_d(0 - c->key.origin_x));
if (c->fp->program.PixelCenterInteger) {
/* X' = X */
brw_MOV(p,
dst[0],
retype(arg0[0], BRW_REGISTER_TYPE_W));
} else {
/* X' = X + 0.5 */
brw_ADD(p,
dst[0],
retype(arg0[0], BRW_REGISTER_TYPE_W),
brw_imm_f(0.5));
}
}

if (mask & WRITEMASK_Y) {
/* Y' = height - (Y - origin_y) = height + origin_y - Y */
brw_ADD(p,
dst[1],
negate(retype(arg0[1], BRW_REGISTER_TYPE_W)),
brw_imm_d(c->key.origin_y + c->key.drawable_height - 1));
if (c->fp->program.OriginUpperLeft) {
if (c->fp->program.PixelCenterInteger) {
/* Y' = Y */
brw_MOV(p,
dst[1],
retype(arg0[1], BRW_REGISTER_TYPE_W));
} else {
/* Y' = Y + 0.5 */
brw_ADD(p,
dst[1],
retype(arg0[1], BRW_REGISTER_TYPE_W),
brw_imm_f(0.5));
}
} else {
float center_offset = c->fp->program.PixelCenterInteger ? 0.0 : 0.5;

/* Y' = (height - 1) - Y + center */
brw_ADD(p,
dst[1],
negate(retype(arg0[1], BRW_REGISTER_TYPE_W)),
brw_imm_f(c->key.drawable_height - 1 + center_offset));
}
}
}


正在加载...
取消
保存