152
static Bool i965_get_dest_format(PicturePtr dest_picture, uint32_t * dst_format)
148
static uint32_t i965_get_dest_format(PicturePtr dest_picture)
154
ScrnInfoPtr scrn = xf86Screens[dest_picture->pDrawable->pScreen->myNum];
156
150
switch (dest_picture->format) {
157
151
case PICT_a8r8g8b8:
158
152
case PICT_x8r8g8b8:
159
*dst_format = BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
153
return BRW_SURFACEFORMAT_B8G8R8A8_UNORM;
161
154
case PICT_a8b8g8r8:
162
155
case PICT_x8b8g8r8:
163
*dst_format = BRW_SURFACEFORMAT_R8G8B8A8_UNORM;
156
return BRW_SURFACEFORMAT_R8G8B8A8_UNORM;
165
157
#if XORG_VERSION_CURRENT >= 10699900
166
158
case PICT_a2r10g10b10:
167
159
case PICT_x2r10g10b10:
168
*dst_format = BRW_SURFACEFORMAT_B10G10R10A2_UNORM;
160
return BRW_SURFACEFORMAT_B10G10R10A2_UNORM;
171
162
case PICT_r5g6b5:
172
*dst_format = BRW_SURFACEFORMAT_B5G6R5_UNORM;
163
return BRW_SURFACEFORMAT_B5G6R5_UNORM;
174
164
case PICT_x1r5g5b5:
175
165
case PICT_a1r5g5b5:
176
*dst_format = BRW_SURFACEFORMAT_B5G5R5A1_UNORM;
166
return BRW_SURFACEFORMAT_B5G5R5A1_UNORM;
179
*dst_format = BRW_SURFACEFORMAT_A8_UNORM;
168
return BRW_SURFACEFORMAT_A8_UNORM;
181
169
case PICT_a4r4g4b4:
182
170
case PICT_x4r4g4b4:
183
*dst_format = BRW_SURFACEFORMAT_B4G4R4A4_UNORM;
171
return BRW_SURFACEFORMAT_B4G4R4A4_UNORM;
186
intel_debug_fallback(scrn, "Unsupported dest format 0x%x\n",
187
(int)dest_picture->format);
689
659
drm_intel_bo *sf_state_bo;
690
660
drm_intel_bo *sf_mask_state_bo;
691
661
drm_intel_bo *cc_state_bo;
692
drm_intel_bo *wm_state_bo[WM_KERNEL_COUNT]
693
[SAMPLER_STATE_FILTER_COUNT]
694
[SAMPLER_STATE_EXTEND_COUNT]
695
[SAMPLER_STATE_FILTER_COUNT]
696
[SAMPLER_STATE_EXTEND_COUNT];
697
drm_intel_bo *wm_kernel_bo[WM_KERNEL_COUNT];
662
drm_intel_bo *wm_state_bo[KERNEL_COUNT]
663
[FILTER_COUNT] [EXTEND_COUNT]
664
[FILTER_COUNT] [EXTEND_COUNT];
665
drm_intel_bo *wm_kernel_bo[KERNEL_COUNT];
699
667
drm_intel_bo *cc_vp_bo;
700
668
drm_intel_bo *gen6_blend_bo;
701
669
drm_intel_bo *gen6_depth_stencil_bo;
702
drm_intel_bo *ps_sampler_state_bo[SAMPLER_STATE_FILTER_COUNT]
703
[SAMPLER_STATE_EXTEND_COUNT]
704
[SAMPLER_STATE_FILTER_COUNT]
705
[SAMPLER_STATE_EXTEND_COUNT];
670
drm_intel_bo *ps_sampler_state_bo[FILTER_COUNT]
706
674
gen4_composite_op composite_op;
709
static void gen6_emit_composite_state(ScrnInfoPtr scrn);
677
static void gen6_emit_composite_state(struct intel_screen_private *intel);
710
678
static void gen6_render_state_init(ScrnInfoPtr scrn);
924
885
cc_state->cc6.dest_blend_factor = dst_blend;
927
static drm_intel_bo *gen4_create_wm_state(ScrnInfoPtr scrn,
888
static drm_intel_bo *gen4_create_wm_state(intel_screen_private *intel,
929
890
drm_intel_bo * kernel_bo,
930
891
drm_intel_bo * sampler_bo)
932
intel_screen_private *intel = intel_get_screen_private(scrn);
933
struct brw_wm_unit_state *wm_state;
893
struct brw_wm_unit_state *state;
934
894
drm_intel_bo *wm_state_bo;
936
896
wm_state_bo = drm_intel_bo_alloc(intel->bufmgr, "gen4 WM state",
937
sizeof(*wm_state), 4096);
897
sizeof(*state), 4096);
938
898
drm_intel_bo_map(wm_state_bo, TRUE);
939
wm_state = wm_state_bo->virtual;
899
state = wm_state_bo->virtual;
941
memset(wm_state, 0, sizeof(*wm_state));
942
wm_state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
943
wm_state->thread0.kernel_start_pointer =
901
memset(state, 0, sizeof(*state));
902
state->thread0.grf_reg_count = BRW_GRF_BLOCKS(PS_KERNEL_NUM_GRF);
903
state->thread0.kernel_start_pointer =
944
904
intel_emit_reloc(wm_state_bo,
945
905
offsetof(struct brw_wm_unit_state, thread0),
946
kernel_bo, wm_state->thread0.grf_reg_count << 1,
906
kernel_bo, state->thread0.grf_reg_count << 1,
947
907
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 6;
949
wm_state->thread1.single_program_flow = 0;
909
state->thread1.single_program_flow = 0;
951
911
/* scratch space is not used in our kernel */
952
wm_state->thread2.scratch_space_base_pointer = 0;
953
wm_state->thread2.per_thread_scratch_space = 0;
955
wm_state->thread3.const_urb_entry_read_length = 0;
956
wm_state->thread3.const_urb_entry_read_offset = 0;
958
wm_state->thread3.urb_entry_read_offset = 0;
912
state->thread2.scratch_space_base_pointer = 0;
913
state->thread2.per_thread_scratch_space = 0;
915
state->thread3.const_urb_entry_read_length = 0;
916
state->thread3.const_urb_entry_read_offset = 0;
918
state->thread3.urb_entry_read_offset = 0;
959
919
/* wm kernel use urb from 3, see wm_program in compiler module */
960
wm_state->thread3.dispatch_grf_start_reg = 3; /* must match kernel */
962
wm_state->wm4.stats_enable = 1; /* statistic */
920
state->thread3.dispatch_grf_start_reg = 3; /* must match kernel */
964
922
if (IS_GEN5(intel))
965
wm_state->wm4.sampler_count = 0; /* hardware requirement */
923
state->wm4.sampler_count = 0; /* hardware requirement */
967
wm_state->wm4.sampler_count = 1; /* 1-4 samplers used */
925
state->wm4.sampler_count = 1; /* 1-4 samplers used */
969
wm_state->wm4.sampler_state_pointer =
927
state->wm4.sampler_state_pointer =
970
928
intel_emit_reloc(wm_state_bo,
971
929
offsetof(struct brw_wm_unit_state, wm4),
973
wm_state->wm4.stats_enable +
974
(wm_state->wm4.sampler_count << 2),
931
state->wm4.sampler_count << 2,
975
932
I915_GEM_DOMAIN_INSTRUCTION, 0) >> 5;
976
wm_state->wm5.max_threads = PS_MAX_THREADS - 1;
977
wm_state->wm5.transposed_urb_read = 0;
978
wm_state->wm5.thread_dispatch_enable = 1;
933
state->wm5.max_threads = PS_MAX_THREADS - 1;
934
state->wm5.transposed_urb_read = 0;
935
state->wm5.thread_dispatch_enable = 1;
979
936
/* just use 16-pixel dispatch (4 subspans), don't need to change kernel
982
wm_state->wm5.enable_16_pix = 1;
983
wm_state->wm5.enable_8_pix = 0;
984
wm_state->wm5.early_depth_test = 1;
939
state->wm5.enable_16_pix = 1;
940
state->wm5.enable_8_pix = 0;
941
state->wm5.early_depth_test = 1;
986
943
/* Each pair of attributes (src/mask coords) is two URB entries */
988
wm_state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */
989
wm_state->thread3.urb_entry_read_length = 4;
945
state->thread1.binding_table_entry_count = 3; /* 2 tex and fb */
946
state->thread3.urb_entry_read_length = 4;
991
wm_state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */
992
wm_state->thread3.urb_entry_read_length = 2;
948
state->thread1.binding_table_entry_count = 2; /* 1 tex and fb */
949
state->thread3.urb_entry_read_length = 2;
995
952
/* binding table entry count is only used for prefetching, and it has to
953
* be set 0 for Ironlake
998
955
if (IS_GEN5(intel))
999
wm_state->thread1.binding_table_entry_count = 0;
956
state->thread1.binding_table_entry_count = 0;
1001
958
drm_intel_bo_unmap(wm_state_bo);
1003
960
return wm_state_bo;
1006
static drm_intel_bo *gen4_create_cc_viewport(ScrnInfoPtr scrn)
963
static drm_intel_bo *gen4_create_cc_viewport(intel_screen_private *intel)
1008
intel_screen_private *intel = intel_get_screen_private(scrn);
1009
965
drm_intel_bo *bo;
1010
struct brw_cc_viewport cc_viewport;
966
struct brw_cc_viewport vp;
1012
cc_viewport.min_depth = -1.e35;
1013
cc_viewport.max_depth = 1.e35;
968
vp.min_depth = -1.e35;
969
vp.max_depth = 1.e35;
1015
971
bo = drm_intel_bo_alloc(intel->bufmgr, "gen4 render unit state",
1016
sizeof(cc_viewport), 4096);
1017
drm_intel_bo_subdata(bo, 0, sizeof(cc_viewport), &cc_viewport);
973
drm_intel_bo_subdata(bo, 0, sizeof(vp), &vp);
1022
static drm_intel_bo *gen4_create_vs_unit_state(ScrnInfoPtr scrn)
978
static drm_intel_bo *gen4_create_vs_unit_state(intel_screen_private *intel)
1024
intel_screen_private *intel = intel_get_screen_private(scrn);
1025
980
struct brw_vs_unit_state vs_state;
1026
981
memset(&vs_state, 0, sizeof(vs_state));
1190
static void i965_emit_composite_state(ScrnInfoPtr scrn)
1192
intel_screen_private *intel = intel_get_screen_private(scrn);
1137
static void gen4_composite_vertex_elements(struct intel_screen_private *intel)
1139
struct gen4_render_state *render_state = intel->gen4_render_state;
1140
gen4_composite_op *composite_op = &render_state->composite_op;
1141
Bool has_mask = intel->render_mask != NULL;
1142
Bool is_affine = composite_op->is_affine;
1144
* number of extra parameters per vertex
1146
int nelem = has_mask ? 2 : 1;
1148
* size of extra parameters:
1149
* 3 for homogenous (xyzw)
1150
* 2 for cartesian (xy)
1152
int selem = is_affine ? 2 : 3;
1153
uint32_t w_component;
1154
uint32_t src_format;
1157
id = has_mask << 1 | is_affine;
1159
if (composite_op->vertex_id == id)
1162
composite_op->vertex_id = id;
1165
src_format = BRW_SURFACEFORMAT_R32G32_FLOAT;
1166
w_component = BRW_VFCOMPONENT_STORE_1_FLT;
1168
src_format = BRW_SURFACEFORMAT_R32G32B32_FLOAT;
1169
w_component = BRW_VFCOMPONENT_STORE_SRC;
1172
if (IS_GEN5(intel)) {
1174
* The reason to add this extra vertex element in the header is that
1175
* Ironlake has different vertex header definition and origin method to
1176
* set destination element offset doesn't exist anymore, which means
1177
* hardware requires a predefined vertex element layout.
1179
* haihao proposed this approach to fill the first vertex element, so
1180
* origin layout for Gen4 doesn't need to change, and origin shader
1181
* programs behavior is also kept.
1183
* I think this is not bad. - zhenyu
1186
OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
1187
((2 * (2 + nelem)) - 1));
1188
OUT_BATCH((id << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID |
1189
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
1190
(0 << VE0_OFFSET_SHIFT));
1192
OUT_BATCH((BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_0_SHIFT) |
1193
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_1_SHIFT) |
1194
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT) |
1195
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT));
1197
/* Set up our vertex elements, sourced from the single vertex buffer.
1198
* that will be set up later.
1200
OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
1201
((2 * (1 + nelem)) - 1));
1205
OUT_BATCH((id << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID |
1206
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
1207
(0 << VE0_OFFSET_SHIFT));
1210
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
1211
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
1212
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
1213
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
1215
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
1216
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
1217
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
1218
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
1219
(4 << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
1221
OUT_BATCH((id << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID |
1222
(src_format << VE0_FORMAT_SHIFT) |
1223
((2 * 4) << VE0_OFFSET_SHIFT)); /* offset vb in bytes */
1226
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
1227
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
1228
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
1229
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
1231
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
1232
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
1233
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
1234
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
1235
((4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
1238
OUT_BATCH((id << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID |
1239
(src_format << VE0_FORMAT_SHIFT) |
1240
(((2 + selem) * 4) << VE0_OFFSET_SHIFT)); /* vb offset in bytes */
1243
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
1244
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
1245
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
1246
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
1248
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
1249
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
1250
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
1251
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) |
1252
((4 + 4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
1256
static void i965_emit_composite_state(struct intel_screen_private *intel)
1193
1258
struct gen4_render_state *render_state = intel->gen4_render_state;
1194
1259
gen4_composite_op *composite_op = &render_state->composite_op;
1195
1260
int op = composite_op->op;
1266
1330
i965_get_blend_cntl(op, mask_picture, dest_picture->format,
1267
1331
&src_blend, &dst_blend);
1270
/* Binding table pointers */
1271
OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4);
1272
OUT_BATCH(0); /* vs */
1273
OUT_BATCH(0); /* gs */
1274
OUT_BATCH(0); /* clip */
1275
OUT_BATCH(0); /* sf */
1276
/* Only the PS uses the binding table */
1277
OUT_BATCH(intel->surface_table);
1279
/* The drawing rectangle clipping is always on. Set it to values that
1280
* shouldn't do any clipping.
1282
OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | 2);
1283
OUT_BATCH(0x00000000); /* ymin, xmin */
1284
OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) |
1285
DRAW_XMAX(dest->drawable.width - 1)); /* ymax, xmax */
1286
OUT_BATCH(0x00000000); /* yorigin, xorigin */
1288
/* skip the depth buffer */
1289
/* skip the polygon stipple */
1290
/* skip the polygon stipple offset */
1291
/* skip the line stipple */
1293
/* Set the pointers to the 3d pipeline state */
1294
OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
1295
OUT_RELOC(render_state->vs_state_bo,
1296
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1297
OUT_BATCH(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */
1298
OUT_BATCH(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */
1300
OUT_RELOC(render_state->sf_mask_state_bo,
1301
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1303
OUT_RELOC(render_state->sf_state_bo,
1304
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1307
OUT_RELOC(render_state->wm_state_bo[composite_op->wm_kernel]
1308
[src_filter][src_extend]
1309
[mask_filter][mask_extend],
1310
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1312
OUT_RELOC(render_state->cc_state_bo,
1313
I915_GEM_DOMAIN_INSTRUCTION, 0,
1314
offsetof(struct gen4_cc_unit_state,
1315
cc_state[src_blend][dst_blend]));
1333
/* Binding table pointers */
1334
OUT_BATCH(BRW_3DSTATE_BINDING_TABLE_POINTERS | 4);
1335
OUT_BATCH(0); /* vs */
1336
OUT_BATCH(0); /* gs */
1337
OUT_BATCH(0); /* clip */
1338
OUT_BATCH(0); /* sf */
1339
/* Only the PS uses the binding table */
1340
OUT_BATCH(intel->surface_table);
1342
/* The drawing rectangle clipping is always on. Set it to values that
1343
* shouldn't do any clipping.
1345
OUT_BATCH(BRW_3DSTATE_DRAWING_RECTANGLE | 2);
1346
OUT_BATCH(0x00000000); /* ymin, xmin */
1347
OUT_BATCH(DRAW_YMAX(dest->drawable.height - 1) |
1348
DRAW_XMAX(dest->drawable.width - 1)); /* ymax, xmax */
1349
OUT_BATCH(0x00000000); /* yorigin, xorigin */
1351
/* skip the depth buffer */
1352
/* skip the polygon stipple */
1353
/* skip the polygon stipple offset */
1354
/* skip the line stipple */
1356
/* Set the pointers to the 3d pipeline state */
1357
OUT_BATCH(BRW_3DSTATE_PIPELINED_POINTERS | 5);
1358
OUT_RELOC(render_state->vs_state_bo,
1359
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1360
OUT_BATCH(BRW_GS_DISABLE); /* disable GS, resulting in passthrough */
1361
OUT_BATCH(BRW_CLIP_DISABLE); /* disable CLIP, resulting in passthrough */
1363
OUT_RELOC(render_state->sf_mask_state_bo,
1364
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1366
OUT_RELOC(render_state->sf_state_bo,
1367
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1370
OUT_RELOC(render_state->wm_state_bo[composite_op->wm_kernel]
1371
[src_filter][src_extend]
1372
[mask_filter][mask_extend],
1373
I915_GEM_DOMAIN_INSTRUCTION, 0, 0);
1375
OUT_RELOC(render_state->cc_state_bo,
1376
I915_GEM_DOMAIN_INSTRUCTION, 0,
1377
offsetof(struct gen4_cc_unit_state,
1378
cc_state[src_blend][dst_blend]));
1319
1381
int urb_vs_start, urb_vs_size;
1320
1382
int urb_gs_start, urb_gs_size;
1361
1423
(URB_CS_ENTRIES << 0));
1366
* number of extra parameters per vertex
1368
int nelem = mask ? 2 : 1;
1370
* size of extra parameters:
1371
* 3 for homogenous (xyzw)
1372
* 2 for cartesian (xy)
1374
int selem = is_affine ? 2 : 3;
1375
uint32_t w_component;
1376
uint32_t src_format;
1379
src_format = BRW_SURFACEFORMAT_R32G32_FLOAT;
1380
w_component = BRW_VFCOMPONENT_STORE_1_FLT;
1382
src_format = BRW_SURFACEFORMAT_R32G32B32_FLOAT;
1383
w_component = BRW_VFCOMPONENT_STORE_SRC;
1386
if (IS_GEN5(intel)) {
1388
* The reason to add this extra vertex element in the header is that
1389
* IGDNG has different vertex header definition and origin method to
1390
* set destination element offset doesn't exist anymore, which means
1391
* hardware requires a predefined vertex element layout.
1393
* haihao proposed this approach to fill the first vertex element, so
1394
* origin layout for Gen4 doesn't need to change, and origin shader
1395
* programs behavior is also kept.
1397
* I think this is not bad. - zhenyu
1400
OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
1401
((2 * (2 + nelem)) - 1));
1402
OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
1403
VE0_VALID | (BRW_SURFACEFORMAT_R32G32_FLOAT <<
1404
VE0_FORMAT_SHIFT) | (0 <<
1407
OUT_BATCH((BRW_VFCOMPONENT_STORE_0 <<
1408
VE1_VFCOMPONENT_0_SHIFT) |
1409
(BRW_VFCOMPONENT_STORE_0 <<
1410
VE1_VFCOMPONENT_1_SHIFT) |
1411
(BRW_VFCOMPONENT_STORE_0 <<
1412
VE1_VFCOMPONENT_2_SHIFT) |
1413
(BRW_VFCOMPONENT_STORE_0 <<
1414
VE1_VFCOMPONENT_3_SHIFT));
1416
/* Set up our vertex elements, sourced from the single vertex buffer.
1417
* that will be set up later.
1419
OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
1420
((2 * (1 + nelem)) - 1));
1424
OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) |
1426
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
1427
(0 << VE0_OFFSET_SHIFT));
1430
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
1431
VE1_VFCOMPONENT_0_SHIFT) |
1432
(BRW_VFCOMPONENT_STORE_SRC <<
1433
VE1_VFCOMPONENT_1_SHIFT) |
1434
(BRW_VFCOMPONENT_STORE_1_FLT <<
1435
VE1_VFCOMPONENT_2_SHIFT) |
1436
(BRW_VFCOMPONENT_STORE_1_FLT <<
1437
VE1_VFCOMPONENT_3_SHIFT));
1439
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
1440
VE1_VFCOMPONENT_0_SHIFT) |
1441
(BRW_VFCOMPONENT_STORE_SRC <<
1442
VE1_VFCOMPONENT_1_SHIFT) |
1443
(BRW_VFCOMPONENT_STORE_1_FLT <<
1444
VE1_VFCOMPONENT_2_SHIFT) |
1445
(BRW_VFCOMPONENT_STORE_1_FLT <<
1446
VE1_VFCOMPONENT_3_SHIFT) | (4 <<
1447
VE1_DESTINATION_ELEMENT_OFFSET_SHIFT));
1449
OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | (src_format << VE0_FORMAT_SHIFT) | ((2 * 4) << VE0_OFFSET_SHIFT)); /* offset vb in bytes */
1452
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
1453
VE1_VFCOMPONENT_0_SHIFT) |
1454
(BRW_VFCOMPONENT_STORE_SRC <<
1455
VE1_VFCOMPONENT_1_SHIFT) | (w_component <<
1456
VE1_VFCOMPONENT_2_SHIFT)
1457
| (BRW_VFCOMPONENT_STORE_1_FLT <<
1458
VE1_VFCOMPONENT_3_SHIFT));
1460
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | (w_component << VE1_VFCOMPONENT_2_SHIFT) | (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | ((4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
1463
OUT_BATCH((0 << VE0_VERTEX_BUFFER_INDEX_SHIFT) | VE0_VALID | (src_format << VE0_FORMAT_SHIFT) | (((2 + selem) * 4) << VE0_OFFSET_SHIFT)); /* vb offset in bytes */
1466
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC <<
1467
VE1_VFCOMPONENT_0_SHIFT) |
1468
(BRW_VFCOMPONENT_STORE_SRC <<
1469
VE1_VFCOMPONENT_1_SHIFT) |
1471
VE1_VFCOMPONENT_2_SHIFT) |
1472
(BRW_VFCOMPONENT_STORE_1_FLT <<
1473
VE1_VFCOMPONENT_3_SHIFT));
1475
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) | (BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) | (w_component << VE1_VFCOMPONENT_2_SHIFT) | (BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT) | ((4 + 4 + 4) << VE1_DESTINATION_ELEMENT_OFFSET_SHIFT)); /* VUE offset in dwords */
1426
gen4_composite_vertex_elements(intel);
1481
1430
* Returns whether the current set of composite state plus vertex buffer is
1482
1431
* expected to fit in the aperture.
1484
static Bool i965_composite_check_aperture(ScrnInfoPtr scrn)
1433
static Bool i965_composite_check_aperture(intel_screen_private *intel)
1486
intel_screen_private *intel = intel_get_screen_private(scrn);
1487
1435
struct gen4_render_state *render_state = intel->gen4_render_state;
1488
1436
gen4_composite_op *composite_op = &render_state->composite_op;
1489
1437
drm_intel_bo *bo_table[] = {
1548
1496
priv->dst_bound = priv->src_bound = 0;
1500
i965_emit_composite_primitive_identity_source(intel_screen_private *intel,
1502
int maskX, int maskY,
1506
OUT_VERTEX(dstX + w);
1507
OUT_VERTEX(dstY + h);
1508
OUT_VERTEX((srcX + w) * intel->scale_units[0][0]);
1509
OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
1512
OUT_VERTEX(dstY + h);
1513
OUT_VERTEX(srcX * intel->scale_units[0][0]);
1514
OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
1518
OUT_VERTEX(srcX * intel->scale_units[0][0]);
1519
OUT_VERTEX(srcY * intel->scale_units[0][1]);
1523
i965_emit_composite_primitive_affine_source(intel_screen_private *intel,
1525
int maskX, int maskY,
1529
float src_x[3], src_y[3];
1531
if (!intel_get_transformed_coordinates(srcX, srcY,
1532
intel->transform[0],
1537
if (!intel_get_transformed_coordinates(srcX, srcY + h,
1538
intel->transform[0],
1543
if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
1544
intel->transform[0],
1549
OUT_VERTEX(dstX + w);
1550
OUT_VERTEX(dstY + h);
1551
OUT_VERTEX(src_x[2] * intel->scale_units[0][0]);
1552
OUT_VERTEX(src_y[2] * intel->scale_units[0][1]);
1555
OUT_VERTEX(dstY + h);
1556
OUT_VERTEX(src_x[1] * intel->scale_units[0][0]);
1557
OUT_VERTEX(src_y[1] * intel->scale_units[0][1]);
1561
OUT_VERTEX(src_x[0] * intel->scale_units[0][0]);
1562
OUT_VERTEX(src_y[0] * intel->scale_units[0][1]);
1566
i965_emit_composite_primitive_identity_source_mask(intel_screen_private *intel,
1568
int maskX, int maskY,
1572
OUT_VERTEX(dstX + w);
1573
OUT_VERTEX(dstY + h);
1574
OUT_VERTEX((srcX + w) * intel->scale_units[0][0]);
1575
OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
1576
OUT_VERTEX((maskX + w) * intel->scale_units[1][0]);
1577
OUT_VERTEX((maskY + h) * intel->scale_units[1][1]);
1580
OUT_VERTEX(dstY + h);
1581
OUT_VERTEX(srcX * intel->scale_units[0][0]);
1582
OUT_VERTEX((srcY + h) * intel->scale_units[0][1]);
1583
OUT_VERTEX(maskX * intel->scale_units[1][0]);
1584
OUT_VERTEX((maskY + h) * intel->scale_units[1][1]);
1588
OUT_VERTEX(srcX * intel->scale_units[0][0]);
1589
OUT_VERTEX(srcY * intel->scale_units[0][1]);
1590
OUT_VERTEX(maskX * intel->scale_units[1][0]);
1591
OUT_VERTEX(maskY * intel->scale_units[1][1]);
1595
i965_emit_composite_primitive(intel_screen_private *intel,
1597
int maskX, int maskY,
1601
float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
1602
Bool is_affine = intel->gen4_render_state->composite_op.is_affine;
1604
if (! intel->render_source_is_solid) {
1606
if (!intel_get_transformed_coordinates(srcX, srcY,
1607
intel->transform[0],
1612
if (!intel_get_transformed_coordinates(srcX, srcY + h,
1613
intel->transform[0],
1618
if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
1619
intel->transform[0],
1624
if (!intel_get_transformed_coordinates_3d(srcX, srcY,
1625
intel->transform[0],
1631
if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
1632
intel->transform[0],
1638
if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
1639
intel->transform[0],
1647
if (intel->render_mask) {
1649
if (!intel_get_transformed_coordinates(maskX, maskY,
1650
intel->transform[1],
1655
if (!intel_get_transformed_coordinates(maskX, maskY + h,
1656
intel->transform[1],
1661
if (!intel_get_transformed_coordinates(maskX + w, maskY + h,
1662
intel->transform[1],
1667
if (!intel_get_transformed_coordinates_3d(maskX, maskY,
1668
intel->transform[1],
1674
if (!intel_get_transformed_coordinates_3d(maskX, maskY + h,
1675
intel->transform[1],
1681
if (!intel_get_transformed_coordinates_3d(maskX + w, maskY + h,
1682
intel->transform[1],
1690
OUT_VERTEX(dstX + w);
1691
OUT_VERTEX(dstY + h);
1692
OUT_VERTEX(src_x[2] * intel->scale_units[0][0]);
1693
OUT_VERTEX(src_y[2] * intel->scale_units[0][1]);
1695
OUT_VERTEX(src_w[2]);
1696
if (intel->render_mask) {
1697
OUT_VERTEX(mask_x[2] * intel->scale_units[1][0]);
1698
OUT_VERTEX(mask_y[2] * intel->scale_units[1][1]);
1700
OUT_VERTEX(mask_w[2]);
1704
OUT_VERTEX(dstY + h);
1705
OUT_VERTEX(src_x[1] * intel->scale_units[0][0]);
1706
OUT_VERTEX(src_y[1] * intel->scale_units[0][1]);
1708
OUT_VERTEX(src_w[1]);
1709
if (intel->render_mask) {
1710
OUT_VERTEX(mask_x[1] * intel->scale_units[1][0]);
1711
OUT_VERTEX(mask_y[1] * intel->scale_units[1][1]);
1713
OUT_VERTEX(mask_w[1]);
1718
OUT_VERTEX(src_x[0] * intel->scale_units[0][0]);
1719
OUT_VERTEX(src_y[0] * intel->scale_units[0][1]);
1721
OUT_VERTEX(src_w[0]);
1722
if (intel->render_mask) {
1723
OUT_VERTEX(mask_x[0] * intel->scale_units[1][0]);
1724
OUT_VERTEX(mask_y[0] * intel->scale_units[1][1]);
1726
OUT_VERTEX(mask_w[0]);
1552
1731
i965_prepare_composite(int op, PicturePtr source_picture,
1553
1732
PicturePtr mask_picture, PicturePtr dest_picture,
1762
1955
ScrnInfoPtr scrn = xf86Screens[dest->drawable.pScreen->myNum];
1763
1956
intel_screen_private *intel = intel_get_screen_private(scrn);
1764
struct gen4_render_state *render_state = intel->gen4_render_state;
1766
float src_x[3], src_y[3], src_w[3], mask_x[3], mask_y[3], mask_w[3];
1767
Bool is_affine = render_state->composite_op.is_affine;
1770
if (!intel_get_transformed_coordinates(srcX, srcY,
1771
intel->transform[0],
1772
&src_x[0], &src_y[0]))
1774
if (!intel_get_transformed_coordinates(srcX, srcY + h,
1775
intel->transform[0],
1776
&src_x[1], &src_y[1]))
1778
if (!intel_get_transformed_coordinates(srcX + w, srcY + h,
1779
intel->transform[0],
1780
&src_x[2], &src_y[2]))
1783
if (!intel_get_transformed_coordinates_3d(srcX, srcY,
1784
intel->transform[0],
1785
&src_x[0], &src_y[0],
1788
if (!intel_get_transformed_coordinates_3d(srcX, srcY + h,
1789
intel->transform[0],
1790
&src_x[1], &src_y[1],
1793
if (!intel_get_transformed_coordinates_3d(srcX + w, srcY + h,
1794
intel->transform[0],
1795
&src_x[2], &src_y[2],
1800
if (intel->render_mask) {
1803
if (!intel_get_transformed_coordinates(maskX, maskY,
1809
if (!intel_get_transformed_coordinates(maskX, maskY + h,
1815
if (!intel_get_transformed_coordinates
1816
(maskX + w, maskY + h, intel->transform[1],
1817
&mask_x[2], &mask_y[2]))
1820
if (!intel_get_transformed_coordinates_3d(maskX, maskY,
1827
if (!intel_get_transformed_coordinates_3d
1828
(maskX, maskY + h, intel->transform[1], &mask_x[1],
1829
&mask_y[1], &mask_w[1]))
1831
if (!intel_get_transformed_coordinates_3d
1832
(maskX + w, maskY + h, intel->transform[1],
1833
&mask_x[2], &mask_y[2], &mask_w[2]))
1840
if (!i965_composite_check_aperture(scrn))
1841
intel_batch_submit(scrn, FALSE);
1843
1958
intel_batch_start_atomic(scrn, 200);
1844
1959
if (intel->needs_render_state_emit) {
1845
1960
i965_bind_surfaces(intel);
1847
1962
if (INTEL_INFO(intel)->gen >= 60)
1848
gen6_emit_composite_state(scrn);
1963
gen6_emit_composite_state(intel);
1850
i965_emit_composite_state(scrn);
1965
i965_emit_composite_state(intel);
1853
if (intel->vertex_used &&
1854
intel->floats_per_vertex != intel->last_floats_per_vertex) {
1968
if (intel->floats_per_vertex != intel->last_floats_per_vertex) {
1855
1969
intel->vertex_index = (intel->vertex_used + intel->floats_per_vertex - 1) / intel->floats_per_vertex;
1856
1970
intel->vertex_used = intel->vertex_index * intel->floats_per_vertex;
1971
intel->last_floats_per_vertex = intel->floats_per_vertex;
1858
if (intel->floats_per_vertex != intel->last_floats_per_vertex ||
1859
intel_vertex_space(intel) < 3*4*intel->floats_per_vertex) {
1973
if (intel_vertex_space(intel) < 3*4*intel->floats_per_vertex) {
1860
1974
i965_vertex_flush(intel);
1861
1975
intel_next_vertex(intel);
1862
i965_select_vertex_buffer(intel);
1863
1976
intel->vertex_index = 0;
1978
i965_select_vertex_buffer(intel);
1866
1980
if (intel->vertex_offset == 0) {
1867
1981
OUT_BATCH(BRW_3DPRIMITIVE |
1964
2045
sizeof(intel->surface_data), 4096);
1965
2046
intel->surface_used = 0;
2048
if (intel->gen4_render_state == NULL)
2049
intel->gen4_render_state = calloc(sizeof(*render), 1);
1967
2051
if (INTEL_INFO(intel)->gen >= 60)
1968
2052
return gen6_render_state_init(scrn);
1970
if (intel->gen4_render_state == NULL)
1971
intel->gen4_render_state = calloc(sizeof(*render_state), 1);
1973
render_state = intel->gen4_render_state;
1975
render_state->vs_state_bo = gen4_create_vs_unit_state(scrn);
2054
render = intel->gen4_render_state;
2055
render->composite_op.vertex_id = -1;
2057
render->vs_state_bo = gen4_create_vs_unit_state(intel);
1977
2059
/* Set up the two SF states (one for blending with a mask, one without) */
1978
2060
if (IS_GEN5(intel)) {
1979
sf_kernel_bo = intel_bo_alloc_for_data(scrn,
2061
sf_kernel_bo = intel_bo_alloc_for_data(intel,
1980
2062
sf_kernel_static_gen5,
1982
2064
(sf_kernel_static_gen5),
1983
2065
"sf kernel gen5");
1984
2066
sf_kernel_mask_bo =
1985
intel_bo_alloc_for_data(scrn, sf_kernel_mask_static_gen5,
2067
intel_bo_alloc_for_data(intel, sf_kernel_mask_static_gen5,
1986
2068
sizeof(sf_kernel_mask_static_gen5),
1987
2069
"sf mask kernel");
1989
sf_kernel_bo = intel_bo_alloc_for_data(scrn,
2071
sf_kernel_bo = intel_bo_alloc_for_data(intel,
1990
2072
sf_kernel_static,
1991
2073
sizeof(sf_kernel_static),
1993
sf_kernel_mask_bo = intel_bo_alloc_for_data(scrn,
2075
sf_kernel_mask_bo = intel_bo_alloc_for_data(intel,
1994
2076
sf_kernel_mask_static,
1996
2078
(sf_kernel_mask_static),
1997
2079
"sf mask kernel");
1999
render_state->sf_state_bo = gen4_create_sf_state(scrn, sf_kernel_bo);
2000
render_state->sf_mask_state_bo = gen4_create_sf_state(scrn,
2081
render->sf_state_bo = gen4_create_sf_state(intel, sf_kernel_bo);
2082
render->sf_mask_state_bo = gen4_create_sf_state(intel, sf_kernel_mask_bo);
2002
2083
drm_intel_bo_unreference(sf_kernel_bo);
2003
2084
drm_intel_bo_unreference(sf_kernel_mask_bo);
2005
for (m = 0; m < WM_KERNEL_COUNT; m++) {
2007
render_state->wm_kernel_bo[m] =
2008
intel_bo_alloc_for_data(scrn,
2009
wm_kernels_gen5[m].data,
2010
wm_kernels_gen5[m].size,
2013
render_state->wm_kernel_bo[m] =
2014
intel_bo_alloc_for_data(scrn,
2086
wm_kernels = IS_GEN5(intel) ? wm_kernels_gen5 : wm_kernels_gen4;
2087
for (m = 0; m < KERNEL_COUNT; m++) {
2088
render->wm_kernel_bo[m] =
2089
intel_bo_alloc_for_data(intel,
2020
2095
/* Set up the WM states: each filter/extend type for source and mask, per
2023
border_color_bo = sampler_border_color_create(scrn);
2024
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
2025
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
2026
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
2027
for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++) {
2098
border_color_bo = sampler_border_color_create(intel);
2099
for (i = 0; i < FILTER_COUNT; i++) {
2100
for (j = 0; j < EXTEND_COUNT; j++) {
2101
for (k = 0; k < FILTER_COUNT; k++) {
2102
for (l = 0; l < EXTEND_COUNT; l++) {
2028
2103
drm_intel_bo *sampler_state_bo;
2030
2105
sampler_state_bo =
2031
gen4_create_sampler_state(scrn,
2106
gen4_create_sampler_state(intel,
2034
2109
border_color_bo);
2036
for (m = 0; m < WM_KERNEL_COUNT; m++) {
2039
wm_state_bo[m][i][j]
2041
gen4_create_wm_state
2050
wm_state_bo[m][i][j]
2052
gen4_create_wm_state
2111
for (m = 0; m < KERNEL_COUNT; m++) {
2112
render->wm_state_bo[m][i][j][k][l] =
2113
gen4_create_wm_state
2115
wm_kernels[m]. has_mask,
2116
render->wm_kernel_bo[m],
2060
drm_intel_bo_unreference
2119
drm_intel_bo_unreference(sampler_state_bo);
2066
2124
drm_intel_bo_unreference(border_color_bo);
2068
render_state->cc_state_bo = gen4_create_cc_unit_state(scrn);
2126
render->cc_state_bo = gen4_create_cc_unit_state(intel);
2082
2140
drm_intel_bo_unreference(render_state->sf_state_bo);
2083
2141
drm_intel_bo_unreference(render_state->sf_mask_state_bo);
2085
for (i = 0; i < WM_KERNEL_COUNT; i++)
2143
for (i = 0; i < KERNEL_COUNT; i++)
2086
2144
drm_intel_bo_unreference(render_state->wm_kernel_bo[i]);
2088
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++)
2089
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++)
2090
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++)
2091
for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++)
2092
for (m = 0; m < WM_KERNEL_COUNT; m++)
2146
for (i = 0; i < FILTER_COUNT; i++)
2147
for (j = 0; j < EXTEND_COUNT; j++)
2148
for (k = 0; k < FILTER_COUNT; k++)
2149
for (l = 0; l < EXTEND_COUNT; l++)
2150
for (m = 0; m < KERNEL_COUNT; m++)
2093
2151
drm_intel_bo_unreference
2094
2152
(render_state->
2095
2153
wm_state_bo[m][i][j][k]
2098
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++)
2099
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++)
2100
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++)
2101
for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++)
2156
for (i = 0; i < FILTER_COUNT; i++)
2157
for (j = 0; j < EXTEND_COUNT; j++)
2158
for (k = 0; k < FILTER_COUNT; k++)
2159
for (l = 0; l < EXTEND_COUNT; l++)
2102
2160
drm_intel_bo_unreference(render_state->ps_sampler_state_bo[i][j][k][l]);
2104
2162
drm_intel_bo_unreference(render_state->cc_state_bo);
2117
2175
#define GEN6_BLEND_STATE_PADDED_SIZE ALIGN(sizeof(struct gen6_blend_state), 64)
2119
2177
static drm_intel_bo *
2120
gen6_composite_create_cc_state(ScrnInfoPtr scrn)
2178
gen6_composite_create_cc_state(intel_screen_private *intel)
2122
intel_screen_private *intel = intel_get_screen_private(scrn);
2123
struct gen6_color_calc_state *cc_state;
2180
struct gen6_color_calc_state *state;
2124
2181
drm_intel_bo *cc_bo;
2126
2183
cc_bo = drm_intel_bo_alloc(intel->bufmgr,
2127
2184
"gen6 CC state",
2130
2187
drm_intel_bo_map(cc_bo, TRUE);
2131
cc_state = cc_bo->virtual;
2132
memset(cc_state, 0, sizeof(*cc_state));
2133
cc_state->constant_r = 1.0;
2134
cc_state->constant_g = 0.0;
2135
cc_state->constant_b = 1.0;
2136
cc_state->constant_a = 1.0;
2188
state = cc_bo->virtual;
2189
memset(state, 0, sizeof(*state));
2190
state->constant_r = 1.0;
2191
state->constant_g = 0.0;
2192
state->constant_b = 1.0;
2193
state->constant_a = 1.0;
2137
2194
drm_intel_bo_unmap(cc_bo);
2142
2199
static drm_intel_bo *
2143
gen6_composite_create_blend_state(ScrnInfoPtr scrn)
2200
gen6_composite_create_blend_state(intel_screen_private *intel)
2145
intel_screen_private *intel = intel_get_screen_private(scrn);
2146
struct gen6_blend_state *blend_state;
2147
2202
drm_intel_bo *blend_bo;
2148
int src_blend, dst_blend;
2150
2205
blend_bo = drm_intel_bo_alloc(intel->bufmgr,
2151
2206
"gen6 BLEND state",
2154
2209
drm_intel_bo_map(blend_bo, TRUE);
2155
2210
memset(blend_bo->virtual, 0, blend_bo->size);
2157
for (src_blend = 0; src_blend < BRW_BLENDFACTOR_COUNT; src_blend++) {
2158
for (dst_blend = 0; dst_blend < BRW_BLENDFACTOR_COUNT; dst_blend++) {
2159
uint32_t blend_state_offset = ((src_blend * BRW_BLENDFACTOR_COUNT) + dst_blend) * GEN6_BLEND_STATE_PADDED_SIZE;
2161
blend_state = (struct gen6_blend_state *)((char *)blend_bo->virtual + blend_state_offset);
2162
blend_state->blend0.dest_blend_factor = dst_blend;
2163
blend_state->blend0.source_blend_factor = src_blend;
2164
blend_state->blend0.blend_func = BRW_BLENDFUNCTION_ADD;
2165
blend_state->blend0.ia_blend_enable = 0;
2166
blend_state->blend0.blend_enable = 1;
2168
blend_state->blend1.post_blend_clamp_enable = 1;
2169
blend_state->blend1.pre_blend_clamp_enable = 1;
2170
blend_state->blend1.clamp_range = 0; /* clamp range [0, 1] */
2171
blend_state->blend1.dither_enable = 0;
2172
blend_state->blend1.logic_op_enable = 0;
2173
blend_state->blend1.alpha_test_enable = 0;
2212
for (src = 0; src < BRW_BLENDFACTOR_COUNT; src++) {
2213
for (dst = 0; dst < BRW_BLENDFACTOR_COUNT; dst++) {
2214
uint32_t blend_state_offset = (src * BRW_BLENDFACTOR_COUNT + dst) * GEN6_BLEND_STATE_PADDED_SIZE;
2215
struct gen6_blend_state *blend;
2217
blend = (struct gen6_blend_state *)((char *)blend_bo->virtual + blend_state_offset);
2218
blend->blend0.dest_blend_factor = dst;
2219
blend->blend0.source_blend_factor = src;
2220
blend->blend0.blend_func = BRW_BLENDFUNCTION_ADD;
2221
blend->blend0.blend_enable = 1;
2223
blend->blend1.post_blend_clamp_enable = 1;
2224
blend->blend1.pre_blend_clamp_enable = 1;
2513
2564
OUT_BATCH(BRW_3DSTATE_VERTEX_ELEMENTS |
2514
2565
((2 * (2 + nelem)) + 1 - 2));
2516
OUT_BATCH((0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) |
2518
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
2519
(0 << VE0_OFFSET_SHIFT));
2567
OUT_BATCH((id << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | GEN6_VE0_VALID |
2568
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
2569
(0 << VE0_OFFSET_SHIFT));
2520
2570
OUT_BATCH((BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_0_SHIFT) |
2521
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_1_SHIFT) |
2522
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT) |
2523
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT));
2571
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_1_SHIFT) |
2572
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_2_SHIFT) |
2573
(BRW_VFCOMPONENT_STORE_0 << VE1_VFCOMPONENT_3_SHIFT));
2526
OUT_BATCH((0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) |
2528
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
2529
(0 << VE0_OFFSET_SHIFT)); /* offsets vb in bytes */
2576
OUT_BATCH((id << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | GEN6_VE0_VALID |
2577
(BRW_SURFACEFORMAT_R32G32_FLOAT << VE0_FORMAT_SHIFT) |
2578
(0 << VE0_OFFSET_SHIFT)); /* offsets vb in bytes */
2530
2579
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
2531
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
2532
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
2533
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
2580
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
2581
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_2_SHIFT) |
2582
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
2535
2584
/* u0, v0, w0 */
2536
OUT_BATCH((0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) |
2538
(src_format << VE0_FORMAT_SHIFT) |
2539
((2 * 4) << VE0_OFFSET_SHIFT)); /* offset vb in bytes */
2585
OUT_BATCH((id << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) | GEN6_VE0_VALID |
2586
(src_format << VE0_FORMAT_SHIFT) |
2587
((2 * 4) << VE0_OFFSET_SHIFT)); /* offset vb in bytes */
2540
2588
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
2541
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
2542
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
2543
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
2589
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
2590
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
2591
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
2545
2593
/* u1, v1, w1 */
2546
2594
if (has_mask) {
2547
OUT_BATCH((0 << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) |
2549
(src_format << VE0_FORMAT_SHIFT) |
2550
(((2 + selem) * 4) << VE0_OFFSET_SHIFT)); /* vb offset in bytes */
2595
OUT_BATCH((id << GEN6_VE0_VERTEX_BUFFER_INDEX_SHIFT) |
2597
(src_format << VE0_FORMAT_SHIFT) |
2598
(((2 + selem) * 4) << VE0_OFFSET_SHIFT)); /* vb offset in bytes */
2551
2599
OUT_BATCH((BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_0_SHIFT) |
2552
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
2553
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
2554
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
2600
(BRW_VFCOMPONENT_STORE_SRC << VE1_VFCOMPONENT_1_SHIFT) |
2601
(w_component << VE1_VFCOMPONENT_2_SHIFT) |
2602
(BRW_VFCOMPONENT_STORE_1_FLT << VE1_VFCOMPONENT_3_SHIFT));
2559
gen6_emit_composite_state(ScrnInfoPtr scrn)
2607
gen6_emit_composite_state(struct intel_screen_private *intel)
2561
intel_screen_private *intel = intel_get_screen_private(scrn);
2562
struct gen4_render_state *render_state = intel->gen4_render_state;
2563
gen4_composite_op *composite_op = &render_state->composite_op;
2564
int op = composite_op->op;
2565
PicturePtr mask_picture = intel->render_mask_picture;
2566
PicturePtr dest_picture = intel->render_dest_picture;
2567
PixmapPtr mask = intel->render_mask;
2568
PixmapPtr dest = intel->render_dest;
2609
struct gen4_render_state *render = intel->gen4_render_state;
2610
gen4_composite_op *composite_op = &render->composite_op;
2569
2611
sampler_state_filter_t src_filter = composite_op->src_filter;
2570
2612
sampler_state_filter_t mask_filter = composite_op->mask_filter;
2571
2613
sampler_state_extend_t src_extend = composite_op->src_extend;
2572
2614
sampler_state_extend_t mask_extend = composite_op->mask_extend;
2573
2615
Bool is_affine = composite_op->is_affine;
2574
uint32_t src_blend, dst_blend;
2575
drm_intel_bo *ps_sampler_state_bo = render_state->ps_sampler_state_bo[src_filter][src_extend][mask_filter][mask_extend];
2616
Bool has_mask = intel->render_mask != NULL;
2618
drm_intel_bo *ps_sampler_state_bo = render->ps_sampler_state_bo[src_filter][src_extend][mask_filter][mask_extend];
2577
2620
intel->needs_render_state_emit = FALSE;
2578
2621
if (intel->needs_3d_invariant) {
2579
2622
gen6_composite_invariant_states(intel);
2580
2623
gen6_composite_viewport_state_pointers(intel,
2581
render_state->cc_vp_bo);
2582
2625
gen6_composite_urb(intel);
2584
2627
gen6_composite_vs_state(intel);
2590
2633
intel->needs_3d_invariant = FALSE;
2593
i965_get_blend_cntl(op,
2595
dest_picture->format,
2636
i965_get_blend_cntl(composite_op->op,
2637
intel->render_mask_picture,
2638
intel->render_dest_picture->format,
2599
2641
if (intel->surface_reloc == 0)
2600
2642
gen6_composite_state_base_address(intel);
2602
2644
gen6_composite_cc_state_pointers(intel,
2603
((src_blend * BRW_BLENDFACTOR_COUNT) + dst_blend) * GEN6_BLEND_STATE_PADDED_SIZE);
2645
(src * BRW_BLENDFACTOR_COUNT + dst) * GEN6_BLEND_STATE_PADDED_SIZE);
2604
2646
gen6_composite_sampler_state_pointers(intel, ps_sampler_state_bo);
2605
gen6_composite_sf_state(intel, mask != 0);
2647
gen6_composite_sf_state(intel, has_mask);
2606
2648
gen6_composite_wm_state(intel,
2608
render_state->wm_kernel_bo[composite_op->wm_kernel]);
2650
render->wm_kernel_bo[composite_op->wm_kernel]);
2609
2651
gen6_composite_binding_table_pointers(intel);
2611
gen6_composite_drawing_rectangle(intel, dest);
2612
gen6_composite_vertex_element_state(intel, mask != 0, is_affine);
2653
gen6_composite_drawing_rectangle(intel, intel->render_dest);
2654
gen6_composite_vertex_element_state(intel, has_mask, is_affine);
2616
2658
gen6_render_state_init(ScrnInfoPtr scrn)
2618
2660
intel_screen_private *intel = intel_get_screen_private(scrn);
2619
struct gen4_render_state *render_state;
2661
struct gen4_render_state *render;
2620
2662
int i, j, k, l, m;
2621
2663
drm_intel_bo *border_color_bo;
2665
render= intel->gen4_render_state;
2666
render->composite_op.vertex_id = -1;
2623
2668
intel->gen6_render_state.num_sf_outputs = 0;
2624
2669
intel->gen6_render_state.samplers = NULL;
2625
2670
intel->gen6_render_state.blend = -1;
2626
2671
intel->gen6_render_state.kernel = NULL;
2627
intel->gen6_render_state.vertex_size = 0;
2628
intel->gen6_render_state.vertex_type = 0;
2629
2672
intel->gen6_render_state.drawrect = -1;
2631
if (intel->gen4_render_state == NULL)
2632
intel->gen4_render_state = calloc(sizeof(*render_state), 1);
2634
render_state = intel->gen4_render_state;
2636
for (m = 0; m < WM_KERNEL_COUNT; m++) {
2637
render_state->wm_kernel_bo[m] =
2638
intel_bo_alloc_for_data(scrn,
2639
wm_kernels_gen6[m].data,
2640
wm_kernels_gen6[m].size,
2674
for (m = 0; m < KERNEL_COUNT; m++) {
2675
render->wm_kernel_bo[m] =
2676
intel_bo_alloc_for_data(intel,
2677
wm_kernels_gen6[m].data,
2678
wm_kernels_gen6[m].size,
2644
border_color_bo = sampler_border_color_create(scrn);
2682
border_color_bo = sampler_border_color_create(intel);
2646
for (i = 0; i < SAMPLER_STATE_FILTER_COUNT; i++) {
2647
for (j = 0; j < SAMPLER_STATE_EXTEND_COUNT; j++) {
2648
for (k = 0; k < SAMPLER_STATE_FILTER_COUNT; k++) {
2649
for (l = 0; l < SAMPLER_STATE_EXTEND_COUNT; l++) {
2650
render_state->ps_sampler_state_bo[i][j][k][l] =
2651
gen4_create_sampler_state(scrn,
2684
for (i = 0; i < FILTER_COUNT; i++) {
2685
for (j = 0; j < EXTEND_COUNT; j++) {
2686
for (k = 0; k < FILTER_COUNT; k++) {
2687
for (l = 0; l < EXTEND_COUNT; l++) {
2688
render->ps_sampler_state_bo[i][j][k][l] =
2689
gen4_create_sampler_state(intel,
2660
2698
drm_intel_bo_unreference(border_color_bo);
2661
render_state->cc_vp_bo = gen4_create_cc_viewport(scrn);
2662
render_state->cc_state_bo = gen6_composite_create_cc_state(scrn);
2663
render_state->gen6_blend_bo = gen6_composite_create_blend_state(scrn);
2664
render_state->gen6_depth_stencil_bo = gen6_composite_create_depth_stencil_state(scrn);
2699
render->cc_vp_bo = gen4_create_cc_viewport(intel);
2700
render->cc_state_bo = gen6_composite_create_cc_state(intel);
2701
render->gen6_blend_bo = gen6_composite_create_blend_state(intel);
2702
render->gen6_depth_stencil_bo = gen6_composite_create_depth_stencil_state(intel);
2667
2705
void i965_vertex_flush(struct intel_screen_private *intel)