685
685
util_copy_image_view(&setup->images[i].current, &images[i]);
687
687
struct pipe_resource *res = image->resource;
688
struct llvmpipe_resource *lp_res = llvmpipe_resource(res);
689
struct lp_jit_image *jit_image = &setup->fs.current.jit_context.images[i];
688
struct lp_jit_image *jit_image = &setup->fs.current.jit_resources.images[i];
695
/* regular texture - setup array of mipmap level offsets */
696
if (llvmpipe_resource_is_texture(res)) {
697
jit_image->base = lp_res->tex_data;
699
jit_image->base = lp_res->data;
702
jit_image->width = res->width0;
703
jit_image->height = res->height0;
704
jit_image->depth = res->depth0;
705
jit_image->num_samples = res->nr_samples;
707
if (llvmpipe_resource_is_texture(res)) {
708
uint32_t mip_offset = lp_res->mip_offsets[image->u.tex.level];
710
jit_image->width = u_minify(jit_image->width, image->u.tex.level);
711
jit_image->height = u_minify(jit_image->height, image->u.tex.level);
713
if (res->target == PIPE_TEXTURE_1D_ARRAY ||
714
res->target == PIPE_TEXTURE_2D_ARRAY ||
715
res->target == PIPE_TEXTURE_3D ||
716
res->target == PIPE_TEXTURE_CUBE ||
717
res->target == PIPE_TEXTURE_CUBE_ARRAY) {
719
* For array textures, we don't have first_layer, instead
720
* adjust last_layer (stored as depth) plus the mip level offsets
721
* (as we have mip-first layout can't just adjust base ptr).
722
* XXX For mip levels, could do something similar.
724
jit_image->depth = image->u.tex.last_layer - image->u.tex.first_layer + 1;
725
mip_offset += image->u.tex.first_layer * lp_res->img_stride[image->u.tex.level];
727
jit_image->depth = u_minify(jit_image->depth, image->u.tex.level);
729
jit_image->row_stride = lp_res->row_stride[image->u.tex.level];
730
jit_image->img_stride = lp_res->img_stride[image->u.tex.level];
731
jit_image->sample_stride = lp_res->sample_stride;
732
jit_image->base = (uint8_t *)jit_image->base + mip_offset;
734
unsigned view_blocksize = util_format_get_blocksize(image->format);
735
jit_image->width = image->u.buf.size / view_blocksize;
736
jit_image->base = (uint8_t *)jit_image->base + image->u.buf.offset;
693
lp_jit_image_from_pipe(jit_image, image);
740
695
for (; i < ARRAY_SIZE(setup->images); i++) {
741
696
util_copy_image_view(&setup->images[i].current, NULL);
940
895
struct pipe_resource *res = view->texture;
941
struct llvmpipe_resource *lp_tex = llvmpipe_resource(res);
942
896
struct lp_jit_texture *jit_tex;
943
jit_tex = &setup->fs.current.jit_context.textures[i];
897
jit_tex = &setup->fs.current.jit_resources.textures[i];
945
899
/* We're referencing the texture's internal data, so save a
946
900
* reference to it.
948
902
pipe_resource_reference(&setup->fs.current_tex[i], res);
951
/* regular texture - setup array of mipmap level offsets */
952
unsigned first_level = 0;
953
unsigned last_level = 0;
955
if (llvmpipe_resource_is_texture(res)) {
956
first_level = view->u.tex.first_level;
957
last_level = view->u.tex.last_level;
958
assert(first_level <= last_level);
959
assert(last_level <= res->last_level);
960
jit_tex->base = lp_tex->tex_data;
962
jit_tex->base = lp_tex->data;
965
if (LP_PERF & PERF_TEX_MEM) {
966
/* use dummy tile memory */
967
jit_tex->base = lp_dummy_tile;
968
jit_tex->width = TILE_SIZE/8;
969
jit_tex->height = TILE_SIZE/8;
971
jit_tex->first_level = 0;
972
jit_tex->last_level = 0;
973
jit_tex->mip_offsets[0] = 0;
974
jit_tex->row_stride[0] = 0;
975
jit_tex->img_stride[0] = 0;
976
jit_tex->num_samples = 0;
977
jit_tex->sample_stride = 0;
979
jit_tex->width = res->width0;
980
jit_tex->height = res->height0;
981
jit_tex->depth = res->depth0;
982
jit_tex->first_level = first_level;
983
jit_tex->last_level = last_level;
984
jit_tex->num_samples = res->nr_samples;
985
jit_tex->sample_stride = 0;
987
if (llvmpipe_resource_is_texture(res)) {
988
for (unsigned j = first_level; j <= last_level; j++) {
989
jit_tex->mip_offsets[j] = lp_tex->mip_offsets[j];
990
jit_tex->row_stride[j] = lp_tex->row_stride[j];
991
jit_tex->img_stride[j] = lp_tex->img_stride[j];
994
jit_tex->sample_stride = lp_tex->sample_stride;
996
if (res->target == PIPE_TEXTURE_1D_ARRAY ||
997
res->target == PIPE_TEXTURE_2D_ARRAY ||
998
res->target == PIPE_TEXTURE_CUBE ||
999
res->target == PIPE_TEXTURE_CUBE_ARRAY ||
1000
(res->target == PIPE_TEXTURE_3D && view->target == PIPE_TEXTURE_2D)) {
1002
* For array textures, we don't have first_layer, instead
1003
* adjust last_layer (stored as depth) plus the mip level
1004
* offsets (as we have mip-first layout can't just adjust
1005
* base ptr). XXX For mip levels, could do something
1008
jit_tex->depth = view->u.tex.last_layer - view->u.tex.first_layer + 1;
1009
for (unsigned j = first_level; j <= last_level; j++) {
1010
jit_tex->mip_offsets[j] += view->u.tex.first_layer *
1011
lp_tex->img_stride[j];
1013
if (view->target == PIPE_TEXTURE_CUBE ||
1014
view->target == PIPE_TEXTURE_CUBE_ARRAY) {
1015
assert(jit_tex->depth % 6 == 0);
1017
assert(view->u.tex.first_layer <= view->u.tex.last_layer);
1018
if (res->target == PIPE_TEXTURE_3D)
1019
assert(view->u.tex.last_layer < res->depth0);
1021
assert(view->u.tex.last_layer < res->array_size);
1025
* For buffers, we don't have "offset", instead adjust
1026
* the size (stored as width) plus the base pointer.
1028
const unsigned view_blocksize =
1029
util_format_get_blocksize(view->format);
1030
/* probably don't really need to fill that out */
1031
jit_tex->mip_offsets[0] = 0;
1032
jit_tex->row_stride[0] = 0;
1033
jit_tex->img_stride[0] = 0;
1035
/* everything specified in number of elements here. */
1036
jit_tex->width = view->u.buf.size / view_blocksize;
1037
jit_tex->base = (uint8_t *)jit_tex->base + view->u.buf.offset;
1038
/* XXX Unsure if we need to sanitize parameters? */
1039
assert(view->u.buf.offset + view->u.buf.size <= res->width0);
1043
/* display target texture/surface */
1044
jit_tex->base = llvmpipe_resource_map(res, 0, 0, LP_TEX_USAGE_READ);
1045
jit_tex->row_stride[0] = lp_tex->row_stride[0];
1046
jit_tex->img_stride[0] = lp_tex->img_stride[0];
1047
jit_tex->mip_offsets[0] = 0;
1048
jit_tex->width = res->width0;
1049
jit_tex->height = res->height0;
1050
jit_tex->depth = res->depth0;
1051
jit_tex->first_level = jit_tex->last_level = 0;
1052
jit_tex->num_samples = res->nr_samples;
1053
jit_tex->sample_stride = 0;
1054
assert(jit_tex->base);
904
lp_jit_texture_from_pipe(jit_tex, view);
1057
906
pipe_resource_reference(&setup->fs.current_tex[i], NULL);
1220
1057
if (setup->dirty & LP_SETUP_NEW_CONSTANTS) {
1221
1058
for (unsigned i = 0; i < ARRAY_SIZE(setup->constants); ++i) {
1222
struct pipe_resource *buffer = setup->constants[i].current.buffer;
1223
const unsigned current_size = MIN2(setup->constants[i].current.buffer_size,
1224
LP_MAX_TGSI_CONST_BUFFER_SIZE);
1225
const ubyte *current_data = NULL;
1227
STATIC_ASSERT(DATA_BLOCK_SIZE >= LP_MAX_TGSI_CONST_BUFFER_SIZE);
1230
/* resource buffer */
1231
current_data = (ubyte *) llvmpipe_resource_data(buffer);
1232
} else if (setup->constants[i].current.user_buffer) {
1233
/* user-space buffer */
1234
current_data = (ubyte *) setup->constants[i].current.user_buffer;
1237
if (current_data && current_size >= sizeof(float)) {
1238
current_data += setup->constants[i].current.buffer_offset;
1240
/* TODO: copy only the actually used constants? */
1242
if (setup->constants[i].stored_size != current_size ||
1243
!setup->constants[i].stored_data ||
1244
memcmp(setup->constants[i].stored_data,
1246
current_size) != 0) {
1248
void *stored = lp_scene_alloc(scene, current_size);
1257
setup->constants[i].stored_size = current_size;
1258
setup->constants[i].stored_data = stored;
1260
setup->fs.current.jit_context.constants[i].f =
1261
setup->constants[i].stored_data;
1263
setup->constants[i].stored_size = 0;
1264
setup->constants[i].stored_data = NULL;
1265
setup->fs.current.jit_context.constants[i].f = fake_const_buf;
1268
const int num_constants =
1269
DIV_ROUND_UP(setup->constants[i].stored_size,
1270
lp_get_constant_buffer_stride(scene->pipe->screen));
1271
setup->fs.current.jit_context.constants[i].num_elements = num_constants;
1059
lp_jit_buffer_from_pipe_const(&setup->fs.current.jit_resources.constants[i],
1060
&setup->constants[i].current, setup->pipe->screen);
1061
if (setup->constants[i].current.buffer &&
1062
!lp_scene_add_resource_reference(scene,
1063
setup->constants[i].current.buffer,
1064
new_scene, false)) {
1272
1068
setup->dirty |= LP_SETUP_NEW_FS;
1276
1072
if (setup->dirty & LP_SETUP_NEW_SSBOS) {
1277
1073
for (unsigned i = 0; i < ARRAY_SIZE(setup->ssbos); ++i) {
1278
struct pipe_resource *buffer = setup->ssbos[i].current.buffer;
1279
const ubyte *current_data = NULL;
1281
/* resource buffer */
1283
current_data = (ubyte *) llvmpipe_resource_data(buffer);
1286
current_data += setup->ssbos[i].current.buffer_offset;
1288
setup->fs.current.jit_context.ssbos[i].u =
1289
(const uint32_t *)current_data;
1290
setup->fs.current.jit_context.ssbos[i].num_elements =
1291
setup->ssbos[i].current.buffer_size;
1293
setup->fs.current.jit_context.ssbos[i].u = NULL;
1294
setup->fs.current.jit_context.ssbos[i].num_elements = 0;
1074
lp_jit_buffer_from_pipe(&setup->fs.current.jit_resources.ssbos[i],
1075
&setup->ssbos[i].current);
1296
1076
setup->dirty |= LP_SETUP_NEW_FS;
1310
1090
(struct lp_rast_state *) lp_scene_alloc(scene, sizeof *stored);
1312
1092
assert(!new_scene);
1316
1096
memcpy(&stored->jit_context,
1317
1097
&setup->fs.current.jit_context,
1318
1098
sizeof setup->fs.current.jit_context);
1099
memcpy(&stored->jit_resources,
1100
&setup->fs.current.jit_resources,
1101
sizeof setup->fs.current.jit_resources);
1320
stored->jit_context.aniso_filter_table =
1103
stored->jit_resources.aniso_filter_table =
1321
1104
lp_build_sample_aniso_filter_table();
1322
1105
stored->variant = setup->fs.current.variant;
1324
1107
if (!lp_scene_add_frag_shader_reference(scene,
1325
1108
setup->fs.current.variant)) {
1329
1112
setup->fs.stored = stored;