X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fdrivers%2Fdri%2Fi965%2Fbrw_clip.c;h=3a7c4829ed775828e2bd8c3e60405ad81ec2df05;hb=646e1123859405da36c7a9920e0c5e270eb4979f;hp=11f0b6938f59179b8a40c37f2e842e15d267f8e3;hpb=db1449b7005af190d2ef1f2ad94f96c4b29943db;p=mesa.git diff --git a/src/mesa/drivers/dri/i965/brw_clip.c b/src/mesa/drivers/dri/i965/brw_clip.c index 11f0b6938f5..3a7c4829ed7 100644 --- a/src/mesa/drivers/dri/i965/brw_clip.c +++ b/src/mesa/drivers/dri/i965/brw_clip.c @@ -29,7 +29,6 @@ * Keith Whitwell */ -#include "main/glheader.h" #include "main/macros.h" #include "main/enums.h" @@ -37,115 +36,72 @@ #include "brw_defines.h" #include "brw_context.h" -#include "brw_eu.h" #include "brw_util.h" #include "brw_state.h" -#include "brw_clip.h" - -#include "glsl/ralloc.h" - -#define FRONT_UNFILLED_BIT 0x1 -#define BACK_UNFILLED_BIT 0x2 +#include "compiler/brw_eu.h" +#include "util/ralloc.h" static void compile_clip_prog( struct brw_context *brw, struct brw_clip_prog_key *key ) { - struct brw_clip_compile c; - const GLuint *program; + const unsigned *program; void *mem_ctx; - GLuint program_size; - - memset(&c, 0, sizeof(c)); + unsigned program_size; mem_ctx = ralloc_context(NULL); - /* Begin the compilation: - */ - brw_init_compile(brw, &c.func, mem_ctx); - - c.func.single_program_flow = 1; - - c.key = *key; - c.vue_map = brw->vue_map_geom_out; - - c.has_flat_shading = - brw_any_flat_varyings(&key->interpolation_mode); - c.has_noperspective_shading = - brw_any_noperspective_varyings(&key->interpolation_mode); - - /* nr_regs is the number of registers filled by reading data from the VUE. - * This program accesses the entire VUE, so nr_regs needs to be the size of - * the VUE (measured in pairs, since two slots are stored in each - * register). - */ - c.nr_regs = (c.vue_map.num_slots + 1)/2; - - c.prog_data.clip_mode = c.key.clip_mode; /* XXX */ - - /* For some reason the thread is spawned with only 4 channels - * unmasked. - */ - brw_set_mask_control(&c.func, BRW_MASK_DISABLE); - - - /* Would ideally have the option of producing a program which could - * do all three: - */ - switch (key->primitive) { - case GL_TRIANGLES: - if (key->do_unfilled) - brw_emit_unfilled_clip( &c ); - else - brw_emit_tri_clip( &c ); - break; - case GL_LINES: - brw_emit_line_clip( &c ); - break; - case GL_POINTS: - brw_emit_point_clip( &c ); - break; - default: - assert(0); - return; - } - - brw_compact_instructions(&c.func); - - /* get the program - */ - program = brw_get_program(&c.func, &program_size); - - if (unlikely(INTEL_DEBUG & DEBUG_CLIP)) { - fprintf(stderr, "clip:\n"); - brw_disassemble(brw, c.func.store, 0, program_size, stderr); - fprintf(stderr, "\n"); - } + struct brw_clip_prog_data prog_data; + program = brw_compile_clip(brw->screen->compiler, mem_ctx, key, &prog_data, + &brw->vue_map_geom_out, &program_size); brw_upload_cache(&brw->cache, - BRW_CLIP_PROG, - &c.key, sizeof(c.key), + BRW_CACHE_CLIP_PROG, + key, sizeof(*key), program, program_size, - &c.prog_data, sizeof(c.prog_data), + &prog_data, sizeof(prog_data), &brw->clip.prog_offset, &brw->clip.prog_data); ralloc_free(mem_ctx); } /* Calculate interpolants for triangle and line rasterization. */ -static void +void brw_upload_clip_prog(struct brw_context *brw) { + const struct gen_device_info *devinfo = &brw->screen->devinfo; struct gl_context *ctx = &brw->ctx; struct brw_clip_prog_key key; + if (!brw_state_dirty(brw, + _NEW_BUFFERS | + _NEW_LIGHT | + _NEW_POLYGON | + _NEW_TRANSFORM, + BRW_NEW_BLORP | + BRW_NEW_FS_PROG_DATA | + BRW_NEW_REDUCED_PRIMITIVE | + BRW_NEW_VUE_MAP_GEOM_OUT)) + return; + memset(&key, 0, sizeof(key)); /* Populate the key: */ - /* BRW_NEW_INTERPOLATION_MAP */ - key.interpolation_mode = brw->interpolation_mode; + /* BRW_NEW_FS_PROG_DATA */ + const struct brw_wm_prog_data *wm_prog_data = + brw_wm_prog_data(brw->wm.base.prog_data); + if (wm_prog_data) { + key.contains_flat_varying = wm_prog_data->contains_flat_varying; + key.contains_noperspective_varying = + wm_prog_data->contains_noperspective_varying; + + STATIC_ASSERT(sizeof(key.interp_mode) == + sizeof(wm_prog_data->interp_mode)); + memcpy(key.interp_mode, wm_prog_data->interp_mode, + sizeof(key.interp_mode)); + } /* BRW_NEW_REDUCED_PRIMITIVE */ key.primitive = brw->reduced_primitive; @@ -158,19 +114,19 @@ brw_upload_clip_prog(struct brw_context *brw) if (ctx->Transform.ClipPlanesEnabled) key.nr_userclip = _mesa_logbase2(ctx->Transform.ClipPlanesEnabled) + 1; - if (brw->gen == 5) - key.clip_mode = BRW_CLIPMODE_KERNEL_CLIP; + if (devinfo->gen == 5) + key.clip_mode = BRW_CLIP_MODE_KERNEL_CLIP; else - key.clip_mode = BRW_CLIPMODE_NORMAL; + key.clip_mode = BRW_CLIP_MODE_NORMAL; /* _NEW_POLYGON */ if (key.primitive == GL_TRIANGLES) { if (ctx->Polygon.CullFlag && ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK) - key.clip_mode = BRW_CLIPMODE_REJECT_ALL; + key.clip_mode = BRW_CLIP_MODE_REJECT_ALL; else { - GLuint fill_front = CLIP_CULL; - GLuint fill_back = CLIP_CULL; + GLuint fill_front = BRW_CLIP_FILL_MODE_CULL; + GLuint fill_back = BRW_CLIP_FILL_MODE_CULL; GLuint offset_front = 0; GLuint offset_back = 0; @@ -178,15 +134,15 @@ brw_upload_clip_prog(struct brw_context *brw) ctx->Polygon.CullFaceMode != GL_FRONT) { switch (ctx->Polygon.FrontMode) { case GL_FILL: - fill_front = CLIP_FILL; + fill_front = BRW_CLIP_FILL_MODE_FILL; offset_front = 0; break; case GL_LINE: - fill_front = CLIP_LINE; + fill_front = BRW_CLIP_FILL_MODE_LINE; offset_front = ctx->Polygon.OffsetLine; break; case GL_POINT: - fill_front = CLIP_POINT; + fill_front = BRW_CLIP_FILL_MODE_POINT; offset_front = ctx->Polygon.OffsetPoint; break; } @@ -196,15 +152,15 @@ brw_upload_clip_prog(struct brw_context *brw) ctx->Polygon.CullFaceMode != GL_BACK) { switch (ctx->Polygon.BackMode) { case GL_FILL: - fill_back = CLIP_FILL; + fill_back = BRW_CLIP_FILL_MODE_FILL; offset_back = 0; break; case GL_LINE: - fill_back = CLIP_LINE; + fill_back = BRW_CLIP_FILL_MODE_LINE; offset_back = ctx->Polygon.OffsetLine; break; case GL_POINT: - fill_back = CLIP_POINT; + fill_back = BRW_CLIP_FILL_MODE_POINT; offset_back = ctx->Polygon.OffsetPoint; break; } @@ -217,55 +173,39 @@ brw_upload_clip_prog(struct brw_context *brw) /* Most cases the fixed function units will handle. Cases where * one or more polygon faces are unfilled will require help: */ - key.clip_mode = BRW_CLIPMODE_CLIP_NON_REJECTED; + key.clip_mode = BRW_CLIP_MODE_CLIP_NON_REJECTED; if (offset_back || offset_front) { /* _NEW_POLYGON, _NEW_BUFFERS */ key.offset_units = ctx->Polygon.OffsetUnits * ctx->DrawBuffer->_MRD * 2; key.offset_factor = ctx->Polygon.OffsetFactor * ctx->DrawBuffer->_MRD; + key.offset_clamp = ctx->Polygon.OffsetClamp * ctx->DrawBuffer->_MRD; } - switch (ctx->Polygon.FrontFace) { - case GL_CCW: + if (!brw->polygon_front_bit) { key.fill_ccw = fill_front; key.fill_cw = fill_back; key.offset_ccw = offset_front; key.offset_cw = offset_back; if (ctx->Light.Model.TwoSide && - key.fill_cw != CLIP_CULL) + key.fill_cw != BRW_CLIP_FILL_MODE_CULL) key.copy_bfc_cw = 1; - break; - case GL_CW: + } else { key.fill_cw = fill_front; key.fill_ccw = fill_back; key.offset_cw = offset_front; key.offset_ccw = offset_back; if (ctx->Light.Model.TwoSide && - key.fill_ccw != CLIP_CULL) + key.fill_ccw != BRW_CLIP_FILL_MODE_CULL) key.copy_bfc_ccw = 1; - break; } } } } - if (!brw_search_cache(&brw->cache, BRW_CLIP_PROG, + if (!brw_search_cache(&brw->cache, BRW_CACHE_CLIP_PROG, &key, sizeof(key), &brw->clip.prog_offset, &brw->clip.prog_data)) { compile_clip_prog( brw, &key ); } } - - -const struct brw_tracked_state brw_clip_prog = { - .dirty = { - .mesa = (_NEW_LIGHT | - _NEW_TRANSFORM | - _NEW_POLYGON | - _NEW_BUFFERS), - .brw = (BRW_NEW_REDUCED_PRIMITIVE | - BRW_NEW_VUE_MAP_GEOM_OUT | - BRW_NEW_INTERPOLATION_MAP) - }, - .emit = brw_upload_clip_prog -};