This brings in the initial code I've been working on for bringing up OpenGL on Sandybridge in the i965 driver. It doesn't work yet.tags/7.8-rc1
@@ -84,7 +84,18 @@ DRIVER_SOURCES = \ | |||
brw_wm_pass2.c \ | |||
brw_wm_sampler_state.c \ | |||
brw_wm_state.c \ | |||
brw_wm_surface_state.c | |||
brw_wm_surface_state.c \ | |||
gen6_cc.c \ | |||
gen6_clip_state.c \ | |||
gen6_depthstencil.c \ | |||
gen6_gs_state.c \ | |||
gen6_sampler_state.c \ | |||
gen6_scissor_state.c \ | |||
gen6_sf_state.c \ | |||
gen6_urb.c \ | |||
gen6_viewport_state.c \ | |||
gen6_vs_state.c \ | |||
gen6_wm_state.c | |||
C_SOURCES = \ | |||
$(COMMON_SOURCES) \ |
@@ -150,7 +150,7 @@ GLboolean brwCreateContext( const __GLcontextModes *mesaVis, | |||
MIN2(ctx->Const.FragmentProgram.MaxNativeParameters, | |||
ctx->Const.FragmentProgram.MaxEnvParams); | |||
if (intel->is_ironlake || intel->is_g4x) { | |||
if (intel->is_ironlake || intel->is_g4x || intel->gen >= 6) { | |||
brw->CMD_VF_STATISTICS = CMD_VF_STATISTICS_GM45; | |||
brw->CMD_PIPELINE_SELECT = CMD_PIPELINE_SELECT_GM45; | |||
brw->has_surface_tile_offset = GL_TRUE; |
@@ -282,6 +282,9 @@ struct brw_vs_ouput_sizes { | |||
enum brw_cache_id { | |||
BRW_BLEND_STATE, | |||
BRW_DEPTH_STENCIL_STATE, | |||
BRW_COLOR_CALC_STATE, | |||
BRW_CC_VP, | |||
BRW_CC_UNIT, | |||
BRW_WM_PROG, | |||
@@ -290,7 +293,7 @@ enum brw_cache_id { | |||
BRW_WM_UNIT, | |||
BRW_SF_PROG, | |||
BRW_SF_VP, | |||
BRW_SF_UNIT, | |||
BRW_SF_UNIT, /* scissor state on gen6 */ | |||
BRW_VS_UNIT, | |||
BRW_VS_PROG, | |||
BRW_GS_UNIT, | |||
@@ -354,6 +357,9 @@ struct brw_tracked_state { | |||
/* Flags for brw->state.cache. | |||
*/ | |||
#define CACHE_NEW_BLEND_STATE (1<<BRW_BLEND_STATE) | |||
#define CACHE_NEW_DEPTH_STENCIL_STATE (1<<BRW_DEPTH_STENCIL_STATE) | |||
#define CACHE_NEW_COLOR_CALC_STATE (1<<BRW_COLOR_CALC_STATE) | |||
#define CACHE_NEW_CC_VP (1<<BRW_CC_VP) | |||
#define CACHE_NEW_CC_UNIT (1<<BRW_CC_UNIT) | |||
#define CACHE_NEW_WM_PROG (1<<BRW_WM_PROG) | |||
@@ -538,7 +544,8 @@ struct brw_context | |||
GLuint nr_sf_entries; | |||
GLuint nr_cs_entries; | |||
/* GLuint vs_size; */ | |||
/* gen6 */ | |||
GLuint vs_size; | |||
/* GLuint gs_size; */ | |||
/* GLuint clip_size; */ | |||
/* GLuint sf_size; */ | |||
@@ -643,9 +650,16 @@ struct brw_context | |||
struct { | |||
/* gen4 */ | |||
dri_bo *prog_bo; | |||
dri_bo *state_bo; | |||
dri_bo *vp_bo; | |||
/* gen6 */ | |||
dri_bo *blend_state_bo; | |||
dri_bo *depth_stencil_state_bo; | |||
dri_bo *color_calc_state_bo; | |||
dri_bo *state_bo; | |||
} cc; | |||
struct { |
@@ -530,6 +530,7 @@ | |||
#define BRW_OPCODE_POP 47 | |||
#define BRW_OPCODE_WAIT 48 | |||
#define BRW_OPCODE_SEND 49 | |||
#define BRW_OPCODE_MATH 56 | |||
#define BRW_OPCODE_ADD 64 | |||
#define BRW_OPCODE_MUL 65 | |||
#define BRW_OPCODE_AVG 66 | |||
@@ -727,7 +728,8 @@ | |||
#define BRW_MATH_FUNCTION_SIN 6 /* was 7 */ | |||
#define BRW_MATH_FUNCTION_COS 7 /* was 8 */ | |||
#define BRW_MATH_FUNCTION_SINCOS 8 /* was 6 */ | |||
#define BRW_MATH_FUNCTION_TAN 9 | |||
#define BRW_MATH_FUNCTION_TAN 9 /* gen4 */ | |||
#define BRW_MATH_FUNCTION_FDIV 9 /* gen6+ */ | |||
#define BRW_MATH_FUNCTION_POW 10 | |||
#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT_AND_REMAINDER 11 | |||
#define BRW_MATH_FUNCTION_INT_DIV_QUOTIENT 12 | |||
@@ -778,17 +780,33 @@ | |||
#define CMD_PIPELINED_STATE_POINTERS 0x7800 | |||
#define CMD_BINDING_TABLE_PTRS 0x7801 | |||
# define GEN6_BINDING_TABLE_MODIFY_VS (1 << 8) | |||
# define GEN6_BINDING_TABLE_MODIFY_GS (1 << 9) | |||
# define GEN6_BINDING_TABLE_MODIFY_PS (1 << 10) | |||
#define CMD_3D_SAMPLER_STATE_POINTERS 0x7802 /* SNB+ */ | |||
# define PS_SAMPLER_STATE_CHANGE (1 << 12) | |||
# define GS_SAMPLER_STATE_CHANGE (1 << 9) | |||
# define VS_SAMPLER_STATE_CHANGE (1 << 8) | |||
/* DW1: VS */ | |||
/* DW2: GS */ | |||
/* DW3: PS */ | |||
#define CMD_VERTEX_BUFFER 0x7808 | |||
# define BRW_VB0_INDEX_SHIFT 27 | |||
# define GEN6_VB0_INDEX_SHIFT 26 | |||
# define BRW_VB0_ACCESS_VERTEXDATA (0 << 26) | |||
# define BRW_VB0_ACCESS_INSTANCEDATA (1 << 26) | |||
# define GEN6_VB0_ACCESS_VERTEXDATA (0 << 20) | |||
# define GEN6_VB0_ACCESS_INSTANCEDATA (1 << 20) | |||
# define BRW_VB0_PITCH_SHIFT 0 | |||
#define CMD_VERTEX_ELEMENT 0x7809 | |||
# define BRW_VE0_INDEX_SHIFT 27 | |||
# define GEN6_VE0_INDEX_SHIFT 26 | |||
# define BRW_VE0_FORMAT_SHIFT 16 | |||
# define BRW_VE0_VALID (1 << 26) | |||
# define GEN6_VE0_VALID (0 << 25) | |||
# define BRW_VE0_SRC_OFFSET_SHIFT 0 | |||
# define BRW_VE1_COMPONENT_NOSTORE 0 | |||
# define BRW_VE1_COMPONENT_STORE_SRC 1 | |||
@@ -805,8 +823,218 @@ | |||
# define BRW_VE1_DST_OFFSET_SHIFT 0 | |||
#define CMD_INDEX_BUFFER 0x780a | |||
#define CMD_VF_STATISTICS_965 0x780b | |||
#define CMD_VF_STATISTICS_965 0x780b | |||
#define CMD_VF_STATISTICS_GM45 0x680b | |||
#define CMD_3D_CC_STATE_POINTERS 0x780e /* GEN6+ */ | |||
#define CMD_URB 0x7805 /* GEN6+ */ | |||
# define GEN6_URB_VS_SIZE_SHIFT 16 | |||
# define GEN6_URB_VS_ENTRIES_SHIFT 0 | |||
# define GEN6_URB_GS_SIZE_SHIFT 8 | |||
# define GEN6_URB_GS_ENTRIES_SHIFT 0 | |||
#define CMD_VIEWPORT_STATE_POINTERS 0x780d /* GEN6+ */ | |||
# define GEN6_CC_VIEWPORT_MODIFY (1 << 12) | |||
# define GEN6_SF_VIEWPORT_MODIFY (1 << 11) | |||
# define GEN6_CLIP_VIEWPORT_MODIFY (1 << 10) | |||
#define CMD_3D_SCISSOR_STATE_POINTERS 0x780f /* GEN6+ */ | |||
#define CMD_3D_VS_STATE 0x7810 /* GEN6+ */ | |||
/* DW2 */ | |||
# define GEN6_VS_SPF_MODE (1 << 31) | |||
# define GEN6_VS_VECTOR_MASK_ENABLE (1 << 30) | |||
# define GEN6_VS_SAMPLER_COUNT_SHIFT 27 | |||
# define GEN6_VS_BINDING_TABLE_ENTRY_COUNT_SHIFT 18 | |||
/* DW4 */ | |||
# define GEN6_VS_DISPATCH_START_GRF_SHIFT 20 | |||
# define GEN6_VS_URB_READ_LENGTH_SHIFT 11 | |||
# define GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT 4 | |||
/* DW5 */ | |||
# define GEN6_VS_MAX_THREADS_SHIFT 25 | |||
# define GEN6_VS_STATISTICS_ENABLE (1 << 10) | |||
# define GEN6_VS_CACHE_DISABLE (1 << 1) | |||
# define GEN6_VS_ENABLE (1 << 0) | |||
#define CMD_3D_GS_STATE 0x7811 /* GEN6+ */ | |||
/* DW2 */ | |||
# define GEN6_GS_SPF_MODE (1 << 31) | |||
# define GEN6_GS_VECTOR_MASK_ENABLE (1 << 30) | |||
# define GEN6_GS_SAMPLER_COUNT_SHIFT 27 | |||
# define GEN6_GS_BINDING_TABLE_ENTRY_COUNT_SHIFT 18 | |||
/* DW4 */ | |||
# define GEN6_GS_URB_READ_LENGTH_SHIFT 11 | |||
# define GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT 4 | |||
# define GEN6_GS_DISPATCH_START_GRF_SHIFT 0 | |||
/* DW5 */ | |||
# define GEN6_GS_MAX_THREADS_SHIFT 25 | |||
# define GEN6_GS_STATISTICS_ENABLE (1 << 10) | |||
# define GEN6_GS_SO_STATISTICS_ENABLE (1 << 9) | |||
# define GEN6_GS_RENDERING_ENABLE (1 << 8) | |||
/* DW6 */ | |||
# define GEN6_GS_ENABLE (1 << 15) | |||
#define CMD_3D_CLIP_STATE 0x7812 /* GEN6+ */ | |||
/* DW1 */ | |||
# define GEN6_CLIP_STATISTICS_ENABLE (1 << 10) | |||
/* DW2 */ | |||
# define GEN6_CLIP_ENABLE (1 << 31) | |||
# define GEN6_CLIP_API_OGL (1 << 30) | |||
# define GEN6_CLIP_XY_TEST (1 << 28) | |||
# define GEN6_CLIP_Z_TEST (1 << 27) | |||
# define GEN6_CLIP_GB_TEST (1 << 26) | |||
# define GEN6_CLIP_MODE_NORMAL (0 << 13) | |||
# define GEN6_CLIP_MODE_REJECT_ALL (3 << 13) | |||
# define GEN6_CLIP_MODE_ACCEPT_ALL (4 << 13) | |||
# define GEN6_CLIP_PERSPECTIVE_DIVIDE_DISABLE (1 << 9) | |||
# define GEN6_CLIP_BARYCENTRIC_ENABLE (1 << 8) | |||
# define GEN6_CLIP_TRI_PROVOKE_SHIFT 4 | |||
# define GEN6_CLIP_LINE_PROVOKE_SHIFT 2 | |||
# define GEN6_CLIP_TRIFAN_PROVOKE_SHIFT 0 | |||
/* DW3 */ | |||
# define GEN6_CLIP_MIN_POINT_WIDTH_SHIFT 17 | |||
# define GEN6_CLIP_MAX_POINT_WIDTH_SHIFT 6 | |||
#define CMD_3D_SF_STATE 0x7813 /* GEN6+ */ | |||
/* DW1 */ | |||
# define GEN6_SF_NUM_OUTPUTS_SHIFT 22 | |||
# define GEN6_SF_SWIZZLE_ENABLE (1 << 21) | |||
# define GEN6_SF_POINT_SPRITE_LOWERLEFT (1 << 20) | |||
# define GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT 11 | |||
# define GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT 4 | |||
/* DW2 */ | |||
# define GEN6_SF_LEGACY_GLOBAL_DEPTH_BIAS (1 << 11) | |||
# define GEN6_SF_STATISTICS_ENABLE (1 << 10) | |||
# define GEN6_SF_GLOBAL_DEPTH_OFFSET_SOLID (1 << 9) | |||
# define GEN6_SF_GLOBAL_DEPTH_OFFSET_WIREFRAME (1 << 8) | |||
# define GEN6_SF_GLOBAL_DEPTH_OFFSET_POINT (1 << 7) | |||
# define GEN6_SF_FRONT_SOLID (0 << 5) | |||
# define GEN6_SF_FRONT_WIREFRAME (1 << 5) | |||
# define GEN6_SF_FRONT_POINT (2 << 5) | |||
# define GEN6_SF_BACK_SOLID (0 << 3) | |||
# define GEN6_SF_BACK_WIREFRAME (1 << 3) | |||
# define GEN6_SF_BACK_POINT (2 << 3) | |||
# define GEN6_SF_VIEWPORT_TRANSFORM_ENABLE (1 << 1) | |||
# define GEN6_SF_WINDING_CCW (1 << 0) | |||
/* DW3 */ | |||
# define GEN6_SF_LINE_AA_ENABLE (1 << 31) | |||
# define GEN6_SF_CULL_BOTH (0 << 29) | |||
# define GEN6_SF_CULL_NONE (1 << 29) | |||
# define GEN6_SF_CULL_FRONT (2 << 29) | |||
# define GEN6_SF_CULL_BACK (3 << 29) | |||
# define GEN6_SF_LINE_WIDTH_SHIFT 18 /* U3.7 */ | |||
# define GEN6_SF_LINE_END_CAP_WIDTH_0_5 (0 << 16) | |||
# define GEN6_SF_LINE_END_CAP_WIDTH_1_0 (1 << 16) | |||
# define GEN6_SF_LINE_END_CAP_WIDTH_2_0 (2 << 16) | |||
# define GEN6_SF_LINE_END_CAP_WIDTH_4_0 (3 << 16) | |||
# define GEN6_SF_SCISSOR_ENABLE (1 << 11) | |||
# define GEN6_SF_MSRAST_OFF_PIXEL (0 << 8) | |||
# define GEN6_SF_MSRAST_OFF_PATTERN (1 << 8) | |||
# define GEN6_SF_MSRAST_ON_PIXEL (2 << 8) | |||
# define GEN6_SF_MSRAST_ON_PATTERN (3 << 8) | |||
/* DW4 */ | |||
# define GEN6_SF_TRI_PROVOKE_SHIFT 29 | |||
# define GEN6_SF_LINE_PROVOKE_SHIFT 27 | |||
# define GEN6_SF_TRIFAN_PROVOKE_SHIFT 25 | |||
# define GEN6_SF_LINE_AA_MODE_MANHATTAN (0 << 14) | |||
# define GEN6_SF_LINE_AA_MODE_TRUE (1 << 14) | |||
# define GEN6_SF_VERTEX_SUBPIXEL_8BITS (0 << 12) | |||
# define GEN6_SF_VERTEX_SUBPIXEL_4BITS (1 << 12) | |||
# define GEN6_SF_USE_STATE_POINT_WIDTH (1 << 11) | |||
# define GEN6_SF_POINT_WIDTH_SHIFT 0 /* U8.3 */ | |||
/* DW5: depth offset constant */ | |||
/* DW6: depth offset scale */ | |||
/* DW7: depth offset clamp */ | |||
/* DW8 */ | |||
# define ATTRIBUTE_1_OVERRIDE_W (1 << 31) | |||
# define ATTRIBUTE_1_OVERRIDE_Z (1 << 30) | |||
# define ATTRIBUTE_1_OVERRIDE_Y (1 << 29) | |||
# define ATTRIBUTE_1_OVERRIDE_X (1 << 28) | |||
# define ATTRIBUTE_1_CONST_SOURCE_SHIFT 25 | |||
# define ATTRIBUTE_1_SWIZZLE_SHIFT 22 | |||
# define ATTRIBUTE_1_SOURCE_SHIFT 16 | |||
# define ATTRIBUTE_0_OVERRIDE_W (1 << 15) | |||
# define ATTRIBUTE_0_OVERRIDE_Z (1 << 14) | |||
# define ATTRIBUTE_0_OVERRIDE_Y (1 << 13) | |||
# define ATTRIBUTE_0_OVERRIDE_X (1 << 12) | |||
# define ATTRIBUTE_0_CONST_SOURCE_SHIFT 9 | |||
# define ATTRIBUTE_0_SWIZZLE_SHIFT 6 | |||
# define ATTRIBUTE_0_SOURCE_SHIFT 0 | |||
/* DW16: Point sprite texture coordinate enables */ | |||
/* DW17: Constant interpolation enables */ | |||
/* DW18: attr 0-7 wrap shortest enables */ | |||
/* DW19: attr 8-16 wrap shortest enables */ | |||
#define CMD_3D_WM_STATE 0x7814 /* GEN6+ */ | |||
/* DW1: kernel pointer */ | |||
/* DW2 */ | |||
# define GEN6_WM_SPF_MODE (1 << 31) | |||
# define GEN6_WM_VECTOR_MASK_ENABLE (1 << 30) | |||
# define GEN6_WM_SAMPLER_COUNT_SHIFT 27 | |||
# define GEN6_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT 18 | |||
/* DW3: scratch space */ | |||
/* DW4 */ | |||
# define GEN6_WM_STATISTICS_ENABLE (1 << 31) | |||
# define GEN6_WM_DEPTH_CLEAR (1 << 30) | |||
# define GEN6_WM_DEPTH_RESOLVE (1 << 28) | |||
# define GEN6_WM_HIERARCHICAL_DEPTH_RESOLVE (1 << 27) | |||
# define GEN6_WM_DISPATCH_START_GRF_SHIFT_0 16 | |||
# define GEN6_WM_DISPATCH_START_GRF_SHIFT_1 8 | |||
# define GEN6_WM_DISPATCH_START_GRF_SHIFT_2 0 | |||
/* DW5 */ | |||
# define GEN6_WM_MAX_THREADS_SHIFT 25 | |||
# define GEN6_WM_KILL_ENABLE (1 << 22) | |||
# define GEN6_WM_COMPUTED_DEPTH (1 << 21) | |||
# define GEN6_WM_USES_SOURCE_DEPTH (1 << 20) | |||
# define GEN6_WM_DISPATCH_ENABLE (1 << 19) | |||
# define GEN6_WM_LINE_END_CAP_AA_WIDTH_0_5 (0 << 16) | |||
# define GEN6_WM_LINE_END_CAP_AA_WIDTH_1_0 (1 << 16) | |||
# define GEN6_WM_LINE_END_CAP_AA_WIDTH_2_0 (2 << 16) | |||
# define GEN6_WM_LINE_END_CAP_AA_WIDTH_4_0 (3 << 16) | |||
# define GEN6_WM_LINE_AA_WIDTH_0_5 (0 << 14) | |||
# define GEN6_WM_LINE_AA_WIDTH_1_0 (1 << 14) | |||
# define GEN6_WM_LINE_AA_WIDTH_2_0 (2 << 14) | |||
# define GEN6_WM_LINE_AA_WIDTH_4_0 (3 << 14) | |||
# define GEN6_WM_POLYGON_STIPPLE_ENABLE (1 << 13) | |||
# define GEN6_WM_LINE_STIPPLE_ENABLE (1 << 12) | |||
# define GEN6_WM_OMASK_TO_RENDER_TARGET (1 << 9) | |||
# define GEN6_WM_USES_SOURCE_W (1 << 8) | |||
# define GEN6_WM_DUAL_SOURCE_BLEND_ENABLE (1 << 7) | |||
# define GEN6_WM_32_DISPATCH_ENABLE (1 << 2) | |||
# define GEN6_WM_16_DISPATCH_ENABLE (1 << 1) | |||
# define GEN6_WM_8_DISPATCH_ENABLE (1 << 0) | |||
/* DW6 */ | |||
# define GEN6_WM_NUM_SF_OUTPUTS_SHIFT 20 | |||
# define GEN6_WM_POSOFFSET_NONE (0 << 18) | |||
# define GEN6_WM_POSOFFSET_CENTROID (2 << 18) | |||
# define GEN6_WM_POSOFFSET_SAMPLE (3 << 18) | |||
# define GEN6_WM_POSITION_ZW_PIXEL (0 << 16) | |||
# define GEN6_WM_POSITION_ZW_CENTROID (2 << 16) | |||
# define GEN6_WM_POSITION_ZW_SAMPLE (3 << 16) | |||
# define GEN6_WM_NONPERSPECTIVE_SAMPLE_BARYCENTRIC (1 << 15) | |||
# define GEN6_WM_NONPERSPECTIVE_CENTROID_BARYCENTRIC (1 << 14) | |||
# define GEN6_WM_NONPERSPECTIVE_PIXEL_BARYCENTRIC (1 << 13) | |||
# define GEN6_WM_PERSPECTIVE_SAMPLE_BARYCENTRIC (1 << 12) | |||
# define GEN6_WM_PERSPECTIVE_CENTROID_BARYCENTRIC (1 << 11) | |||
# define GEN6_WM_PERSPECTIVE_PIXEL_BARYCENTRIC (1 << 10) | |||
# define GEN6_WM_POINT_RASTRULE_UPPER_RIGHT (1 << 9) | |||
# define GEN6_WM_MSRAST_OFF_PIXEL (0 << 1) | |||
# define GEN6_WM_MSRAST_OFF_PATTERN (1 << 1) | |||
# define GEN6_WM_MSRAST_ON_PIXEL (2 << 1) | |||
# define GEN6_WM_MSRAST_ON_PATTERN (3 << 1) | |||
# define GEN6_WM_MSDISPMODE_PERPIXEL (1 << 0) | |||
/* DW7: kernel 1 pointer */ | |||
/* DW8: kernel 2 pointer */ | |||
#define CMD_3D_CONSTANT_VS_STATE 0x7815 /* GEN6+ */ | |||
#define CMD_3D_CONSTANT_GS_STATE 0x7816 /* GEN6+ */ | |||
#define CMD_3D_CONSTANT_PS_STATE 0x7817 /* GEN6+ */ | |||
# define GEN6_CONSTANT_BUFFER_3_ENABLE (1 << 15) | |||
# define GEN6_CONSTANT_BUFFER_2_ENABLE (1 << 14) | |||
# define GEN6_CONSTANT_BUFFER_1_ENABLE (1 << 13) | |||
# define GEN6_CONSTANT_BUFFER_0_ENABLE (1 << 12) | |||
#define CMD_3D_SAMPLE_MASK 0x7818 /* GEN6+ */ | |||
#define CMD_DRAW_RECT 0x7900 | |||
#define CMD_BLEND_CONSTANT_COLOR 0x7901 | |||
@@ -818,6 +1046,25 @@ | |||
#define CMD_GLOBAL_DEPTH_OFFSET_CLAMP 0x7909 | |||
#define CMD_AA_LINE_PARAMETERS 0x790a | |||
#define CMD_GS_SVB_INDEX 0x790b /* CTG+ */ | |||
/* DW1 */ | |||
# define SVB_INDEX_SHIFT 29 | |||
# define SVB_LOAD_INTERNAL_VERTEX_COUNT (1 << 0) /* SNB+ */ | |||
/* DW2: SVB index */ | |||
/* DW3: SVB maximum index */ | |||
#define CMD_3D_MULTISAMPLE 0x790d /* SNB+ */ | |||
/* DW1 */ | |||
# define MS_PIXEL_LOCATION_CENTER (0 << 4) | |||
# define MS_PIXEL_LOCATION_UPPER_LEFT (1 << 4) | |||
# define MS_NUMSAMPLES_1 (0 << 1) | |||
# define MS_NUMSAMPLES_4 (2 << 1) | |||
# define MS_NUMSAMPLES_8 (3 << 1) | |||
#define CMD_3D_CLEAR_PARAMS 0x7910 /* ILK+ */ | |||
# define DEPTH_CLEAR_VALID (1 << 15) | |||
/* DW1: depth clear value */ | |||
#define CMD_PIPE_CONTROL 0x7a00 | |||
#define CMD_3D_PRIM 0x7b00 |
@@ -503,10 +503,17 @@ static void brw_emit_vertices(struct brw_context *brw) | |||
if (brw->vb.nr_enabled == 0) { | |||
BEGIN_BATCH(3); | |||
OUT_BATCH((CMD_VERTEX_ELEMENT << 16) | 1); | |||
OUT_BATCH((0 << BRW_VE0_INDEX_SHIFT) | | |||
BRW_VE0_VALID | | |||
(BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) | | |||
(0 << BRW_VE0_SRC_OFFSET_SHIFT)); | |||
if (IS_GEN6(intel->intelScreen->deviceID)) { | |||
OUT_BATCH((0 << GEN6_VE0_INDEX_SHIFT) | | |||
GEN6_VE0_VALID | | |||
(BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) | | |||
(0 << BRW_VE0_SRC_OFFSET_SHIFT)); | |||
} else { | |||
OUT_BATCH((0 << BRW_VE0_INDEX_SHIFT) | | |||
BRW_VE0_VALID | | |||
(BRW_SURFACEFORMAT_R32G32B32A32_FLOAT << BRW_VE0_FORMAT_SHIFT) | | |||
(0 << BRW_VE0_SRC_OFFSET_SHIFT)); | |||
} | |||
OUT_BATCH((BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_0_SHIFT) | | |||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_1_SHIFT) | | |||
(BRW_VE1_COMPONENT_STORE_0 << BRW_VE1_COMPONENT_2_SHIFT) | | |||
@@ -527,14 +534,22 @@ static void brw_emit_vertices(struct brw_context *brw) | |||
for (i = 0; i < brw->vb.nr_enabled; i++) { | |||
struct brw_vertex_element *input = brw->vb.enabled[i]; | |||
uint32_t dw0; | |||
OUT_BATCH((i << BRW_VB0_INDEX_SHIFT) | | |||
BRW_VB0_ACCESS_VERTEXDATA | | |||
if (intel->gen >= 6) { | |||
dw0 = GEN6_VB0_ACCESS_VERTEXDATA | | |||
(i << GEN6_VB0_INDEX_SHIFT); | |||
} else { | |||
dw0 = BRW_VB0_ACCESS_VERTEXDATA | | |||
(i << BRW_VB0_INDEX_SHIFT); | |||
} | |||
OUT_BATCH(dw0 | | |||
(input->stride << BRW_VB0_PITCH_SHIFT)); | |||
OUT_RELOC(input->bo, | |||
I915_GEM_DOMAIN_VERTEX, 0, | |||
input->offset); | |||
if (intel->is_ironlake) { | |||
if (intel->is_ironlake || intel->gen >= 6) { | |||
OUT_RELOC(input->bo, | |||
I915_GEM_DOMAIN_VERTEX, 0, | |||
input->bo->size - 1); | |||
@@ -565,12 +580,19 @@ static void brw_emit_vertices(struct brw_context *brw) | |||
break; | |||
} | |||
OUT_BATCH((i << BRW_VE0_INDEX_SHIFT) | | |||
BRW_VE0_VALID | | |||
(format << BRW_VE0_FORMAT_SHIFT) | | |||
(0 << BRW_VE0_SRC_OFFSET_SHIFT)); | |||
if (IS_GEN6(intel->intelScreen->deviceID)) { | |||
OUT_BATCH((i << GEN6_VE0_INDEX_SHIFT) | | |||
GEN6_VE0_VALID | | |||
(format << BRW_VE0_FORMAT_SHIFT) | | |||
(0 << BRW_VE0_SRC_OFFSET_SHIFT)); | |||
} else { | |||
OUT_BATCH((i << BRW_VE0_INDEX_SHIFT) | | |||
BRW_VE0_VALID | | |||
(format << BRW_VE0_FORMAT_SHIFT) | | |||
(0 << BRW_VE0_SRC_OFFSET_SHIFT)); | |||
} | |||
if (intel->is_ironlake) | |||
if (intel->is_ironlake || intel->gen >= 6) | |||
OUT_BATCH((comp0 << BRW_VE1_COMPONENT_0_SHIFT) | | |||
(comp1 << BRW_VE1_COMPONENT_1_SHIFT) | | |||
(comp2 << BRW_VE1_COMPONENT_2_SHIFT) | |
@@ -917,26 +917,40 @@ void brw_math( struct brw_compile *p, | |||
GLuint data_type, | |||
GLuint precision ) | |||
{ | |||
struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); | |||
GLuint msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1; | |||
GLuint response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1; | |||
struct intel_context *intel = &p->brw->intel; | |||
/* Example code doesn't set predicate_control for send | |||
* instructions. | |||
*/ | |||
insn->header.predicate_control = 0; | |||
insn->header.destreg__conditionalmod = msg_reg_nr; | |||
if (intel->gen >= 6) { | |||
struct brw_instruction *insn = next_insn(p, BRW_OPCODE_MATH); | |||
brw_set_dest(insn, dest); | |||
brw_set_src0(insn, src); | |||
brw_set_math_message(p->brw, | |||
insn, | |||
msg_length, response_length, | |||
function, | |||
BRW_MATH_INTEGER_UNSIGNED, | |||
precision, | |||
saturate, | |||
data_type); | |||
/* Math is the same ISA format as other opcodes, except that CondModifier | |||
* becomes FC[3:0] and ThreadCtrl becomes FC[5:4]. | |||
*/ | |||
insn->header.destreg__conditionalmod = function; | |||
brw_set_dest(insn, dest); | |||
brw_set_src0(insn, src); | |||
brw_set_src1(insn, brw_null_reg()); | |||
} else { | |||
struct brw_instruction *insn = next_insn(p, BRW_OPCODE_SEND); | |||
GLuint msg_length = (function == BRW_MATH_FUNCTION_POW) ? 2 : 1; | |||
GLuint response_length = (function == BRW_MATH_FUNCTION_SINCOS) ? 2 : 1; | |||
/* Example code doesn't set predicate_control for send | |||
* instructions. | |||
*/ | |||
insn->header.predicate_control = 0; | |||
insn->header.destreg__conditionalmod = msg_reg_nr; | |||
brw_set_dest(insn, dest); | |||
brw_set_src0(insn, src); | |||
brw_set_math_message(p->brw, | |||
insn, | |||
msg_length, response_length, | |||
function, | |||
BRW_MATH_INTEGER_UNSIGNED, | |||
precision, | |||
saturate, | |||
data_type); | |||
} | |||
} | |||
/** |
@@ -136,6 +136,41 @@ const struct brw_tracked_state brw_binding_table_pointers = { | |||
.emit = upload_binding_table_pointers, | |||
}; | |||
/** | |||
* Upload the binding table pointers, which point each stage's array of surface | |||
* state pointers. | |||
* | |||
* The binding table pointers are relative to the surface state base address, | |||
* which is 0. | |||
*/ | |||
static void upload_gen6_binding_table_pointers(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
BEGIN_BATCH(4); | |||
OUT_BATCH(CMD_BINDING_TABLE_PTRS << 16 | | |||
GEN6_BINDING_TABLE_MODIFY_VS | | |||
GEN6_BINDING_TABLE_MODIFY_GS | | |||
GEN6_BINDING_TABLE_MODIFY_PS | | |||
(4 - 2)); | |||
if (brw->vs.bind_bo != NULL) | |||
OUT_RELOC(brw->vs.bind_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0); /* vs */ | |||
else | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); /* gs */ | |||
OUT_RELOC(brw->wm.bind_bo, I915_GEM_DOMAIN_SAMPLER, 0, 0); /* wm/ps */ | |||
ADVANCE_BATCH(); | |||
} | |||
const struct brw_tracked_state gen6_binding_table_pointers = { | |||
.dirty = { | |||
.mesa = 0, | |||
.brw = BRW_NEW_BATCH, | |||
.cache = CACHE_NEW_SURF_BIND, | |||
}, | |||
.prepare = prepare_binding_table_pointers, | |||
.emit = upload_gen6_binding_table_pointers, | |||
}; | |||
/** | |||
* Upload pointers to the per-stage state. | |||
@@ -209,7 +244,14 @@ static void emit_depthbuffer(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
struct intel_region *region = brw->state.depth_region; | |||
unsigned int len = (intel->is_g4x || intel->is_ironlake) ? 6 : 5; | |||
unsigned int len; | |||
if (intel->gen >= 6) | |||
len = 7; | |||
else if (intel->is_g4x || intel->is_ironlake) | |||
len = 6; | |||
else | |||
len = 5; | |||
if (region == NULL) { | |||
BEGIN_BATCH(len); | |||
@@ -220,9 +262,12 @@ static void emit_depthbuffer(struct brw_context *brw) | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
if (intel->is_g4x || intel->is_ironlake) | |||
if (intel->is_g4x || intel->is_ironlake || intel->gen >= 6) | |||
OUT_BATCH(0); | |||
if (intel->gen >= 6) | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
} else { | |||
unsigned int format; | |||
@@ -243,6 +288,8 @@ static void emit_depthbuffer(struct brw_context *brw) | |||
} | |||
assert(region->tiling != I915_TILING_X); | |||
if (IS_GEN6(intel->intelScreen->deviceID)) | |||
assert(region->tiling != I915_TILING_NONE); | |||
BEGIN_BATCH(len); | |||
OUT_BATCH(CMD_DEPTH_BUFFER << 16 | (len - 2)); | |||
@@ -259,9 +306,20 @@ static void emit_depthbuffer(struct brw_context *brw) | |||
((region->height - 1) << 19)); | |||
OUT_BATCH(0); | |||
if (intel->is_g4x || intel->is_ironlake) | |||
if (intel->is_g4x || intel->is_ironlake || intel->gen >= 6) | |||
OUT_BATCH(0); | |||
if (intel->gen >= 6) | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
} | |||
/* Initialize it for safety. */ | |||
if (intel->gen >= 6) { | |||
BEGIN_BATCH(2); | |||
OUT_BATCH(CMD_3D_CLEAR_PARAMS << 16 | (2 - 2)); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
} | |||
} | |||
@@ -435,6 +493,8 @@ const struct brw_tracked_state brw_line_stipple = { | |||
static void upload_invarient_state( struct brw_context *brw ) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
{ | |||
/* 0x61040000 Pipeline Select */ | |||
/* PipelineSelect : 0 */ | |||
@@ -446,7 +506,7 @@ static void upload_invarient_state( struct brw_context *brw ) | |||
BRW_BATCH_STRUCT(brw, &ps); | |||
} | |||
{ | |||
if (intel->gen < 6) { | |||
struct brw_global_depth_offset_clamp gdo; | |||
memset(&gdo, 0, sizeof(gdo)); | |||
@@ -459,6 +519,32 @@ static void upload_invarient_state( struct brw_context *brw ) | |||
BRW_BATCH_STRUCT(brw, &gdo); | |||
} | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
if (intel->gen >= 6) { | |||
int i; | |||
BEGIN_BATCH(3); | |||
OUT_BATCH(CMD_3D_MULTISAMPLE << 16 | (3 - 2)); | |||
OUT_BATCH(MS_PIXEL_LOCATION_CENTER | | |||
MS_NUMSAMPLES_1); | |||
OUT_BATCH(0); /* positions for 4/8-sample */ | |||
ADVANCE_BATCH(); | |||
BEGIN_BATCH(2); | |||
OUT_BATCH(CMD_3D_SAMPLE_MASK << 16 | (2 - 2)); | |||
OUT_BATCH(1); | |||
ADVANCE_BATCH(); | |||
for (i = 0; i < 4; i++) { | |||
BEGIN_BATCH(4); | |||
OUT_BATCH(CMD_GS_SVB_INDEX << 16 | (4 - 2)); | |||
OUT_BATCH(i << SVB_INDEX_SHIFT); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0xffffffff); | |||
ADVANCE_BATCH(); | |||
} | |||
} | |||
/* 0x61020000 State Instruction Pointer */ | |||
{ | |||
@@ -509,7 +595,20 @@ static void upload_state_base_address( struct brw_context *brw ) | |||
/* Output the structure (brw_state_base_address) directly to the | |||
* batchbuffer, so we can emit relocations inline. | |||
*/ | |||
if (intel->is_ironlake) { | |||
if (intel->gen >= 6) { | |||
BEGIN_BATCH(10); | |||
OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (10 - 2)); | |||
OUT_BATCH(1); /* General state base address */ | |||
OUT_BATCH(1); /* Surface state base address */ | |||
OUT_BATCH(1); /* Dynamic state base address */ | |||
OUT_BATCH(1); /* Indirect object base address */ | |||
OUT_BATCH(1); /* Instruction base address */ | |||
OUT_BATCH(1); /* General state upper bound */ | |||
OUT_BATCH(1); /* Dynamic state upper bound */ | |||
OUT_BATCH(1); /* Indirect object upper bound */ | |||
OUT_BATCH(1); /* Instruction access upper bound */ | |||
ADVANCE_BATCH(); | |||
} else if (intel->is_ironlake) { | |||
BEGIN_BATCH(8); | |||
OUT_BATCH(CMD_STATE_BASE_ADDRESS << 16 | (8 - 2)); | |||
OUT_BATCH(1); /* General state base address */ |
@@ -90,6 +90,23 @@ const struct brw_tracked_state brw_drawing_rect; | |||
const struct brw_tracked_state brw_indices; | |||
const struct brw_tracked_state brw_vertices; | |||
const struct brw_tracked_state brw_index_buffer; | |||
const struct brw_tracked_state gen6_binding_table_pointers; | |||
const struct brw_tracked_state gen6_blend_state; | |||
const struct brw_tracked_state gen6_cc_state_pointers; | |||
const struct brw_tracked_state gen6_cc_vp; | |||
const struct brw_tracked_state gen6_clip_state; | |||
const struct brw_tracked_state gen6_clip_vp; | |||
const struct brw_tracked_state gen6_color_calc_state; | |||
const struct brw_tracked_state gen6_depth_stencil_state; | |||
const struct brw_tracked_state gen6_gs_state; | |||
const struct brw_tracked_state gen6_sampler_state; | |||
const struct brw_tracked_state gen6_scissor_state; | |||
const struct brw_tracked_state gen6_sf_state; | |||
const struct brw_tracked_state gen6_sf_vp; | |||
const struct brw_tracked_state gen6_urb; | |||
const struct brw_tracked_state gen6_viewport_state; | |||
const struct brw_tracked_state gen6_vs_state; | |||
const struct brw_tracked_state gen6_wm_state; | |||
/** | |||
* Use same key for WM and VS surfaces. |
@@ -390,6 +390,7 @@ brw_init_non_surface_cache(struct brw_context *brw) | |||
brw_init_cache_id(cache, "GS_UNIT", BRW_GS_UNIT); | |||
brw_init_cache_id(cache, "GS_PROG", BRW_GS_PROG); | |||
brw_init_cache_id(cache, "BLEND_STATE", BRW_BLEND_STATE); | |||
} | |||
@@ -35,8 +35,15 @@ | |||
#include "brw_state.h" | |||
#include "intel_batchbuffer.h" | |||
#include "intel_buffers.h" | |||
#include "intel_chipset.h" | |||
static const struct brw_tracked_state *atoms[] = | |||
/* This is used to initialize brw->state.atoms[]. We could use this | |||
* list directly except for a single atom, brw_constant_buffer, which | |||
* has a .dirty value which changes according to the parameters of the | |||
* current fragment and vertex programs, and so cannot be a static | |||
* value. | |||
*/ | |||
static const struct brw_tracked_state *gen4_atoms[] = | |||
{ | |||
&brw_check_fallback, | |||
@@ -95,6 +102,63 @@ static const struct brw_tracked_state *atoms[] = | |||
&brw_constant_buffer | |||
}; | |||
const struct brw_tracked_state *gen6_atoms[] = | |||
{ | |||
&brw_check_fallback, | |||
&brw_wm_input_sizes, | |||
&brw_vs_prog, | |||
&brw_gs_prog, | |||
&brw_wm_prog, | |||
&gen6_clip_vp, | |||
&gen6_sf_vp, | |||
&gen6_cc_vp, | |||
/* Command packets: */ | |||
&brw_invarient_state, | |||
&gen6_viewport_state, /* must do after *_vp stages */ | |||
&gen6_urb, | |||
&gen6_blend_state, /* must do before cc unit */ | |||
&gen6_color_calc_state, /* must do before cc unit */ | |||
&gen6_depth_stencil_state, /* must do before cc unit */ | |||
&gen6_cc_state_pointers, | |||
&brw_vs_surfaces, /* must do before unit */ | |||
&brw_wm_constant_surface, /* must do before wm surfaces/bind bo */ | |||
&brw_wm_surfaces, /* must do before samplers and unit */ | |||
&brw_wm_samplers, | |||
&gen6_sampler_state, | |||
&gen6_vs_state, | |||
&gen6_gs_state, | |||
&gen6_clip_state, | |||
&gen6_sf_state, | |||
&gen6_wm_state, | |||
&gen6_scissor_state, | |||
&brw_state_base_address, | |||
&gen6_binding_table_pointers, | |||
&brw_depthbuffer, | |||
&brw_polygon_stipple, | |||
&brw_polygon_stipple_offset, | |||
&brw_line_stipple, | |||
&brw_aa_line_parameters, | |||
&brw_drawing_rect, | |||
&brw_indices, | |||
&brw_index_buffer, | |||
&brw_vertices, | |||
}; | |||
void brw_init_state( struct brw_context *brw ) | |||
{ | |||
@@ -211,6 +275,7 @@ static struct dirty_bit_map brw_bits[] = { | |||
}; | |||
static struct dirty_bit_map cache_bits[] = { | |||
DEFINE_BIT(CACHE_NEW_BLEND_STATE), | |||
DEFINE_BIT(CACHE_NEW_CC_VP), | |||
DEFINE_BIT(CACHE_NEW_CC_UNIT), | |||
DEFINE_BIT(CACHE_NEW_WM_PROG), | |||
@@ -270,6 +335,8 @@ void brw_validate_state( struct brw_context *brw ) | |||
struct intel_context *intel = &brw->intel; | |||
struct brw_state_flags *state = &brw->state.dirty; | |||
GLuint i; | |||
const struct brw_tracked_state **atoms; | |||
int num_atoms; | |||
brw_clear_validated_bos(brw); | |||
@@ -278,6 +345,14 @@ void brw_validate_state( struct brw_context *brw ) | |||
brw_add_validated_bo(brw, intel->batch->buf); | |||
if (IS_GEN6(intel->intelScreen->deviceID)) { | |||
atoms = gen6_atoms; | |||
num_atoms = ARRAY_SIZE(gen6_atoms); | |||
} else { | |||
atoms = gen4_atoms; | |||
num_atoms = ARRAY_SIZE(gen4_atoms); | |||
} | |||
if (brw->emit_state_always) { | |||
state->mesa |= ~0; | |||
state->brw |= ~0; | |||
@@ -305,7 +380,7 @@ void brw_validate_state( struct brw_context *brw ) | |||
brw->intel.Fallback = GL_FALSE; /* boolean, not bitfield */ | |||
/* do prepare stage for all atoms */ | |||
for (i = 0; i < Elements(atoms); i++) { | |||
for (i = 0; i < num_atoms; i++) { | |||
const struct brw_tracked_state *atom = atoms[i]; | |||
if (brw->intel.Fallback) | |||
@@ -337,9 +412,20 @@ void brw_validate_state( struct brw_context *brw ) | |||
void brw_upload_state(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
struct brw_state_flags *state = &brw->state.dirty; | |||
int i; | |||
static int dirty_count = 0; | |||
const struct brw_tracked_state **atoms; | |||
int num_atoms; | |||
if (IS_GEN6(intel->intelScreen->deviceID)) { | |||
atoms = gen6_atoms; | |||
num_atoms = ARRAY_SIZE(gen6_atoms); | |||
} else { | |||
atoms = gen4_atoms; | |||
num_atoms = ARRAY_SIZE(gen4_atoms); | |||
} | |||
brw_clear_validated_bos(brw); | |||
@@ -352,7 +438,7 @@ void brw_upload_state(struct brw_context *brw) | |||
memset(&examined, 0, sizeof(examined)); | |||
prev = *state; | |||
for (i = 0; i < Elements(atoms); i++) { | |||
for (i = 0; i < num_atoms; i++) { | |||
const struct brw_tracked_state *atom = atoms[i]; | |||
struct brw_state_flags generated; | |||
@@ -381,7 +467,7 @@ void brw_upload_state(struct brw_context *brw) | |||
} | |||
} | |||
else { | |||
for (i = 0; i < Elements(atoms); i++) { | |||
for (i = 0; i < num_atoms; i++) { | |||
const struct brw_tracked_state *atom = atoms[i]; | |||
if (brw->intel.Fallback) |
@@ -658,7 +658,105 @@ struct brw_clip_unit_state | |||
GLfloat viewport_ymax; | |||
}; | |||
struct gen6_blend_state | |||
{ | |||
struct { | |||
GLuint dest_blend_factor:5; | |||
GLuint source_blend_factor:5; | |||
GLuint pad3:1; | |||
GLuint blend_func:3; | |||
GLuint pad2:1; | |||
GLuint ia_dest_blend_factor:5; | |||
GLuint ia_source_blend_factor:5; | |||
GLuint pad1:1; | |||
GLuint ia_blend_func:3; | |||
GLuint pad0:1; | |||
GLuint ia_blend_enable:1; | |||
GLuint blend_enable:1; | |||
} blend0; | |||
struct { | |||
GLuint post_blend_clamp_enable:1; | |||
GLuint pre_blend_clamp_enable:1; | |||
GLuint clamp_range:2; | |||
GLuint pad0:4; | |||
GLuint x_dither_offset:2; | |||
GLuint y_dither_offset:2; | |||
GLuint dither_enable:1; | |||
GLuint alpha_test_func:3; | |||
GLuint alpha_test_enable:1; | |||
GLuint pad1:1; | |||
GLuint logic_op_func:4; | |||
GLuint logic_op_enable:1; | |||
GLuint pad2:1; | |||
GLuint write_disable_b:1; | |||
GLuint write_disable_g:1; | |||
GLuint write_disable_r:1; | |||
GLuint write_disable_a:1; | |||
GLuint pad3:1; | |||
GLuint alpha_to_coverage_dither:1; | |||
GLuint alpha_to_one:1; | |||
GLuint alpha_to_coverage:1; | |||
} blend1; | |||
}; | |||
struct gen6_color_calc_state | |||
{ | |||
struct { | |||
GLuint alpha_test_format:1; | |||
GLuint pad0:14; | |||
GLuint round_disable:1; | |||
GLuint bf_stencil_ref:8; | |||
GLuint stencil_ref:8; | |||
} cc0; | |||
union { | |||
GLfloat alpha_ref_f; | |||
struct { | |||
GLuint ui:8; | |||
GLuint pad0:24; | |||
} alpha_ref_fi; | |||
} cc1; | |||
GLfloat constant_r; | |||
GLfloat constant_g; | |||
GLfloat constant_b; | |||
GLfloat constant_a; | |||
}; | |||
struct gen6_depth_stencil_state | |||
{ | |||
struct { | |||
GLuint pad0:3; | |||
GLuint bf_stencil_pass_depth_pass_op:3; | |||
GLuint bf_stencil_pass_depth_fail_op:3; | |||
GLuint bf_stencil_fail_op:3; | |||
GLuint bf_stencil_func:3; | |||
GLuint bf_stencil_enable:1; | |||
GLuint pad1:2; | |||
GLuint stencil_write_enable:1; | |||
GLuint stencil_pass_depth_pass_op:3; | |||
GLuint stencil_pass_depth_fail_op:3; | |||
GLuint stencil_fail_op:3; | |||
GLuint stencil_func:3; | |||
GLuint stencil_enable:1; | |||
} ds0; | |||
struct { | |||
GLuint bf_stencil_write_mask:8; | |||
GLuint bf_stencil_test_mask:8; | |||
GLuint stencil_write_mask:8; | |||
GLuint stencil_test_mask:8; | |||
} ds1; | |||
struct { | |||
GLuint pad0:25; | |||
GLuint depth_write_enable:1; | |||
GLuint depth_test_func:3; | |||
GLuint pad1:1; | |||
GLuint depth_test_enable:1; | |||
} ds2; | |||
}; | |||
struct brw_cc_unit_state | |||
{ | |||
@@ -752,8 +850,6 @@ struct brw_cc_unit_state | |||
} cc7; | |||
}; | |||
struct brw_sf_unit_state | |||
{ | |||
struct thread0 thread0; | |||
@@ -813,6 +909,11 @@ struct brw_sf_unit_state | |||
}; | |||
struct gen6_scissor_state | |||
{ | |||
GLuint ymin, xmin; | |||
GLuint ymax, xmax; | |||
}; | |||
struct brw_gs_unit_state | |||
{ | |||
@@ -1043,6 +1144,15 @@ struct brw_sf_viewport | |||
} scissor; | |||
}; | |||
struct gen6_sf_viewport { | |||
GLfloat m00; | |||
GLfloat m11; | |||
GLfloat m22; | |||
GLfloat m30; | |||
GLfloat m31; | |||
GLfloat m32; | |||
}; | |||
/* Documented in the subsystem/shared-functions/sampler chapter... | |||
*/ | |||
struct brw_surface_state |
@@ -479,9 +479,11 @@ static void emit_math1( struct brw_vs_compile *c, | |||
* whether that turns out to be a simulator bug or not: | |||
*/ | |||
struct brw_compile *p = &c->func; | |||
struct intel_context *intel = &p->brw->intel; | |||
struct brw_reg tmp = dst; | |||
GLboolean need_tmp = (dst.dw1.bits.writemask != 0xf || | |||
dst.file != BRW_GENERAL_REGISTER_FILE); | |||
GLboolean need_tmp = (intel->gen < 6 && | |||
(dst.dw1.bits.writemask != 0xf || | |||
dst.file != BRW_GENERAL_REGISTER_FILE)); | |||
if (need_tmp) | |||
tmp = get_tmp(c); | |||
@@ -510,9 +512,11 @@ static void emit_math2( struct brw_vs_compile *c, | |||
GLuint precision) | |||
{ | |||
struct brw_compile *p = &c->func; | |||
struct intel_context *intel = &p->brw->intel; | |||
struct brw_reg tmp = dst; | |||
GLboolean need_tmp = (dst.dw1.bits.writemask != 0xf || | |||
dst.file != BRW_GENERAL_REGISTER_FILE); | |||
GLboolean need_tmp = (intel->gen < 6 && | |||
(dst.dw1.bits.writemask != 0xf || | |||
dst.file != BRW_GENERAL_REGISTER_FILE)); | |||
if (need_tmp) | |||
tmp = get_tmp(c); |
@@ -102,6 +102,9 @@ static void brw_destroy_context( struct intel_context *intel ) | |||
dri_bo_release(&brw->cc.prog_bo); | |||
dri_bo_release(&brw->cc.state_bo); | |||
dri_bo_release(&brw->cc.vp_bo); | |||
dri_bo_release(&brw->cc.blend_state_bo); | |||
dri_bo_release(&brw->cc.depth_stencil_state_bo); | |||
dri_bo_release(&brw->cc.color_calc_state_bo); | |||
} | |||
@@ -509,7 +509,7 @@ brw_update_renderbuffer_surface(struct brw_context *brw, | |||
struct gl_renderbuffer *rb, | |||
unsigned int unit) | |||
{ | |||
struct intel_context *intel = &brw->intel;; | |||
struct intel_context *intel = &brw->intel; | |||
GLcontext *ctx = &intel->ctx; | |||
dri_bo *region_bo = NULL; | |||
struct intel_renderbuffer *irb = intel_renderbuffer(rb); | |||
@@ -576,18 +576,21 @@ brw_update_renderbuffer_surface(struct brw_context *brw, | |||
key.draw_x = 0; | |||
key.draw_y = 0; | |||
} | |||
/* _NEW_COLOR */ | |||
memcpy(key.color_mask, ctx->Color.ColorMask[unit], | |||
sizeof(key.color_mask)); | |||
/* As mentioned above, disable writes to the alpha component when the | |||
* renderbuffer is XRGB. | |||
*/ | |||
if (ctx->DrawBuffer->Visual.alphaBits == 0) | |||
key.color_mask[3] = GL_FALSE; | |||
if (intel->gen < 6) { | |||
/* _NEW_COLOR */ | |||
memcpy(key.color_mask, ctx->Color.ColorMask[unit], | |||
sizeof(key.color_mask)); | |||
/* As mentioned above, disable writes to the alpha component when the | |||
* renderbuffer is XRGB. | |||
*/ | |||
if (ctx->DrawBuffer->Visual.alphaBits == 0) | |||
key.color_mask[3] = GL_FALSE; | |||
key.color_blend = (!ctx->Color._LogicOpEnabled && | |||
(ctx->Color.BlendEnabled & (1 << unit))); | |||
key.color_blend = (!ctx->Color._LogicOpEnabled && | |||
(ctx->Color.BlendEnabled & (1 << unit))); | |||
} | |||
dri_bo_unreference(brw->wm.surf_bo[unit]); | |||
brw->wm.surf_bo[unit] = brw_search_cache(&brw->surface_cache, | |||
@@ -639,12 +642,14 @@ brw_update_renderbuffer_surface(struct brw_context *brw, | |||
brw_set_surface_tiling(&surf, key.tiling); | |||
surf.ss3.pitch = (key.pitch * key.cpp) - 1; | |||
/* _NEW_COLOR */ | |||
surf.ss0.color_blend = key.color_blend; | |||
surf.ss0.writedisable_red = !key.color_mask[0]; | |||
surf.ss0.writedisable_green = !key.color_mask[1]; | |||
surf.ss0.writedisable_blue = !key.color_mask[2]; | |||
surf.ss0.writedisable_alpha = !key.color_mask[3]; | |||
if (intel->gen < 6) { | |||
/* _NEW_COLOR */ | |||
surf.ss0.color_blend = key.color_blend; | |||
surf.ss0.writedisable_red = !key.color_mask[0]; | |||
surf.ss0.writedisable_green = !key.color_mask[1]; | |||
surf.ss0.writedisable_blue = !key.color_mask[2]; | |||
surf.ss0.writedisable_alpha = !key.color_mask[3]; | |||
} | |||
/* Key size will never match key size for textures, so we're safe. */ | |||
brw->wm.surf_bo[unit] = brw_upload_cache(&brw->surface_cache, |
@@ -0,0 +1,298 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "intel_batchbuffer.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
struct brw_blend_state_key { | |||
GLboolean color_blend, alpha_enabled; | |||
GLenum logic_op; | |||
GLenum blend_eq_rgb, blend_eq_a; | |||
GLenum blend_src_rgb, blend_src_a; | |||
GLenum blend_dst_rgb, blend_dst_a; | |||
GLenum alpha_func; | |||
GLboolean dither; | |||
}; | |||
static void | |||
blend_state_populate_key(struct brw_context *brw, | |||
struct brw_blend_state_key *key) | |||
{ | |||
GLcontext *ctx = &brw->intel.ctx; | |||
memset(key, 0, sizeof(*key)); | |||
/* _NEW_COLOR */ | |||
if (ctx->Color._LogicOpEnabled) | |||
key->logic_op = ctx->Color.LogicOp; | |||
else | |||
key->logic_op = GL_COPY; | |||
/* _NEW_COLOR */ | |||
key->color_blend = ctx->Color.BlendEnabled; | |||
if (key->color_blend) { | |||
key->blend_eq_rgb = ctx->Color.BlendEquationRGB; | |||
key->blend_eq_a = ctx->Color.BlendEquationA; | |||
key->blend_src_rgb = ctx->Color.BlendSrcRGB; | |||
key->blend_dst_rgb = ctx->Color.BlendDstRGB; | |||
key->blend_src_a = ctx->Color.BlendSrcA; | |||
key->blend_dst_a = ctx->Color.BlendDstA; | |||
} | |||
/* _NEW_COLOR */ | |||
key->alpha_enabled = ctx->Color.AlphaEnabled; | |||
if (key->alpha_enabled) { | |||
key->alpha_func = ctx->Color.AlphaFunc; | |||
} | |||
/* _NEW_COLOR */ | |||
key->dither = ctx->Color.DitherFlag; | |||
} | |||
/** | |||
* Creates the state cache entry for the given CC unit key. | |||
*/ | |||
static drm_intel_bo * | |||
blend_state_create_from_key(struct brw_context *brw, | |||
struct brw_blend_state_key *key) | |||
{ | |||
struct gen6_blend_state blend; | |||
drm_intel_bo *bo; | |||
memset(&blend, 0, sizeof(blend)); | |||
if (key->logic_op != GL_COPY) { | |||
blend.blend1.logic_op_enable = 1; | |||
blend.blend1.logic_op_func = intel_translate_logic_op(key->logic_op); | |||
} else if (key->color_blend) { | |||
GLenum eqRGB = key->blend_eq_rgb; | |||
GLenum eqA = key->blend_eq_a; | |||
GLenum srcRGB = key->blend_src_rgb; | |||
GLenum dstRGB = key->blend_dst_rgb; | |||
GLenum srcA = key->blend_src_a; | |||
GLenum dstA = key->blend_dst_a; | |||
if (eqRGB == GL_MIN || eqRGB == GL_MAX) { | |||
srcRGB = dstRGB = GL_ONE; | |||
} | |||
if (eqA == GL_MIN || eqA == GL_MAX) { | |||
srcA = dstA = GL_ONE; | |||
} | |||
blend.blend0.dest_blend_factor = brw_translate_blend_factor(dstRGB); | |||
blend.blend0.source_blend_factor = brw_translate_blend_factor(srcRGB); | |||
blend.blend0.blend_func = brw_translate_blend_equation(eqRGB); | |||
blend.blend0.ia_dest_blend_factor = brw_translate_blend_factor(dstA); | |||
blend.blend0.ia_source_blend_factor = brw_translate_blend_factor(srcA); | |||
blend.blend0.ia_blend_func = brw_translate_blend_equation(eqA); | |||
blend.blend0.blend_enable = 1; | |||
blend.blend0.ia_blend_enable = (srcA != srcRGB || | |||
dstA != dstRGB || | |||
eqA != eqRGB); | |||
} | |||
if (key->alpha_enabled) { | |||
blend.blend1.alpha_test_enable = 1; | |||
blend.blend1.alpha_test_func = intel_translate_compare_func(key->alpha_func); | |||
} | |||
if (key->dither) { | |||
blend.blend1.dither_enable = 1; | |||
blend.blend1.y_dither_offset = 0; | |||
blend.blend1.x_dither_offset = 0; | |||
} | |||
bo = brw_upload_cache(&brw->cache, BRW_BLEND_STATE, | |||
key, sizeof(*key), | |||
NULL, 0, | |||
&blend, sizeof(blend)); | |||
return bo; | |||
} | |||
static void | |||
prepare_blend_state(struct brw_context *brw) | |||
{ | |||
struct brw_blend_state_key key; | |||
blend_state_populate_key(brw, &key); | |||
drm_intel_bo_unreference(brw->cc.blend_state_bo); | |||
brw->cc.blend_state_bo = brw_search_cache(&brw->cache, BRW_BLEND_STATE, | |||
&key, sizeof(key), | |||
NULL, 0, | |||
NULL); | |||
if (brw->cc.blend_state_bo == NULL) | |||
brw->cc.blend_state_bo = blend_state_create_from_key(brw, &key); | |||
} | |||
const struct brw_tracked_state gen6_blend_state = { | |||
.dirty = { | |||
.mesa = _NEW_COLOR, | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_blend_state, | |||
}; | |||
struct brw_color_calc_state_key { | |||
GLubyte blend_constant_color[4]; | |||
GLclampf alpha_ref; | |||
GLubyte stencil_ref[2]; | |||
}; | |||
static void | |||
color_calc_state_populate_key(struct brw_context *brw, | |||
struct brw_color_calc_state_key *key) | |||
{ | |||
GLcontext *ctx = &brw->intel.ctx; | |||
memset(key, 0, sizeof(*key)); | |||
/* _NEW_STENCIL */ | |||
if (ctx->Stencil._Enabled) { | |||
const unsigned back = ctx->Stencil._BackFace; | |||
key->stencil_ref[0] = ctx->Stencil.Ref[0]; | |||
if (ctx->Stencil._TestTwoSide) | |||
key->stencil_ref[1] = ctx->Stencil.Ref[back]; | |||
} | |||
/* _NEW_COLOR */ | |||
if (ctx->Color.AlphaEnabled) | |||
key->alpha_ref = ctx->Color.AlphaRef; | |||
key->blend_constant_color[0] = ctx->Color.BlendColor[0]; | |||
key->blend_constant_color[1] = ctx->Color.BlendColor[1]; | |||
key->blend_constant_color[2] = ctx->Color.BlendColor[2]; | |||
key->blend_constant_color[3] = ctx->Color.BlendColor[3]; | |||
} | |||
/** | |||
* Creates the state cache entry for the given CC state key. | |||
*/ | |||
static drm_intel_bo * | |||
color_calc_state_create_from_key(struct brw_context *brw, | |||
struct brw_color_calc_state_key *key) | |||
{ | |||
struct gen6_color_calc_state cc; | |||
drm_intel_bo *bo; | |||
memset(&cc, 0, sizeof(cc)); | |||
cc.cc0.alpha_test_format = BRW_ALPHATEST_FORMAT_UNORM8; | |||
UNCLAMPED_FLOAT_TO_UBYTE(cc.cc1.alpha_ref_fi.ui, key->alpha_ref); | |||
cc.cc0.stencil_ref = key->stencil_ref[0]; | |||
cc.cc0.bf_stencil_ref = key->stencil_ref[1]; | |||
cc.constant_r = key->blend_constant_color[0]; | |||
cc.constant_g = key->blend_constant_color[1]; | |||
cc.constant_b = key->blend_constant_color[2]; | |||
cc.constant_a = key->blend_constant_color[3]; | |||
bo = brw_upload_cache(&brw->cache, BRW_COLOR_CALC_STATE, | |||
key, sizeof(*key), | |||
NULL, 0, | |||
&cc, sizeof(cc)); | |||
return bo; | |||
} | |||
static void | |||
prepare_color_calc_state(struct brw_context *brw) | |||
{ | |||
struct brw_color_calc_state_key key; | |||
color_calc_state_populate_key(brw, &key); | |||
drm_intel_bo_unreference(brw->cc.state_bo); | |||
brw->cc.state_bo = brw_search_cache(&brw->cache, BRW_COLOR_CALC_STATE, | |||
&key, sizeof(key), | |||
NULL, 0, | |||
NULL); | |||
if (brw->cc.state_bo == NULL) | |||
brw->cc.state_bo = color_calc_state_create_from_key(brw, &key); | |||
} | |||
const struct brw_tracked_state gen6_color_calc_state = { | |||
.dirty = { | |||
.mesa = _NEW_COLOR, | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_color_calc_state, | |||
}; | |||
static void upload_cc_state_pointers(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
BEGIN_BATCH(4); | |||
OUT_BATCH(CMD_3D_CC_STATE_POINTERS << 16 | (4 - 2)); | |||
OUT_RELOC(brw->cc.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
OUT_RELOC(brw->cc.blend_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
OUT_RELOC(brw->cc.depth_stencil_state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
static void prepare_cc_state_pointers(struct brw_context *brw) | |||
{ | |||
brw_add_validated_bo(brw, brw->cc.state_bo); | |||
brw_add_validated_bo(brw, brw->cc.blend_state_bo); | |||
brw_add_validated_bo(brw, brw->cc.depth_stencil_state_bo); | |||
} | |||
const struct brw_tracked_state gen6_cc_state_pointers = { | |||
.dirty = { | |||
.mesa = 0, | |||
.brw = BRW_NEW_BATCH, | |||
.cache = (CACHE_NEW_BLEND_STATE | | |||
CACHE_NEW_COLOR_CALC_STATE | | |||
CACHE_NEW_DEPTH_STENCIL_STATE) | |||
}, | |||
.prepare = prepare_cc_state_pointers, | |||
.emit = upload_cc_state_pointers, | |||
}; |
@@ -0,0 +1,78 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
#include "intel_batchbuffer.h" | |||
static void | |||
upload_clip_state(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
GLcontext *ctx = &intel->ctx; | |||
uint32_t depth_clamp = 0; | |||
uint32_t provoking; | |||
if (!ctx->Transform.DepthClamp) | |||
depth_clamp = GEN6_CLIP_Z_TEST; | |||
if (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION) { | |||
provoking = 0; | |||
} else { | |||
provoking = | |||
(2 << GEN6_CLIP_TRI_PROVOKE_SHIFT) | | |||
(2 << GEN6_CLIP_TRIFAN_PROVOKE_SHIFT) | | |||
(1 << GEN6_CLIP_LINE_PROVOKE_SHIFT); | |||
} | |||
BEGIN_BATCH(4); | |||
OUT_BATCH(CMD_3D_CLIP_STATE << 16 | (4 - 2)); | |||
OUT_BATCH(GEN6_CLIP_STATISTICS_ENABLE); | |||
OUT_BATCH(GEN6_CLIP_ENABLE | | |||
GEN6_CLIP_API_OGL | | |||
GEN6_CLIP_MODE_REJECT_ALL | /* XXX: debug: get VS working */ | |||
GEN6_CLIP_XY_TEST | | |||
depth_clamp | | |||
provoking); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
const struct brw_tracked_state gen6_clip_state = { | |||
.dirty = { | |||
.mesa = _NEW_TRANSFORM, | |||
.brw = BRW_NEW_CONTEXT, | |||
.cache = 0 | |||
}, | |||
.emit = upload_clip_state, | |||
}; |
@@ -0,0 +1,169 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
struct brw_depth_stencil_state_key { | |||
GLenum depth_func; | |||
GLboolean depth_test, depth_write; | |||
GLboolean stencil, stencil_two_side; | |||
GLenum stencil_func[2], stencil_fail_op[2]; | |||
GLenum stencil_pass_depth_fail_op[2], stencil_pass_depth_pass_op[2]; | |||
GLubyte stencil_write_mask[2], stencil_test_mask[2]; | |||
}; | |||
static void | |||
depth_stencil_state_populate_key(struct brw_context *brw, | |||
struct brw_depth_stencil_state_key *key) | |||
{ | |||
GLcontext *ctx = &brw->intel.ctx; | |||
const unsigned back = ctx->Stencil._BackFace; | |||
memset(key, 0, sizeof(*key)); | |||
/* _NEW_STENCIL */ | |||
key->stencil = ctx->Stencil._Enabled; | |||
key->stencil_two_side = ctx->Stencil._TestTwoSide; | |||
if (key->stencil) { | |||
key->stencil_func[0] = ctx->Stencil.Function[0]; | |||
key->stencil_fail_op[0] = ctx->Stencil.FailFunc[0]; | |||
key->stencil_pass_depth_fail_op[0] = ctx->Stencil.ZFailFunc[0]; | |||
key->stencil_pass_depth_pass_op[0] = ctx->Stencil.ZPassFunc[0]; | |||
key->stencil_write_mask[0] = ctx->Stencil.WriteMask[0]; | |||
key->stencil_test_mask[0] = ctx->Stencil.ValueMask[0]; | |||
} | |||
if (key->stencil_two_side) { | |||
key->stencil_func[1] = ctx->Stencil.Function[back]; | |||
key->stencil_fail_op[1] = ctx->Stencil.FailFunc[back]; | |||
key->stencil_pass_depth_fail_op[1] = ctx->Stencil.ZFailFunc[back]; | |||
key->stencil_pass_depth_pass_op[1] = ctx->Stencil.ZPassFunc[back]; | |||
key->stencil_write_mask[1] = ctx->Stencil.WriteMask[back]; | |||
key->stencil_test_mask[1] = ctx->Stencil.ValueMask[back]; | |||
} | |||
key->depth_test = ctx->Depth.Test; | |||
if (key->depth_test) { | |||
key->depth_func = ctx->Depth.Func; | |||
key->depth_write = ctx->Depth.Mask; | |||
} | |||
} | |||
/** | |||
* Creates the state cache entry for the given DEPTH_STENCIL_STATE state key. | |||
*/ | |||
static dri_bo * | |||
depth_stencil_state_create_from_key(struct brw_context *brw, | |||
struct brw_depth_stencil_state_key *key) | |||
{ | |||
struct gen6_depth_stencil_state ds; | |||
dri_bo *bo; | |||
memset(&ds, 0, sizeof(ds)); | |||
/* _NEW_STENCIL */ | |||
if (key->stencil) { | |||
ds.ds0.stencil_enable = 1; | |||
ds.ds0.stencil_func = | |||
intel_translate_compare_func(key->stencil_func[0]); | |||
ds.ds0.stencil_fail_op = | |||
intel_translate_stencil_op(key->stencil_fail_op[0]); | |||
ds.ds0.stencil_pass_depth_fail_op = | |||
intel_translate_stencil_op(key->stencil_pass_depth_fail_op[0]); | |||
ds.ds0.stencil_pass_depth_pass_op = | |||
intel_translate_stencil_op(key->stencil_pass_depth_pass_op[0]); | |||
ds.ds1.stencil_write_mask = key->stencil_write_mask[0]; | |||
ds.ds1.stencil_test_mask = key->stencil_test_mask[0]; | |||
if (key->stencil_two_side) { | |||
ds.ds0.bf_stencil_enable = 1; | |||
ds.ds0.bf_stencil_func = | |||
intel_translate_compare_func(key->stencil_func[1]); | |||
ds.ds0.bf_stencil_fail_op = | |||
intel_translate_stencil_op(key->stencil_fail_op[1]); | |||
ds.ds0.bf_stencil_pass_depth_fail_op = | |||
intel_translate_stencil_op(key->stencil_pass_depth_fail_op[1]); | |||
ds.ds0.bf_stencil_pass_depth_pass_op = | |||
intel_translate_stencil_op(key->stencil_pass_depth_pass_op[1]); | |||
ds.ds1.bf_stencil_write_mask = key->stencil_write_mask[1]; | |||
ds.ds1.bf_stencil_test_mask = key->stencil_test_mask[1]; | |||
} | |||
/* Not really sure about this: | |||
*/ | |||
if (key->stencil_write_mask[0] || | |||
(key->stencil_two_side && key->stencil_write_mask[1])) | |||
ds.ds0.stencil_write_enable = 1; | |||
} | |||
/* _NEW_DEPTH */ | |||
if (key->depth_test) { | |||
ds.ds2.depth_test_enable = 1; | |||
ds.ds2.depth_test_func = intel_translate_compare_func(key->depth_func); | |||
ds.ds2.depth_write_enable = key->depth_write; | |||
} | |||
bo = brw_upload_cache(&brw->cache, BRW_DEPTH_STENCIL_STATE, | |||
key, sizeof(*key), | |||
NULL, 0, | |||
&ds, sizeof(ds)); | |||
return bo; | |||
} | |||
static void | |||
prepare_depth_stencil_state(struct brw_context *brw) | |||
{ | |||
struct brw_depth_stencil_state_key key; | |||
depth_stencil_state_populate_key(brw, &key); | |||
dri_bo_unreference(brw->cc.depth_stencil_state_bo); | |||
brw->cc.depth_stencil_state_bo = brw_search_cache(&brw->cache, | |||
BRW_DEPTH_STENCIL_STATE, | |||
&key, sizeof(key), | |||
NULL, 0, | |||
NULL); | |||
if (brw->cc.depth_stencil_state_bo == NULL) | |||
brw->cc.depth_stencil_state_bo = | |||
depth_stencil_state_create_from_key(brw, &key); | |||
} | |||
const struct brw_tracked_state gen6_depth_stencil_state = { | |||
.dirty = { | |||
.mesa = _NEW_DEPTH | _NEW_STENCIL, | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_depth_stencil_state, | |||
}; |
@@ -0,0 +1,94 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
#include "intel_batchbuffer.h" | |||
static void | |||
upload_gs_state(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
/* Disable all the constant buffers. */ | |||
BEGIN_BATCH(5); | |||
OUT_BATCH(CMD_3D_CONSTANT_GS_STATE << 16 | (5 - 2)); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
if (brw->gs.prog_bo) { | |||
BEGIN_BATCH(7); | |||
OUT_BATCH(CMD_3D_GS_STATE << 16 | (7 - 2)); | |||
OUT_RELOC(brw->gs.prog_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); | |||
OUT_BATCH((0 << GEN6_GS_SAMPLER_COUNT_SHIFT) | | |||
(0 << GEN6_GS_BINDING_TABLE_ENTRY_COUNT_SHIFT)); | |||
OUT_BATCH(0); /* scratch space base offset */ | |||
OUT_BATCH((1 << GEN6_GS_DISPATCH_START_GRF_SHIFT) | | |||
(brw->gs.prog_data->urb_read_length << GEN6_GS_URB_READ_LENGTH_SHIFT) | | |||
(0 << GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT)); | |||
OUT_BATCH((0 << GEN6_GS_MAX_THREADS_SHIFT) | | |||
GEN6_GS_STATISTICS_ENABLE | | |||
GEN6_GS_RENDERING_ENABLE); | |||
OUT_BATCH(GEN6_GS_ENABLE); | |||
ADVANCE_BATCH(); | |||
} else { | |||
BEGIN_BATCH(7); | |||
OUT_BATCH(CMD_3D_GS_STATE << 16 | (7 - 2)); | |||
OUT_BATCH(0); /* prog_bo */ | |||
OUT_BATCH((0 << GEN6_GS_SAMPLER_COUNT_SHIFT) | | |||
(0 << GEN6_GS_BINDING_TABLE_ENTRY_COUNT_SHIFT)); | |||
OUT_BATCH(0); /* scratch space base offset */ | |||
OUT_BATCH((1 << GEN6_GS_DISPATCH_START_GRF_SHIFT) | | |||
(0 << GEN6_GS_URB_READ_LENGTH_SHIFT) | | |||
(0 << GEN6_GS_URB_ENTRY_READ_OFFSET_SHIFT)); | |||
OUT_BATCH((0 << GEN6_GS_MAX_THREADS_SHIFT) | | |||
GEN6_GS_STATISTICS_ENABLE | | |||
GEN6_GS_RENDERING_ENABLE); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
} | |||
} | |||
const struct brw_tracked_state gen6_gs_state = { | |||
.dirty = { | |||
.mesa = _NEW_TRANSFORM, | |||
.brw = (BRW_NEW_CURBE_OFFSETS | | |||
BRW_NEW_URB_FENCE | | |||
BRW_NEW_CONTEXT), | |||
.cache = CACHE_NEW_GS_PROG | |||
}, | |||
.emit = upload_gs_state, | |||
}; |
@@ -0,0 +1,74 @@ | |||
/* | |||
* Copyright © 2010 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "intel_batchbuffer.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
static void | |||
upload_sampler_state_pointers(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
BEGIN_BATCH(4); | |||
OUT_BATCH(CMD_3D_SAMPLER_STATE_POINTERS << 16 | | |||
VS_SAMPLER_STATE_CHANGE | | |||
GS_SAMPLER_STATE_CHANGE | | |||
PS_SAMPLER_STATE_CHANGE | | |||
(4 - 2)); | |||
OUT_BATCH(0); /* VS */ | |||
OUT_BATCH(0); /* GS */ | |||
if (brw->wm.sampler_bo) | |||
OUT_RELOC(brw->wm.sampler_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
else | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
static void | |||
prepare_sampler_state_pointers(struct brw_context *brw) | |||
{ | |||
brw_add_validated_bo(brw, brw->wm.sampler_bo); | |||
} | |||
const struct brw_tracked_state gen6_sampler_state = { | |||
.dirty = { | |||
.mesa = 0, | |||
.brw = BRW_NEW_BATCH, | |||
.cache = CACHE_NEW_SAMPLER | |||
}, | |||
.prepare = prepare_sampler_state_pointers, | |||
.emit = upload_sampler_state_pointers, | |||
}; |
@@ -0,0 +1,108 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "intel_batchbuffer.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
static void | |||
prepare_scissor_state(struct brw_context *brw) | |||
{ | |||
GLcontext *ctx = &brw->intel.ctx; | |||
const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0); | |||
struct gen6_scissor_state scissor; | |||
/* _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT */ | |||
/* The scissor only needs to handle the intersection of drawable and | |||
* scissor rect. Clipping to the boundaries of static shared buffers | |||
* for front/back/depth is covered by looping over cliprects in brw_draw.c. | |||
* | |||
* Note that the hardware's coordinates are inclusive, while Mesa's min is | |||
* inclusive but max is exclusive. | |||
*/ | |||
if (render_to_fbo) { | |||
/* texmemory: Y=0=bottom */ | |||
scissor.xmin = ctx->DrawBuffer->_Xmin; | |||
scissor.xmax = ctx->DrawBuffer->_Xmax - 1; | |||
scissor.ymin = ctx->DrawBuffer->_Ymin; | |||
scissor.ymax = ctx->DrawBuffer->_Ymax - 1; | |||
} | |||
else { | |||
/* memory: Y=0=top */ | |||
scissor.xmin = ctx->DrawBuffer->_Xmin; | |||
scissor.xmax = ctx->DrawBuffer->_Xmax - 1; | |||
scissor.ymin = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymax; | |||
scissor.ymax = ctx->DrawBuffer->Height - ctx->DrawBuffer->_Ymin - 1; | |||
} | |||
drm_intel_bo_unreference(brw->sf.state_bo); | |||
brw->sf.state_bo = brw_cache_data(&brw->cache, BRW_SF_UNIT, | |||
&scissor, sizeof(scissor), | |||
NULL, 0); | |||
} | |||
const struct brw_tracked_state gen6_scissor_state = { | |||
.dirty = { | |||
.mesa = _NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT, | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_scissor_state, | |||
}; | |||
static void upload_scissor_state_pointers(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
BEGIN_BATCH(2); | |||
OUT_BATCH(CMD_3D_SCISSOR_STATE_POINTERS << 16 | (2 - 2)); | |||
OUT_RELOC(brw->sf.state_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
static void prepare_scissor_state_pointers(struct brw_context *brw) | |||
{ | |||
brw_add_validated_bo(brw, brw->sf.state_bo); | |||
} | |||
const struct brw_tracked_state gen6_scissor_state_pointers = { | |||
.dirty = { | |||
.mesa = 0, | |||
.brw = BRW_NEW_BATCH, | |||
.cache = CACHE_NEW_SF_UNIT | |||
}, | |||
.prepare = prepare_scissor_state_pointers, | |||
.emit = upload_scissor_state_pointers, | |||
}; |
@@ -0,0 +1,149 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
#include "intel_batchbuffer.h" | |||
static void | |||
upload_sf_state(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
GLcontext *ctx = &intel->ctx; | |||
/* CACHE_NEW_VS_PROG */ | |||
uint32_t num_inputs = brw_count_bits(brw->vs.prog_data->outputs_written); | |||
/* This should probably be FS inputs read */ | |||
uint32_t num_outputs = brw_count_bits(brw->vs.prog_data->outputs_written); | |||
uint32_t dw1, dw2, dw3, dw4; | |||
int i; | |||
/* _NEW_BUFFER */ | |||
GLboolean render_to_fbo = brw->intel.ctx.DrawBuffer->Name != 0; | |||
dw1 = | |||
num_outputs << GEN6_SF_NUM_OUTPUTS_SHIFT | | |||
num_inputs << GEN6_SF_URB_ENTRY_READ_LENGTH_SHIFT | | |||
3 << GEN6_SF_URB_ENTRY_READ_OFFSET_SHIFT; | |||
dw2 = GEN6_SF_VIEWPORT_TRANSFORM_ENABLE | | |||
GEN6_SF_STATISTICS_ENABLE; | |||
dw3 = 0; | |||
dw4 = 0; | |||
/* _NEW_POLYGON */ | |||
if ((ctx->Polygon.FrontFace == GL_CCW) ^ render_to_fbo) | |||
dw2 |= GEN6_SF_WINDING_CCW; | |||
/* _NEW_SCISSOR */ | |||
if (ctx->Scissor.Enabled) | |||
dw3 |= GEN6_SF_SCISSOR_ENABLE; | |||
/* _NEW_POLYGON */ | |||
if (ctx->Polygon.CullFlag) { | |||
switch (ctx->Polygon.CullFaceMode) { | |||
case GL_FRONT: | |||
dw3 |= GEN6_SF_CULL_BOTH; | |||
break; | |||
case GL_BACK: | |||
dw3 |= GEN6_SF_CULL_BACK; | |||
break; | |||
case GL_FRONT_AND_BACK: | |||
dw3 |= GEN6_SF_CULL_BOTH; | |||
break; | |||
default: | |||
assert(0); | |||
break; | |||
} | |||
} else { | |||
dw3 |= GEN6_SF_CULL_NONE; | |||
} | |||
/* _NEW_LINE */ | |||
dw3 |= U_FIXED(CLAMP(ctx->Line.Width, 0.0, 7.99), 7) << | |||
GEN6_SF_LINE_WIDTH_SHIFT; | |||
if (ctx->Line.SmoothFlag) { | |||
dw3 |= GEN6_SF_LINE_AA_ENABLE; | |||
dw3 |= GEN6_SF_LINE_AA_MODE_TRUE; | |||
dw3 |= GEN6_SF_LINE_END_CAP_WIDTH_1_0; | |||
} | |||
/* _NEW_POINT */ | |||
if (ctx->Point._Attenuated) | |||
dw4 |= GEN6_SF_USE_STATE_POINT_WIDTH; | |||
dw4 |= U_FIXED(CLAMP(ctx->Point.Size, 0.125, 225.875), 3) << | |||
GEN6_SF_POINT_WIDTH_SHIFT; | |||
if (render_to_fbo) | |||
dw1 |= GEN6_SF_POINT_SPRITE_LOWERLEFT; | |||
/* _NEW_LIGHT */ | |||
if (ctx->Light.ProvokingVertex != GL_FIRST_VERTEX_CONVENTION) { | |||
dw4 |= | |||
(2 << GEN6_SF_TRI_PROVOKE_SHIFT) | | |||
(2 << GEN6_SF_TRIFAN_PROVOKE_SHIFT) | | |||
(1 << GEN6_SF_LINE_PROVOKE_SHIFT); | |||
} else { | |||
dw4 |= | |||
(1 << GEN6_SF_TRIFAN_PROVOKE_SHIFT); | |||
} | |||
BEGIN_BATCH(20); | |||
OUT_BATCH(CMD_3D_SF_STATE << 16 | (20 - 2)); | |||
OUT_BATCH(dw1); | |||
OUT_BATCH(dw2); | |||
OUT_BATCH(dw3); | |||
OUT_BATCH(dw4); | |||
OUT_BATCH_F(ctx->Polygon.OffsetUnits * 2); /* constant. copied from gen4 */ | |||
OUT_BATCH_F(ctx->Polygon.OffsetFactor); /* scale */ | |||
OUT_BATCH_F(0.0); /* XXX: global depth offset clamp */ | |||
for (i = 0; i < 8; i++) { | |||
/* attribute overrides */ | |||
OUT_BATCH(0); | |||
} | |||
OUT_BATCH(0); /* point sprite texcoord bitmask */ | |||
OUT_BATCH(0); /* constant interp bitmask */ | |||
OUT_BATCH(0); /* wrapshortest enables 0-7 */ | |||
OUT_BATCH(0); /* wrapshortest enables 8-15 */ | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
const struct brw_tracked_state gen6_sf_state = { | |||
.dirty = { | |||
.mesa = (_NEW_LIGHT | | |||
_NEW_POLYGON | | |||
_NEW_LINE | | |||
_NEW_SCISSOR | | |||
_NEW_BUFFERS), | |||
.brw = BRW_NEW_CONTEXT, | |||
.cache = CACHE_NEW_VS_PROG | |||
}, | |||
.emit = upload_sf_state, | |||
}; |
@@ -0,0 +1,83 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "main/macros.h" | |||
#include "intel_batchbuffer.h" | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
static void | |||
prepare_urb( struct brw_context *brw ) | |||
{ | |||
brw->urb.nr_vs_entries = 24; | |||
if (brw->gs.prog_bo) | |||
brw->urb.nr_gs_entries = 4; | |||
else | |||
brw->urb.nr_gs_entries = 0; | |||
/* CACHE_NEW_VS_PROG */ | |||
brw->urb.vs_size = MIN2(brw->vs.prog_data->urb_entry_size, 1); | |||
/* Check that the number of URB rows (8 floats each) allocated is less | |||
* than the URB space. | |||
*/ | |||
assert((brw->urb.nr_vs_entries + | |||
brw->urb.nr_gs_entries) * brw->urb.vs_size * 8 < 64 * 1024); | |||
} | |||
static void | |||
upload_urb(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
assert(brw->urb.nr_vs_entries % 4 == 0); | |||
assert(brw->urb.nr_gs_entries % 4 == 0); | |||
/* GS requirement */ | |||
assert(!brw->gs.prog_bo || brw->urb.vs_size < 5); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
BEGIN_BATCH(3); | |||
OUT_BATCH(CMD_URB << 16 | (3 - 2)); | |||
OUT_BATCH(((brw->urb.vs_size - 1) << GEN6_URB_VS_SIZE_SHIFT) | | |||
((brw->urb.nr_vs_entries) << GEN6_URB_VS_SIZE_SHIFT)); | |||
OUT_BATCH(((brw->urb.vs_size - 1) << GEN6_URB_GS_SIZE_SHIFT) | | |||
((brw->urb.nr_gs_entries) << GEN6_URB_GS_SIZE_SHIFT)); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
const struct brw_tracked_state gen6_urb = { | |||
.dirty = { | |||
.mesa = 0, | |||
.brw = BRW_NEW_CONTEXT, | |||
.cache = CACHE_NEW_VS_PROG, | |||
}, | |||
.prepare = prepare_urb, | |||
.emit = upload_urb, | |||
}; |
@@ -0,0 +1,175 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "intel_batchbuffer.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
/* The clip VP defines the guardband region where expensive clipping is skipped | |||
* and fragments are allowed to be generated and clipped out cheaply by the SF. | |||
* | |||
* By setting it to NDC bounds of [-1,1], we don't do GB clipping. It's | |||
* supposed to cause seams to become visible in apps due to shared edges taking | |||
* different clip/no clip paths depending on whether the rest of the prim ends | |||
* up in the guardband or not. | |||
*/ | |||
static void | |||
prepare_clip_vp(struct brw_context *brw) | |||
{ | |||
struct brw_clipper_viewport vp; | |||
vp.xmin = -1.0; | |||
vp.xmax = 1.0; | |||
vp.ymin = -1.0; | |||
vp.ymax = 1.0; | |||
drm_intel_bo_unreference(brw->clip.vp_bo); | |||
brw->clip.vp_bo = brw_cache_data(&brw->cache, BRW_CLIP_VP, | |||
&vp, sizeof(vp), | |||
NULL, 0); | |||
} | |||
const struct brw_tracked_state gen6_clip_vp = { | |||
.dirty = { | |||
.mesa = _NEW_VIEWPORT, /* XXX: not really, but we need nonzero */ | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_clip_vp, | |||
}; | |||
static void | |||
prepare_sf_vp(struct brw_context *brw) | |||
{ | |||
GLcontext *ctx = &brw->intel.ctx; | |||
const GLfloat depth_scale = 1.0F / ctx->DrawBuffer->_DepthMaxF; | |||
struct brw_sf_viewport sfv; | |||
GLfloat y_scale, y_bias; | |||
const GLboolean render_to_fbo = (ctx->DrawBuffer->Name != 0); | |||
const GLfloat *v = ctx->Viewport._WindowMap.m; | |||
memset(&sfv, 0, sizeof(sfv)); | |||
/* _NEW_BUFFERS */ | |||
if (render_to_fbo) { | |||
y_scale = 1.0; | |||
y_bias = 0; | |||
} else { | |||
y_scale = -1.0; | |||
y_bias = ctx->DrawBuffer->Height; | |||
} | |||
/* _NEW_VIEWPORT */ | |||
sfv.viewport.m00 = v[MAT_SX]; | |||
sfv.viewport.m11 = v[MAT_SY] * y_scale; | |||
sfv.viewport.m22 = v[MAT_SZ] * depth_scale; | |||
sfv.viewport.m30 = v[MAT_TX]; | |||
sfv.viewport.m31 = v[MAT_TY] * y_scale + y_bias; | |||
sfv.viewport.m32 = v[MAT_TZ] * depth_scale; | |||
drm_intel_bo_unreference(brw->sf.vp_bo); | |||
brw->sf.vp_bo = brw_cache_data(&brw->cache, BRW_SF_VP, | |||
&sfv, sizeof(sfv), | |||
NULL, 0); | |||
} | |||
const struct brw_tracked_state gen6_sf_vp = { | |||
.dirty = { | |||
.mesa = _NEW_VIEWPORT | _NEW_BUFFERS, | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_sf_vp, | |||
}; | |||
static void | |||
prepare_cc_vp(struct brw_context *brw) | |||
{ | |||
GLcontext *ctx = &brw->intel.ctx; | |||
struct brw_cc_viewport ccv; | |||
/* _NEW_TRANSOFORM */ | |||
if (ctx->Transform.DepthClamp) { | |||
/* _NEW_VIEWPORT */ | |||
ccv.min_depth = MIN2(ctx->Viewport.Near, ctx->Viewport.Far); | |||
ccv.max_depth = MAX2(ctx->Viewport.Near, ctx->Viewport.Far); | |||
} else { | |||
ccv.min_depth = 0.0; | |||
ccv.max_depth = 1.0; | |||
} | |||
drm_intel_bo_unreference(brw->cc.vp_bo); | |||
brw->cc.vp_bo = brw_cache_data(&brw->cache, BRW_CC_VP, &ccv, sizeof(ccv), | |||
NULL, 0); | |||
} | |||
const struct brw_tracked_state gen6_cc_vp = { | |||
.dirty = { | |||
.mesa = _NEW_VIEWPORT | _NEW_TRANSFORM, | |||
.brw = 0, | |||
.cache = 0, | |||
}, | |||
.prepare = prepare_cc_vp, | |||
}; | |||
static void prepare_viewport_state_pointers(struct brw_context *brw) | |||
{ | |||
brw_add_validated_bo(brw, brw->sf.state_bo); | |||
} | |||
static void upload_viewport_state_pointers(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
BEGIN_BATCH(4); | |||
OUT_BATCH(CMD_VIEWPORT_STATE_POINTERS << 16 | (4 - 2) | | |||
GEN6_CC_VIEWPORT_MODIFY | | |||
GEN6_SF_VIEWPORT_MODIFY | | |||
GEN6_CLIP_VIEWPORT_MODIFY); | |||
OUT_RELOC(brw->clip.vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
OUT_RELOC(brw->sf.vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
OUT_RELOC(brw->cc.vp_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 1); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
const struct brw_tracked_state gen6_viewport_state = { | |||
.dirty = { | |||
.mesa = 0, | |||
.brw = BRW_NEW_BATCH, | |||
.cache = (CACHE_NEW_CLIP_VP | | |||
CACHE_NEW_SF_VP | | |||
CACHE_NEW_CC_VP) | |||
}, | |||
.prepare = prepare_viewport_state_pointers, | |||
.emit = upload_viewport_state_pointers, | |||
}; |
@@ -0,0 +1,121 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
#include "shader/prog_parameter.h" | |||
#include "shader/prog_statevars.h" | |||
#include "intel_batchbuffer.h" | |||
static void | |||
upload_vs_state(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
GLcontext *ctx = &intel->ctx; | |||
const struct brw_vertex_program *vp = | |||
brw_vertex_program_const(brw->vertex_program); | |||
unsigned int nr_params = vp->program.Base.Parameters->NumParameters; | |||
drm_intel_bo *constant_bo; | |||
int i; | |||
if (vp->use_const_buffer || nr_params == 0) { | |||
/* Disable the push constant buffers. */ | |||
BEGIN_BATCH(5); | |||
OUT_BATCH(CMD_3D_CONSTANT_VS_STATE << 16 | (5 - 2)); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
} else { | |||
if (brw->vertex_program->IsNVProgram) | |||
_mesa_load_tracked_matrices(ctx); | |||
/* Updates the ParamaterValues[i] pointers for all parameters of the | |||
* basic type of PROGRAM_STATE_VAR. | |||
*/ | |||
_mesa_load_state_parameters(ctx, vp->program.Base.Parameters); | |||
constant_bo = drm_intel_bo_alloc(intel->bufmgr, "VS constant_bo", | |||
nr_params * 4 * sizeof(float), | |||
4096); | |||
intel_bo_map_gtt_preferred(intel, constant_bo, GL_TRUE); | |||
for (i = 0; i < nr_params; i++) { | |||
memcpy((char *)constant_bo->virtual + i * 4 * sizeof(float), | |||
vp->program.Base.Parameters->ParameterValues[i], | |||
4 * sizeof(float)); | |||
} | |||
intel_bo_unmap_gtt_preferred(intel, constant_bo); | |||
BEGIN_BATCH(5); | |||
OUT_BATCH(CMD_3D_CONSTANT_VS_STATE << 16 | | |||
GEN6_CONSTANT_BUFFER_0_ENABLE | | |||
(5 - 2)); | |||
OUT_RELOC(constant_bo, | |||
I915_GEM_DOMAIN_RENDER, 0, /* XXX: bad domain */ | |||
ALIGN(nr_params, 2) / 2 - 1); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
drm_intel_bo_unreference(constant_bo); | |||
} | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
BEGIN_BATCH(6); | |||
OUT_BATCH(CMD_3D_VS_STATE << 16 | (6 - 2)); | |||
OUT_RELOC(brw->vs.prog_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); | |||
OUT_BATCH((0 << GEN6_VS_SAMPLER_COUNT_SHIFT) | | |||
(brw->vs.nr_surfaces << GEN6_VS_BINDING_TABLE_ENTRY_COUNT_SHIFT)); | |||
OUT_BATCH(0); /* scratch space base offset */ | |||
OUT_BATCH((1 << GEN6_VS_DISPATCH_START_GRF_SHIFT) | | |||
(brw->vs.prog_data->urb_read_length << GEN6_VS_URB_READ_LENGTH_SHIFT) | | |||
(0 << GEN6_VS_URB_ENTRY_READ_OFFSET_SHIFT)); | |||
OUT_BATCH((0 << GEN6_VS_MAX_THREADS_SHIFT) | | |||
GEN6_VS_STATISTICS_ENABLE); | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
const struct brw_tracked_state gen6_vs_state = { | |||
.dirty = { | |||
.mesa = _NEW_TRANSFORM | _NEW_PROGRAM_CONSTANTS, | |||
.brw = (BRW_NEW_CURBE_OFFSETS | | |||
BRW_NEW_NR_VS_SURFACES | | |||
BRW_NEW_URB_FENCE | | |||
BRW_NEW_CONTEXT), | |||
.cache = CACHE_NEW_VS_PROG | |||
}, | |||
.emit = upload_vs_state, | |||
}; |
@@ -0,0 +1,162 @@ | |||
/* | |||
* Copyright © 2009 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
* copy of this software and associated documentation files (the "Software"), | |||
* to deal in the Software without restriction, including without limitation | |||
* the rights to use, copy, modify, merge, publish, distribute, sublicense, | |||
* and/or sell copies of the Software, and to permit persons to whom the | |||
* Software is furnished to do so, subject to the following conditions: | |||
* | |||
* The above copyright notice and this permission notice (including the next | |||
* paragraph) shall be included in all copies or substantial portions of the | |||
* Software. | |||
* | |||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | |||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | |||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | |||
* IN THE SOFTWARE. | |||
* | |||
* Authors: | |||
* Eric Anholt <eric@anholt.net> | |||
* | |||
*/ | |||
#include "brw_context.h" | |||
#include "brw_state.h" | |||
#include "brw_defines.h" | |||
#include "brw_util.h" | |||
#include "main/macros.h" | |||
#include "main/enums.h" | |||
#include "shader/prog_parameter.h" | |||
#include "shader/prog_statevars.h" | |||
#include "intel_batchbuffer.h" | |||
static void | |||
upload_wm_state(struct brw_context *brw) | |||
{ | |||
struct intel_context *intel = &brw->intel; | |||
GLcontext *ctx = &intel->ctx; | |||
const struct brw_fragment_program *fp = | |||
brw_fragment_program_const(brw->fragment_program); | |||
unsigned int nr_params = fp->program.Base.Parameters->NumParameters; | |||
drm_intel_bo *constant_bo; | |||
int i; | |||
uint32_t dw2, dw4, dw5, dw6; | |||
if (fp->use_const_buffer || nr_params == 0) { | |||
/* Disable the push constant buffers. */ | |||
BEGIN_BATCH(5); | |||
OUT_BATCH(CMD_3D_CONSTANT_PS_STATE << 16 | (5 - 2)); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
} else { | |||
/* Updates the ParamaterValues[i] pointers for all parameters of the | |||
* basic type of PROGRAM_STATE_VAR. | |||
*/ | |||
_mesa_load_state_parameters(ctx, fp->program.Base.Parameters); | |||
constant_bo = drm_intel_bo_alloc(intel->bufmgr, "WM constant_bo", | |||
nr_params * 4 * sizeof(float), | |||
4096); | |||
intel_bo_map_gtt_preferred(intel, constant_bo, GL_TRUE); | |||
for (i = 0; i < nr_params; i++) { | |||
memcpy((char *)constant_bo->virtual + i * 4 * sizeof(float), | |||
fp->program.Base.Parameters->ParameterValues[i], | |||
4 * sizeof(float)); | |||
} | |||
intel_bo_unmap_gtt_preferred(intel, constant_bo); | |||
BEGIN_BATCH(5); | |||
OUT_BATCH(CMD_3D_CONSTANT_PS_STATE << 16 | | |||
GEN6_CONSTANT_BUFFER_0_ENABLE | | |||
(5 - 2)); | |||
OUT_RELOC(constant_bo, | |||
I915_GEM_DOMAIN_RENDER, 0, /* XXX: bad domain */ | |||
ALIGN(nr_params, 2) / 2 - 1); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
OUT_BATCH(0); | |||
ADVANCE_BATCH(); | |||
drm_intel_bo_unreference(constant_bo); | |||
} | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
dw2 = dw4 = dw5 = dw6 = 0; | |||
dw4 |= GEN6_WM_STATISTICS_ENABLE; | |||
dw5 |= GEN6_WM_LINE_AA_WIDTH_1_0; | |||
dw5 |= GEN6_WM_LINE_END_CAP_AA_WIDTH_0_5; | |||
/* BRW_NEW_NR_SURFACES */ | |||
dw2 |= brw->wm.nr_surfaces << GEN6_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT; | |||
/* CACHE_NEW_SAMPLER */ | |||
dw2 |= (ALIGN(brw->wm.sampler_count, 4) / 4) << GEN6_WM_SAMPLER_COUNT_SHIFT; | |||
dw4 |= (1 << GEN6_WM_DISPATCH_START_GRF_SHIFT_0); | |||
dw5 |= (40 - 1) << GEN6_WM_MAX_THREADS_SHIFT; | |||
dw5 |= GEN6_WM_DISPATCH_ENABLE; | |||
/* BRW_NEW_FRAGMENT_PROGRAM */ | |||
if (fp->isGLSL) | |||
dw5 |= GEN6_WM_8_DISPATCH_ENABLE; | |||
else | |||
dw5 |= GEN6_WM_16_DISPATCH_ENABLE; | |||
/* _NEW_LINE */ | |||
if (ctx->Line.StippleFlag) | |||
dw5 |= GEN6_WM_LINE_STIPPLE_ENABLE; | |||
/* _NEW_POLYGONSTIPPLE */ | |||
if (ctx->Polygon.StippleFlag) | |||
dw5 |= GEN6_WM_POLYGON_STIPPLE_ENABLE; | |||
/* BRW_NEW_FRAGMENT_PROGRAM */ | |||
if (fp->program.Base.InputsRead & (1 << FRAG_ATTRIB_WPOS)) | |||
dw5 |= GEN6_WM_USES_SOURCE_DEPTH | GEN6_WM_USES_SOURCE_W; | |||
if (fp->program.Base.OutputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) | |||
dw5 |= GEN6_WM_COMPUTED_DEPTH; | |||
/* _NEW_COLOR */ | |||
if (fp->program.UsesKill || ctx->Color.AlphaEnabled) | |||
dw5 |= GEN6_WM_KILL_ENABLE; | |||
/* This should probably be FS inputs read */ | |||
dw6 |= brw_count_bits(brw->vs.prog_data->outputs_written) << | |||
GEN6_WM_NUM_SF_OUTPUTS_SHIFT; | |||
BEGIN_BATCH(9); | |||
OUT_BATCH(CMD_3D_WM_STATE << 16 | (9 - 2)); | |||
OUT_RELOC(brw->wm.prog_bo, I915_GEM_DOMAIN_INSTRUCTION, 0, 0); | |||
OUT_BATCH(dw2); | |||
OUT_BATCH(0); /* scratch space base offset */ | |||
OUT_BATCH(dw4); | |||
OUT_BATCH(dw5); | |||
OUT_BATCH(dw6); | |||
OUT_BATCH(0); /* kernel 1 pointer */ | |||
OUT_BATCH(0); /* kernel 2 pointer */ | |||
ADVANCE_BATCH(); | |||
intel_batchbuffer_emit_mi_flush(intel->batch); | |||
} | |||
const struct brw_tracked_state gen6_wm_state = { | |||
.dirty = { | |||
.mesa = _NEW_LINE | _NEW_POLYGONSTIPPLE | _NEW_COLOR, | |||
.brw = (BRW_NEW_CURBE_OFFSETS | | |||
BRW_NEW_FRAGMENT_PROGRAM | | |||
BRW_NEW_NR_WM_SURFACES | | |||
BRW_NEW_URB_FENCE | | |||
BRW_NEW_BATCH), | |||
.cache = CACHE_NEW_SAMPLER | |||
}, | |||
.emit = upload_wm_state, | |||
}; |
@@ -96,6 +96,17 @@ intel_batchbuffer_require_space(struct intel_batchbuffer *batch, | |||
intel_batchbuffer_flush(batch); | |||
} | |||
static INLINE uint32_t float_as_int(float f) | |||
{ | |||
union { | |||
float f; | |||
uint32_t d; | |||
} fi; | |||
fi.f = f; | |||
return fi.d; | |||
} | |||
/* Here are the crusty old macros, to be removed: | |||
*/ | |||
#define BATCH_LOCALS | |||
@@ -108,6 +119,8 @@ intel_batchbuffer_require_space(struct intel_batchbuffer *batch, | |||
} while (0) | |||
#define OUT_BATCH(d) intel_batchbuffer_emit_dword(intel->batch, d) | |||
#define OUT_BATCH_F(f) intel_batchbuffer_emit_dword(intel->batch, \ | |||
float_as_int(f)) | |||
#define OUT_RELOC(buf, read_domains, write_domain, delta) do { \ | |||
assert((unsigned) (delta) < buf->size); \ |
@@ -89,6 +89,10 @@ intelEmitCopyBlit(struct intel_context *intel, | |||
dri_bo *aper_array[3]; | |||
BATCH_LOCALS; | |||
/* Blits are in a different ringbuffer so we don't use them. */ | |||
if (intel->gen >= 6) | |||
return GL_FALSE; | |||
if (dst_tiling != I915_TILING_NONE) { | |||
if (dst_offset & 4095) | |||
return GL_FALSE; | |||
@@ -218,6 +222,9 @@ intelClearWithBlit(GLcontext *ctx, GLbitfield mask) | |||
GLint cx, cy, cw, ch; | |||
BATCH_LOCALS; | |||
/* Blits are in a different ringbuffer so we don't use them. */ | |||
assert(intel->gen < 6); | |||
/* | |||
* Compute values for clearing the buffers. | |||
*/ | |||
@@ -388,6 +395,10 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel, | |||
int dwords = ALIGN(src_size, 8) / 4; | |||
uint32_t opcode, br13, blit_cmd; | |||
/* Blits are in a different ringbuffer so we don't use them. */ | |||
if (intel->gen >= 6) | |||
return GL_FALSE; | |||
if (dst_tiling != I915_TILING_NONE) { | |||
if (dst_offset & 4095) | |||
return GL_FALSE; | |||
@@ -473,6 +484,9 @@ intel_emit_linear_blit(struct intel_context *intel, | |||
{ | |||
GLuint pitch, height; | |||
/* Blits are in a different ringbuffer so we don't use them. */ | |||
assert(intel->gen < 6); | |||
/* The pitch is a signed value. */ | |||
pitch = MIN2(size, (1 << 15) - 1); | |||
height = size / pitch; |
@@ -1,4 +1,4 @@ | |||
/* | |||
/* | |||
* Copyright © 2007 Intel Corporation | |||
* | |||
* Permission is hereby granted, free of charge, to any person obtaining a | |||
@@ -71,6 +71,8 @@ | |||
#define PCI_CHIP_ILD_G 0x0042 | |||
#define PCI_CHIP_ILM_G 0x0046 | |||
#define PCI_CHIP_SANDYBRIDGE 0x0102 | |||
#define IS_MOBILE(devid) (devid == PCI_CHIP_I855_GM || \ | |||
devid == PCI_CHIP_I915_GM || \ | |||
devid == PCI_CHIP_I945_GM || \ | |||
@@ -104,14 +106,20 @@ | |||
devid == PCI_CHIP_Q33_G || \ | |||
devid == PCI_CHIP_Q35_G || IS_IGD(devid)) | |||
#define IS_965(devid) (devid == PCI_CHIP_I965_G || \ | |||
#define IS_GEN4(devid) (devid == PCI_CHIP_I965_G || \ | |||
devid == PCI_CHIP_I965_Q || \ | |||
devid == PCI_CHIP_I965_G_1 || \ | |||
devid == PCI_CHIP_I965_GM || \ | |||
devid == PCI_CHIP_I965_GME || \ | |||
devid == PCI_CHIP_I946_GZ || \ | |||
IS_G4X(devid)) | |||
#define IS_GEN6(devid) (devid == PCI_CHIP_SANDYBRIDGE) | |||
#define IS_965(devid) (IS_GEN4(devid) || \ | |||
IS_G4X(devid) || \ | |||
IS_IGDNG(devid)) | |||
IS_IGDNG(devid) || \ | |||
IS_GEN6(devid)) | |||
#define IS_9XX(devid) (IS_915(devid) || \ | |||
IS_945(devid) || \ |
@@ -133,6 +133,12 @@ intelClear(GLcontext *ctx, GLbitfield mask) | |||
} | |||
} | |||
if (intel->gen >= 6) { | |||
/* Blits are in a different ringbuffer so we don't use them. */ | |||
tri_mask |= blit_mask; | |||
blit_mask = 0; | |||
} | |||
/* SW fallback clearing */ | |||
swrast_mask = mask & ~tri_mask & ~blit_mask; | |||
@@ -610,7 +610,11 @@ intelInitContext(struct intel_context *intel, | |||
intel->driContext = driContextPriv; | |||
intel->driFd = sPriv->fd; | |||
if (IS_965(intel->intelScreen->deviceID)) { | |||
if (IS_GEN6(intel->intelScreen->deviceID)) { | |||
intel->gen = 6; | |||
intel->needs_ff_sync = GL_TRUE; | |||
intel->has_luminance_srgb = GL_TRUE; | |||
} else if (IS_965(intel->intelScreen->deviceID)) { | |||
intel->gen = 4; | |||
} else if (IS_9XX(intel->intelScreen->deviceID)) { | |||
intel->gen = 3; |
@@ -1437,6 +1437,12 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures) | |||
{ 0x7909, 2, 2, "3DSTATE_GLOBAL_DEPTH_OFFSET_CLAMP" }, | |||
{ 0x790a, 3, 3, "3DSTATE_AA_LINE_PARAMETERS" }, | |||
{ 0x7b00, 6, 6, "3DPRIMITIVE" }, | |||
{ 0x780e, 4, 4, "3DSTATE_CC_STATE_POINTERS" }, | |||
{ 0x7810, 6, 6, "3DSTATE_VS_STATE" }, | |||
{ 0x7811, 6, 6, "3DSTATE_GS_STATE" }, | |||
{ 0x7812, 4, 4, "3DSTATE_CLIP_STATE" }, | |||
{ 0x7815, 5, 5, "3DSTATE_CONSTANT_VS_STATE" }, | |||
{ 0x7816, 5, 5, "3DSTATE_CONSTANT_GS_STATE" }, | |||
}; | |||
len = (data[0] & 0x0000ffff) + 2; | |||
@@ -1592,7 +1598,7 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures) | |||
return len; | |||
case 0x7905: | |||
if (len != 5 && len != 6) | |||
if (len < 5 || len > 7) | |||
fprintf(out, "Bad count in 3DSTATE_DEPTH_BUFFER\n"); | |||
if (count < len) | |||
BUFFER_FAIL(count, len, "3DSTATE_DEPTH_BUFFER"); | |||
@@ -1611,6 +1617,8 @@ decode_3d_965(uint32_t *data, int count, uint32_t hw_offset, int *failures) | |||
instr_out(data, hw_offset, 4, "volume depth\n"); | |||
if (len == 6) | |||
instr_out(data, hw_offset, 5, "\n"); | |||
if (len == 7) | |||
instr_out(data, hw_offset, 6, "render target view extent\n"); | |||
return len; | |||