Lines Matching refs:setup

62 static boolean try_update_scene_state( struct lp_setup_context *setup );
66 lp_setup_get_empty_scene(struct lp_setup_context *setup)
68 assert(setup->scene == NULL);
70 setup->scene_idx++;
71 setup->scene_idx %= Elements(setup->scenes);
73 setup->scene = setup->scenes[setup->scene_idx];
75 if (setup->scene->fence) {
78 __FUNCTION__, setup->scene->fence->id);
80 lp_fence_wait(setup->scene->fence);
83 lp_scene_begin_binning(setup->scene, &setup->fb);
89 first_triangle( struct lp_setup_context *setup,
94 assert(setup->state == SETUP_ACTIVE);
95 lp_setup_choose_triangle( setup );
96 setup->triangle( setup, v0, v1, v2 );
100 first_line( struct lp_setup_context *setup,
104 assert(setup->state == SETUP_ACTIVE);
105 lp_setup_choose_line( setup );
106 setup->line( setup, v0, v1 );
110 first_point( struct lp_setup_context *setup,
113 assert(setup->state == SETUP_ACTIVE);
114 lp_setup_choose_point( setup );
115 setup->point( setup, v0 );
118 void lp_setup_reset( struct lp_setup_context *setup )
123 setup->constants.stored_size = 0;
124 setup->constants.stored_data = NULL;
125 setup->fs.stored = NULL;
126 setup->dirty = ~0;
129 setup->scene = NULL;
133 memset(&setup->clear, 0, sizeof setup->clear);
138 setup->line = first_line;
139 setup->point = first_point;
140 setup->triangle = first_triangle;
146 lp_setup_rasterize_scene( struct lp_setup_context *setup )
148 struct lp_scene *scene = setup->scene;
153 lp_fence_reference(&setup->last_fence, scene->fence);
155 if (setup->last_fence)
156 setup->last_fence->issued = TRUE;
163 lp_scene_end_rasterization(setup->scene);
164 lp_setup_reset( setup );
172 begin_binning( struct lp_setup_context *setup )
174 struct lp_scene *scene = setup->scene;
184 scene->fence = lp_fence_create(MAX2(1, setup->num_threads));
197 ok = try_update_scene_state(setup);
201 if (setup->fb.zsbuf &&
202 ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
203 util_format_is_depth_and_stencil(setup->fb.zsbuf->format))
207 (setup->clear.flags & PIPE_CLEAR_COLOR) ? "clear": "load",
210 if (setup->fb.nr_cbufs) {
211 if (setup->clear.flags & PIPE_CLEAR_COLOR) {
214 setup->clear.color );
220 if (setup->fb.zsbuf) {
221 if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) {
228 setup->clear.zsvalue,
229 setup->clear.zsmask));
235 if (setup->active_query) {
238 lp_rast_arg_query(setup->active_query) );
243 setup->clear.flags = 0;
244 setup->clear.zsmask = 0;
245 setup->clear.zsvalue = 0;
258 execute_clears( struct lp_setup_context *setup )
262 return begin_binning( setup );
273 set_scene_state( struct lp_setup_context *setup,
277 unsigned old_state = setup->state;
290 if (new_state == SETUP_FLUSHED && setup->scene)
291 lp_debug_draw_bins_by_cmd_length(setup->scene);
297 lp_setup_get_empty_scene(setup);
304 if (!begin_binning( setup ))
310 if (!execute_clears( setup ))
313 lp_setup_rasterize_scene( setup );
314 assert(setup->scene == NULL);
318 assert(0 && "invalid setup state mode");
322 setup->state = new_state;
326 if (setup->scene) {
327 lp_scene_end_rasterization(setup->scene);
328 setup->scene = NULL;
331 setup->state = SETUP_FLUSHED;
332 lp_setup_reset( setup );
338 lp_setup_flush( struct lp_setup_context *setup,
342 set_scene_state( setup, SETUP_FLUSHED, reason );
345 lp_fence_reference((struct lp_fence **)fence, setup->last_fence);
351 lp_setup_bind_framebuffer( struct lp_setup_context *setup,
358 set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ );
363 assert(!setup->scene);
368 util_copy_framebuffer_state(&setup->fb, fb);
369 setup->framebuffer.x0 = 0;
370 setup->framebuffer.y0 = 0;
371 setup->framebuffer.x1 = fb->width-1;
372 setup->framebuffer.y1 = fb->height-1;
373 setup->dirty |= LP_SETUP_NEW_SCISSOR;
378 lp_setup_try_clear( struct lp_setup_context *setup,
389 LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state);
400 zsvalue = util_pack_z_stencil(setup->fb.zsbuf->format,
405 zsmask = util_pack_mask_z_stencil(setup->fb.zsbuf->format,
412 if (setup->state == SETUP_ACTIVE) {
413 struct lp_scene *scene = setup->scene;
441 set_scene_state( setup, SETUP_CLEARED, __FUNCTION__ );
443 setup->clear.flags |= flags;
446 setup->clear.zsmask |= zsmask;
447 setup->clear.zsvalue =
448 (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask);
452 memcpy(setup->clear.color.clear_color,
454 sizeof setup->clear.color.clear_color);
462 lp_setup_clear( struct lp_setup_context *setup,
468 if (!lp_setup_try_clear( setup, color, depth, stencil, flags )) {
469 lp_setup_flush(setup, NULL, __FUNCTION__);
471 if (!lp_setup_try_clear( setup, color, depth, stencil, flags ))
481 lp_setup_set_triangle_state( struct lp_setup_context *setup,
489 setup->ccw_is_frontface = ccw_is_frontface;
490 setup->cullmode = cull_mode;
491 setup->triangle = first_triangle;
492 setup->pixel_offset = gl_rasterization_rules ? 0.5f : 0.0f;
494 if (setup->scissor_test != scissor) {
495 setup->dirty |= LP_SETUP_NEW_SCISSOR;
496 setup->scissor_test = scissor;
501 lp_setup_set_line_state( struct lp_setup_context *setup,
506 setup->line_width = line_width;
510 lp_setup_set_point_state( struct lp_setup_context *setup,
518 setup->point_size = point_size;
519 setup->sprite_coord_enable = sprite_coord_enable;
520 setup->sprite_coord_origin = sprite_coord_origin;
521 setup->point_size_per_vertex = point_size_per_vertex;
525 lp_setup_set_setup_variant( struct lp_setup_context *setup,
530 setup->setup.variant = variant;
534 lp_setup_set_fs_variant( struct lp_setup_context *setup,
541 setup->fs.current.variant = variant;
542 setup->dirty |= LP_SETUP_NEW_FS;
546 lp_setup_set_fs_constants(struct lp_setup_context *setup,
551 pipe_resource_reference(&setup->constants.current, buffer);
553 setup->dirty |= LP_SETUP_NEW_CONSTANTS;
558 lp_setup_set_alpha_ref_value( struct lp_setup_context *setup,
563 if(setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) {
564 setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value;
565 setup->dirty |= LP_SETUP_NEW_FS;
570 lp_setup_set_stencil_ref_values( struct lp_setup_context *setup,
575 if (setup->fs.current.jit_context.stencil_ref_front != refs[0] ||
576 setup->fs.current.jit_context.stencil_ref_back != refs[1]) {
577 setup->fs.current.jit_context.stencil_ref_front = refs[0];
578 setup->fs.current.jit_context.stencil_ref_back = refs[1];
579 setup->dirty |= LP_SETUP_NEW_FS;
584 lp_setup_set_blend_color( struct lp_setup_context *setup,
591 if(memcmp(&setup->blend_color.current, blend_color, sizeof *blend_color) != 0) {
592 memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color);
593 setup->dirty |= LP_SETUP_NEW_BLEND_COLOR;
599 lp_setup_set_scissor( struct lp_setup_context *setup,
606 setup->scissor.x0 = scissor->minx;
607 setup->scissor.x1 = scissor->maxx-1;
608 setup->scissor.y0 = scissor->miny;
609 setup->scissor.y1 = scissor->maxy-1;
610 setup->dirty |= LP_SETUP_NEW_SCISSOR;
615 lp_setup_set_flatshade_first( struct lp_setup_context *setup,
618 setup->flatshade_first = flatshade_first;
623 lp_setup_set_vertex_info( struct lp_setup_context *setup,
628 setup->vertex_info = vertex_info;
636 lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup,
653 jit_tex = &setup->fs.current.jit_context.textures[i];
663 pipe_resource_reference(&setup->fs.current_tex[i], tex);
666 /* regular texture - setup array of mipmap level pointers */
705 setup->dirty |= LP_SETUP_NEW_FS;
713 lp_setup_set_fragment_sampler_state(struct lp_setup_context *setup,
728 jit_tex = &setup->fs.current.jit_context.textures[i];
737 setup->dirty |= LP_SETUP_NEW_FS;
747 lp_setup_is_resource_referenced( const struct lp_setup_context *setup,
753 for (i = 0; i < setup->fb.nr_cbufs; i++) {
754 if (setup->fb.cbufs[i]->texture == texture)
757 if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) {
762 for (i = 0; i < Elements(setup->scenes); i++) {
763 if (lp_scene_is_resource_referenced(setup->scenes[i], texture)) {
776 try_update_scene_state( struct lp_setup_context *setup )
778 boolean new_scene = (setup->fs.stored == NULL);
779 struct lp_scene *scene = setup->scene;
783 if(setup->dirty & LP_SETUP_NEW_BLEND_COLOR) {
795 uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]);
800 setup->blend_color.stored = stored;
801 setup->fs.current.jit_context.blend_color = setup->blend_color.stored;
802 setup->dirty |= LP_SETUP_NEW_FS;
805 if(setup->dirty & LP_SETUP_NEW_CONSTANTS) {
806 struct pipe_resource *buffer = setup->constants.current;
814 if(setup->constants.stored_size != current_size ||
815 !setup->constants.stored_data ||
816 memcmp(setup->constants.stored_data,
830 setup->constants.stored_size = current_size;
831 setup->constants.stored_data = stored;
835 setup->constants.stored_size = 0;
836 setup->constants.stored_data = NULL;
839 setup->fs.current.jit_context.constants = setup->constants.stored_data;
840 setup->dirty |= LP_SETUP_NEW_FS;
844 if (setup->dirty & LP_SETUP_NEW_FS) {
845 if (!setup->fs.stored ||
846 memcmp(setup->fs.stored,
847 &setup->fs.current,
848 sizeof setup->fs.current) != 0)
855 * and append it to the bin's setup data buffer.
864 &setup->fs.current,
865 sizeof setup->fs.current);
866 setup->fs.stored = stored;
871 for (i = 0; i < Elements(setup->fs.current_tex); i++) {
872 if (setup->fs.current_tex[i]) {
874 setup->fs.current_tex[i],
884 if (setup->dirty & LP_SETUP_NEW_SCISSOR) {
885 setup->draw_region = setup->framebuffer;
886 if (setup->scissor_test) {
887 u_rect_possible_intersection(&setup->scissor,
888 &setup->draw_region);
892 setup->dirty = 0;
894 assert(setup->fs.stored);
899 lp_setup_update_state( struct lp_setup_context *setup,
906 * setup code. This may get refactored/changed...
909 struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
914 if (lp->setup->dirty) {
918 assert(setup->setup.variant);
923 setup->psize = lp->psize_slot;
928 setup->setup.variant->key.size);
931 &setup->setup.variant->key,
932 setup->setup.variant->key.size) == 0);
935 if (update_scene && setup->state != SETUP_ACTIVE) {
936 if (!set_scene_state( setup, SETUP_ACTIVE, __FUNCTION__ ))
943 if (update_scene && setup->scene) {
944 assert(setup->state == SETUP_ACTIVE);
946 if (try_update_scene_state(setup))
954 if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
957 if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__))
960 if (!setup->scene)
963 return try_update_scene_state(setup);
974 lp_setup_destroy( struct lp_setup_context *setup )
978 lp_setup_reset( setup );
980 util_unreference_framebuffer_state(&setup->fb);
982 for (i = 0; i < Elements(setup->fs.current_tex); i++) {
983 pipe_resource_reference(&setup->fs.current_tex[i], NULL);
986 pipe_resource_reference(&setup->constants.current, NULL);
989 for (i = 0; i < Elements(setup->scenes); i++) {
990 struct lp_scene *scene = setup->scenes[i];
998 lp_fence_reference(&setup->last_fence, NULL);
1000 FREE( setup );
1014 struct lp_setup_context *setup;
1017 setup = CALLOC_STRUCT(lp_setup_context);
1018 if (!setup) {
1022 lp_setup_init_vbuf(setup);
1026 setup->pipe = pipe;
1029 setup->num_threads = screen->num_threads;
1030 setup->vbuf = draw_vbuf_stage(draw, &setup->base);
1031 if (!setup->vbuf) {
1035 draw_set_rasterize_stage(draw, setup->vbuf);
1036 draw_set_render(draw, &setup->base);
1040 setup->scenes[i] = lp_scene_create( pipe );
1041 if (!setup->scenes[i]) {
1046 setup->triangle = first_triangle;
1047 setup->line = first_line;
1048 setup->point = first_point;
1050 setup->dirty = ~0;
1052 return setup;
1056 if (setup->scenes[i]) {
1057 lp_scene_destroy(setup->scenes[i]);
1061 setup->vbuf->destroy(setup->vbuf);
1063 FREE(setup);
1073 lp_setup_begin_query(struct lp_setup_context *setup,
1077 assert(setup->active_query == NULL);
1079 set_scene_state(setup, SETUP_ACTIVE, "begin_query");
1081 setup->active_query = pq;
1083 if (setup->scene) {
1084 if (!lp_scene_bin_everywhere(setup->scene,
1088 if (!lp_setup_flush_and_restart(setup))
1091 if (!lp_scene_bin_everywhere(setup->scene,
1105 lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq)
1109 set_scene_state(setup, SETUP_ACTIVE, "end_query");
1111 assert(setup->active_query == pq);
1112 setup->active_query = NULL;
1119 if (setup->scene) {
1123 lp_fence_reference(&pq->fence, setup->scene->fence);
1125 if (!lp_scene_bin_everywhere(setup->scene,
1128 lp_setup_flush(setup, NULL, __FUNCTION__);
1132 lp_fence_reference(&pq->fence, setup->last_fence);
1138 lp_setup_flush_and_restart(struct lp_setup_context *setup)
1142 assert(setup->state == SETUP_ACTIVE);
1144 if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__))
1147 if (!lp_setup_update_state(setup, TRUE))