Lines Matching full:setup
66 static boolean try_update_scene_state(struct lp_setup_context *setup);
70 lp_setup_wait_empty_scene(struct lp_setup_context *setup) in lp_setup_wait_empty_scene() argument
73 if (setup->scenes[0]->fence) { in lp_setup_wait_empty_scene()
75 __FUNCTION__, setup->scenes[0]->fence->id); in lp_setup_wait_empty_scene()
76 lp_fence_wait(setup->scenes[0]->fence); in lp_setup_wait_empty_scene()
77 lp_scene_end_rasterization(setup->scenes[0]); in lp_setup_wait_empty_scene()
84 lp_setup_get_empty_scene(struct lp_setup_context *setup) in lp_setup_get_empty_scene() argument
86 assert(setup->scene == NULL); in lp_setup_get_empty_scene()
90 for (i = 0; i < setup->num_active_scenes; i++) { in lp_setup_get_empty_scene()
91 if (setup->scenes[i]->fence) { in lp_setup_get_empty_scene()
92 if (lp_fence_signalled(setup->scenes[i]->fence)) { in lp_setup_get_empty_scene()
93 lp_scene_end_rasterization(setup->scenes[i]); in lp_setup_get_empty_scene()
101 if (setup->num_active_scenes + 1 > MAX_SCENES) { in lp_setup_get_empty_scene()
102 i = lp_setup_wait_empty_scene(setup); in lp_setup_get_empty_scene()
103 } else if (i == setup->num_active_scenes) { in lp_setup_get_empty_scene()
105 struct lp_scene *scene = lp_scene_create(setup); in lp_setup_get_empty_scene()
108 i = lp_setup_wait_empty_scene(setup); in lp_setup_get_empty_scene()
110 LP_DBG(DEBUG_SETUP, "allocated scene: %d\n", setup->num_active_scenes); in lp_setup_get_empty_scene()
111 setup->scenes[setup->num_active_scenes] = scene; in lp_setup_get_empty_scene()
112 i = setup->num_active_scenes; in lp_setup_get_empty_scene()
113 setup->num_active_scenes++; in lp_setup_get_empty_scene()
117 setup->scene = setup->scenes[i]; in lp_setup_get_empty_scene()
118 setup->scene->permit_linear_rasterizer = setup->permit_linear_rasterizer; in lp_setup_get_empty_scene()
119 lp_scene_begin_binning(setup->scene, &setup->fb); in lp_setup_get_empty_scene()
124 first_triangle(struct lp_setup_context *setup, in first_triangle() argument
129 assert(setup->state == SETUP_ACTIVE); in first_triangle()
130 lp_setup_choose_triangle(setup); in first_triangle()
131 setup->triangle(setup, v0, v1, v2); in first_triangle()
136 first_rectangle(struct lp_setup_context *setup, in first_rectangle() argument
144 assert(setup->state == SETUP_ACTIVE); in first_rectangle()
145 lp_setup_choose_rect(setup); in first_rectangle()
146 return setup->rect(setup, v0, v1, v2, v3, v4, v5); in first_rectangle()
151 first_line(struct lp_setup_context *setup, in first_line() argument
155 assert(setup->state == SETUP_ACTIVE); in first_line()
156 lp_setup_choose_line(setup); in first_line()
157 setup->line(setup, v0, v1); in first_line()
162 first_point(struct lp_setup_context *setup, in first_point() argument
165 assert(setup->state == SETUP_ACTIVE); in first_point()
166 lp_setup_choose_point(setup); in first_point()
167 setup->point(setup, v0); in first_point()
172 lp_setup_reset(struct lp_setup_context *setup) in lp_setup_reset() argument
177 for (unsigned i = 0; i < ARRAY_SIZE(setup->constants); ++i) { in lp_setup_reset()
178 setup->constants[i].stored_size = 0; in lp_setup_reset()
179 setup->constants[i].stored_data = NULL; in lp_setup_reset()
182 setup->fs.stored = NULL; in lp_setup_reset()
183 setup->dirty = ~0; in lp_setup_reset()
186 setup->scene = NULL; in lp_setup_reset()
190 memset(&setup->clear, 0, sizeof(setup->clear)); in lp_setup_reset()
195 setup->line = first_line; in lp_setup_reset()
196 setup->point = first_point; in lp_setup_reset()
197 setup->triangle = first_triangle; in lp_setup_reset()
198 setup->rect = first_rectangle; in lp_setup_reset()
204 lp_setup_rasterize_scene(struct lp_setup_context *setup) in lp_setup_rasterize_scene() argument
206 struct lp_scene *scene = setup->scene; in lp_setup_rasterize_scene()
209 scene->num_active_queries = setup->active_binned_queries; in lp_setup_rasterize_scene()
210 memcpy(scene->active_queries, setup->active_queries, in lp_setup_rasterize_scene()
219 lp_setup_reset(setup); in lp_setup_rasterize_scene()
226 begin_binning(struct lp_setup_context *setup) in begin_binning() argument
228 struct lp_scene *scene = setup->scene; in begin_binning()
235 scene->fence = lp_fence_create(MAX2(1, setup->num_threads)); in begin_binning()
239 if (!try_update_scene_state(setup)) { in begin_binning()
244 if (setup->fb.zsbuf && in begin_binning()
245 ((setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) && in begin_binning()
246 util_format_is_depth_and_stencil(setup->fb.zsbuf->format)) { in begin_binning()
251 setup->clear.flags >> 2, in begin_binning()
254 if (setup->clear.flags & PIPE_CLEAR_COLOR) { in begin_binning()
255 for (unsigned cbuf = 0; cbuf < setup->fb.nr_cbufs; cbuf++) { in begin_binning()
257 if (setup->clear.flags & (1 << (2 + cbuf))) { in begin_binning()
268 cc_scene->color_val = setup->clear.color_val[cbuf]; in begin_binning()
280 if (setup->fb.zsbuf) { in begin_binning()
281 if (setup->clear.flags & PIPE_CLEAR_DEPTHSTENCIL) { in begin_binning()
285 setup->clear.zsvalue, in begin_binning()
286 setup->clear.zsmask))) { in begin_binning()
292 setup->clear.flags = 0; in begin_binning()
293 setup->clear.zsmask = 0; in begin_binning()
294 setup->clear.zsvalue = 0; in begin_binning()
296 scene->had_queries = !!setup->active_binned_queries; in begin_binning()
309 execute_clears(struct lp_setup_context *setup) in execute_clears() argument
313 return begin_binning(setup); in execute_clears()
325 set_scene_state(struct lp_setup_context *setup, in set_scene_state() argument
329 const unsigned old_state = setup->state; in set_scene_state()
342 if (new_state == SETUP_FLUSHED && setup->scene) in set_scene_state()
343 lp_debug_draw_bins_by_cmd_length(setup->scene); in set_scene_state()
349 lp_setup_get_empty_scene(setup); in set_scene_state()
356 if (!begin_binning(setup)) in set_scene_state()
362 if (!execute_clears(setup)) in set_scene_state()
365 lp_setup_rasterize_scene(setup); in set_scene_state()
366 assert(setup->scene == NULL); in set_scene_state()
370 assert(0 && "invalid setup state mode"); in set_scene_state()
374 setup->state = new_state; in set_scene_state()
378 if (setup->scene) { in set_scene_state()
379 lp_scene_end_rasterization(setup->scene); in set_scene_state()
380 setup->scene = NULL; in set_scene_state()
383 setup->state = SETUP_FLUSHED; in set_scene_state()
384 lp_setup_reset(setup); in set_scene_state()
390 lp_setup_flush(struct lp_setup_context *setup, in lp_setup_flush() argument
393 set_scene_state(setup, SETUP_FLUSHED, reason); in lp_setup_flush()
398 lp_setup_bind_framebuffer(struct lp_setup_context *setup, in lp_setup_bind_framebuffer() argument
405 set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__); in lp_setup_bind_framebuffer()
410 assert(!setup->scene); in lp_setup_bind_framebuffer()
415 util_copy_framebuffer_state(&setup->fb, fb); in lp_setup_bind_framebuffer()
416 setup->framebuffer.x0 = 0; in lp_setup_bind_framebuffer()
417 setup->framebuffer.y0 = 0; in lp_setup_bind_framebuffer()
418 setup->framebuffer.x1 = fb->width-1; in lp_setup_bind_framebuffer()
419 setup->framebuffer.y1 = fb->height-1; in lp_setup_bind_framebuffer()
420 setup->dirty |= LP_SETUP_NEW_SCISSOR; in lp_setup_bind_framebuffer()
429 lp_setup_try_clear_color_buffer(struct lp_setup_context *setup, in lp_setup_try_clear_color_buffer() argument
435 const enum pipe_format format = setup->fb.cbufs[cbuf]->format; in lp_setup_try_clear_color_buffer()
437 LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); in lp_setup_try_clear_color_buffer()
441 if (setup->state == SETUP_ACTIVE) { in lp_setup_try_clear_color_buffer()
442 struct lp_scene *scene = setup->scene; in lp_setup_try_clear_color_buffer()
474 set_scene_state(setup, SETUP_CLEARED, __FUNCTION__); in lp_setup_try_clear_color_buffer()
477 setup->clear.flags |= 1 << (cbuf + 2); in lp_setup_try_clear_color_buffer()
478 setup->clear.color_val[cbuf] = uc; in lp_setup_try_clear_color_buffer()
486 lp_setup_try_clear_zs(struct lp_setup_context *setup, in lp_setup_try_clear_zs() argument
491 LP_DBG(DEBUG_SETUP, "%s state %d\n", __FUNCTION__, setup->state); in lp_setup_try_clear_zs()
493 enum pipe_format format = setup->fb.zsbuf->format; in lp_setup_try_clear_zs()
513 if (setup->state == SETUP_ACTIVE) { in lp_setup_try_clear_zs()
514 struct lp_scene *scene = setup->scene; in lp_setup_try_clear_zs()
533 set_scene_state(setup, SETUP_CLEARED, __FUNCTION__); in lp_setup_try_clear_zs()
535 setup->clear.flags |= flags; in lp_setup_try_clear_zs()
537 setup->clear.zsmask |= zsmask; in lp_setup_try_clear_zs()
538 setup->clear.zsvalue = in lp_setup_try_clear_zs()
539 (setup->clear.zsvalue & ~zsmask) | (zsvalue & zsmask); in lp_setup_try_clear_zs()
547 lp_setup_clear(struct lp_setup_context *setup, in lp_setup_clear() argument
561 if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) { in lp_setup_clear()
562 set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ ); in lp_setup_clear()
564 if (!lp_setup_try_clear_zs(setup, depth, stencil, flagszs)) in lp_setup_clear()
571 for (unsigned i = 0; i < setup->fb.nr_cbufs; i++) { in lp_setup_clear()
572 if ((flags & (1 << (2 + i))) && setup->fb.cbufs[i]) { in lp_setup_clear()
573 if (!lp_setup_try_clear_color_buffer(setup, color, i)) { in lp_setup_clear()
574 set_scene_state( setup, SETUP_FLUSHED, __FUNCTION__ ); in lp_setup_clear()
576 if (!lp_setup_try_clear_color_buffer(setup, color, i)) in lp_setup_clear()
586 lp_setup_bind_rasterizer( struct lp_setup_context *setup, in lp_setup_bind_rasterizer() argument
591 setup->ccw_is_frontface = rast->front_ccw; in lp_setup_bind_rasterizer()
592 setup->cullmode = rast->cull_face; in lp_setup_bind_rasterizer()
593 setup->triangle = first_triangle; in lp_setup_bind_rasterizer()
594 setup->rect = first_rectangle; in lp_setup_bind_rasterizer()
595 setup->multisample = rast->multisample; in lp_setup_bind_rasterizer()
596 setup->pixel_offset = rast->half_pixel_center ? 0.5f : 0.0f; in lp_setup_bind_rasterizer()
597 setup->bottom_edge_rule = rast->bottom_edge_rule; in lp_setup_bind_rasterizer()
599 if (setup->scissor_test != rast->scissor) { in lp_setup_bind_rasterizer()
600 setup->dirty |= LP_SETUP_NEW_SCISSOR; in lp_setup_bind_rasterizer()
601 setup->scissor_test = rast->scissor; in lp_setup_bind_rasterizer()
604 setup->flatshade_first = rast->flatshade_first; in lp_setup_bind_rasterizer()
605 setup->line_width = rast->line_width; in lp_setup_bind_rasterizer()
606 setup->rectangular_lines = rast->line_rectangular; in lp_setup_bind_rasterizer()
608 setup->point_size = rast->point_size; in lp_setup_bind_rasterizer()
609 setup->sprite_coord_enable = rast->sprite_coord_enable; in lp_setup_bind_rasterizer()
610 setup->sprite_coord_origin = rast->sprite_coord_mode; in lp_setup_bind_rasterizer()
611 setup->point_tri_clip = rast->point_size_per_vertex; in lp_setup_bind_rasterizer()
612 setup->point_size_per_vertex = rast->point_size_per_vertex; in lp_setup_bind_rasterizer()
613 setup->legacy_points = !rast->point_quad_rasterization && !setup->multisample; in lp_setup_bind_rasterizer()
618 lp_setup_set_setup_variant(struct lp_setup_context *setup, in lp_setup_set_setup_variant() argument
623 setup->setup.variant = variant; in lp_setup_set_setup_variant()
628 lp_setup_set_fs_variant(struct lp_setup_context *setup, in lp_setup_set_fs_variant() argument
633 setup->fs.current.variant = variant; in lp_setup_set_fs_variant()
634 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_fs_variant()
639 lp_setup_set_fs_constants(struct lp_setup_context *setup, in lp_setup_set_fs_constants() argument
645 assert(num <= ARRAY_SIZE(setup->constants)); in lp_setup_set_fs_constants()
649 util_copy_constant_buffer(&setup->constants[i].current, in lp_setup_set_fs_constants()
652 for (; i < ARRAY_SIZE(setup->constants); i++) { in lp_setup_set_fs_constants()
653 util_copy_constant_buffer(&setup->constants[i].current, NULL, false); in lp_setup_set_fs_constants()
655 setup->dirty |= LP_SETUP_NEW_CONSTANTS; in lp_setup_set_fs_constants()
660 lp_setup_set_fs_ssbos(struct lp_setup_context *setup, in lp_setup_set_fs_ssbos() argument
667 assert(num <= ARRAY_SIZE(setup->ssbos)); in lp_setup_set_fs_ssbos()
671 util_copy_shader_buffer(&setup->ssbos[i].current, &buffers[i]); in lp_setup_set_fs_ssbos()
673 for (; i < ARRAY_SIZE(setup->ssbos); i++) { in lp_setup_set_fs_ssbos()
674 util_copy_shader_buffer(&setup->ssbos[i].current, NULL); in lp_setup_set_fs_ssbos()
676 setup->ssbo_write_mask = ssbo_write_mask; in lp_setup_set_fs_ssbos()
677 setup->dirty |= LP_SETUP_NEW_SSBOS; in lp_setup_set_fs_ssbos()
682 lp_setup_set_fs_images(struct lp_setup_context *setup, in lp_setup_set_fs_images() argument
690 assert(num <= ARRAY_SIZE(setup->images)); in lp_setup_set_fs_images()
694 util_copy_image_view(&setup->images[i].current, &images[i]); in lp_setup_set_fs_images()
698 struct lp_jit_image *jit_image = &setup->fs.current.jit_context.images[i]; in lp_setup_set_fs_images()
704 /* regular texture - setup array of mipmap level offsets */ in lp_setup_set_fs_images()
754 for (; i < ARRAY_SIZE(setup->images); i++) { in lp_setup_set_fs_images()
755 util_copy_image_view(&setup->images[i].current, NULL); in lp_setup_set_fs_images()
757 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_fs_images()
762 lp_setup_set_alpha_ref_value(struct lp_setup_context *setup, in lp_setup_set_alpha_ref_value() argument
767 if (setup->fs.current.jit_context.alpha_ref_value != alpha_ref_value) { in lp_setup_set_alpha_ref_value()
768 setup->fs.current.jit_context.alpha_ref_value = alpha_ref_value; in lp_setup_set_alpha_ref_value()
769 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_alpha_ref_value()
775 lp_setup_set_stencil_ref_values(struct lp_setup_context *setup, in lp_setup_set_stencil_ref_values() argument
780 if (setup->fs.current.jit_context.stencil_ref_front != refs[0] || in lp_setup_set_stencil_ref_values()
781 setup->fs.current.jit_context.stencil_ref_back != refs[1]) { in lp_setup_set_stencil_ref_values()
782 setup->fs.current.jit_context.stencil_ref_front = refs[0]; in lp_setup_set_stencil_ref_values()
783 setup->fs.current.jit_context.stencil_ref_back = refs[1]; in lp_setup_set_stencil_ref_values()
784 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_stencil_ref_values()
790 lp_setup_set_blend_color(struct lp_setup_context *setup, in lp_setup_set_blend_color() argument
797 if (memcmp(&setup->blend_color.current, in lp_setup_set_blend_color()
799 memcpy(&setup->blend_color.current, blend_color, sizeof *blend_color); in lp_setup_set_blend_color()
800 setup->dirty |= LP_SETUP_NEW_BLEND_COLOR; in lp_setup_set_blend_color()
806 lp_setup_set_scissors(struct lp_setup_context *setup, in lp_setup_set_scissors() argument
814 setup->scissors[i].x0 = scissors[i].minx; in lp_setup_set_scissors()
815 setup->scissors[i].x1 = scissors[i].maxx-1; in lp_setup_set_scissors()
816 setup->scissors[i].y0 = scissors[i].miny; in lp_setup_set_scissors()
817 setup->scissors[i].y1 = scissors[i].maxy-1; in lp_setup_set_scissors()
819 setup->dirty |= LP_SETUP_NEW_SCISSOR; in lp_setup_set_scissors()
824 lp_setup_set_sample_mask(struct lp_setup_context *setup, in lp_setup_set_sample_mask() argument
827 if (setup->fs.current.jit_context.sample_mask != sample_mask) { in lp_setup_set_sample_mask()
828 setup->fs.current.jit_context.sample_mask = sample_mask; in lp_setup_set_sample_mask()
829 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_sample_mask()
835 lp_setup_set_rasterizer_discard(struct lp_setup_context *setup, in lp_setup_set_rasterizer_discard() argument
838 if (setup->rasterizer_discard != rasterizer_discard) { in lp_setup_set_rasterizer_discard()
839 setup->rasterizer_discard = rasterizer_discard; in lp_setup_set_rasterizer_discard()
840 setup->line = first_line; in lp_setup_set_rasterizer_discard()
841 setup->point = first_point; in lp_setup_set_rasterizer_discard()
842 setup->triangle = first_triangle; in lp_setup_set_rasterizer_discard()
843 setup->rect = first_rectangle; in lp_setup_set_rasterizer_discard()
849 lp_setup_set_vertex_info(struct lp_setup_context *setup, in lp_setup_set_vertex_info() argument
854 setup->vertex_info = vertex_info; in lp_setup_set_vertex_info()
859 lp_setup_set_linear_mode(struct lp_setup_context *setup, in lp_setup_set_linear_mode() argument
868 setup->permit_linear_rasterizer = (mode && in lp_setup_set_linear_mode()
871 setup->permit_linear_rasterizer = FALSE; in lp_setup_set_linear_mode()
880 lp_setup_set_viewports(struct lp_setup_context *setup, in lp_setup_set_viewports() argument
884 struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); in lp_setup_set_viewports()
906 setup->vpwh.x0 = (int)(x0 + 0.499f); in lp_setup_set_viewports()
907 setup->vpwh.x1 = (int)(viewports[0].scale[0] * 2.0f + x0 - 0.501f); in lp_setup_set_viewports()
908 setup->vpwh.y0 = (int)(y0 + 0.499f); in lp_setup_set_viewports()
909 setup->vpwh.y1 = (int)(half_height * 2.0f + y0 - 0.501f); in lp_setup_set_viewports()
910 setup->dirty |= LP_SETUP_NEW_SCISSOR; in lp_setup_set_viewports()
920 if (setup->viewports[i].min_depth != min_depth || in lp_setup_set_viewports()
921 setup->viewports[i].max_depth != max_depth) { in lp_setup_set_viewports()
922 setup->viewports[i].min_depth = min_depth; in lp_setup_set_viewports()
923 setup->viewports[i].max_depth = max_depth; in lp_setup_set_viewports()
924 setup->dirty |= LP_SETUP_NEW_VIEWPORTS; in lp_setup_set_viewports()
934 lp_setup_set_fragment_sampler_views(struct lp_setup_context *setup, in lp_setup_set_fragment_sampler_views() argument
942 const unsigned max_tex_num = MAX2(num, setup->fs.current_tex_num); in lp_setup_set_fragment_sampler_views()
950 if (setup->fs.current_tex[i]) in lp_setup_set_fragment_sampler_views()
951 llvmpipe_resource_unmap(setup->fs.current_tex[i], 0, 0); in lp_setup_set_fragment_sampler_views()
957 jit_tex = &setup->fs.current.jit_context.textures[i]; in lp_setup_set_fragment_sampler_views()
962 pipe_resource_reference(&setup->fs.current_tex[i], res); in lp_setup_set_fragment_sampler_views()
965 /* regular texture - setup array of mipmap level offsets */ in lp_setup_set_fragment_sampler_views()
1076 pipe_resource_reference(&setup->fs.current_tex[i], NULL); in lp_setup_set_fragment_sampler_views()
1079 setup->fs.current_tex_num = num; in lp_setup_set_fragment_sampler_views()
1081 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_fragment_sampler_views()
1089 lp_setup_set_fragment_sampler_state(struct lp_setup_context *setup, in lp_setup_set_fragment_sampler_state() argument
1102 jit_sam = &setup->fs.current.jit_context.samplers[i]; in lp_setup_set_fragment_sampler_state()
1112 setup->dirty |= LP_SETUP_NEW_FS; in lp_setup_set_fragment_sampler_state()
1122 lp_setup_is_resource_referenced(const struct lp_setup_context *setup, in lp_setup_is_resource_referenced() argument
1126 for (unsigned i = 0; i < setup->fb.nr_cbufs; i++) { in lp_setup_is_resource_referenced()
1127 if (setup->fb.cbufs[i] && setup->fb.cbufs[i]->texture == texture) in lp_setup_is_resource_referenced()
1130 if (setup->fb.zsbuf && setup->fb.zsbuf->texture == texture) { in lp_setup_is_resource_referenced()
1135 for (unsigned i = 0; i < setup->num_active_scenes; i++) { in lp_setup_is_resource_referenced()
1136 struct lp_scene *scene = setup->scenes[i]; in lp_setup_is_resource_referenced()
1169 try_update_scene_state(struct lp_setup_context *setup) in try_update_scene_state() argument
1172 boolean new_scene = (setup->fs.stored == NULL); in try_update_scene_state()
1173 struct lp_scene *scene = setup->scene; in try_update_scene_state()
1177 if (setup->dirty & LP_SETUP_NEW_VIEWPORTS) { in try_update_scene_state()
1187 lp_scene_alloc(scene, sizeof setup->viewports); in try_update_scene_state()
1194 memcpy(stored, setup->viewports, sizeof setup->viewports); in try_update_scene_state()
1196 setup->fs.current.jit_context.viewports = stored; in try_update_scene_state()
1197 setup->dirty |= LP_SETUP_NEW_FS; in try_update_scene_state()
1200 if (setup->dirty & LP_SETUP_NEW_BLEND_COLOR) { in try_update_scene_state()
1216 fstored[i] = setup->blend_color.current.color[i % 4]; in try_update_scene_state()
1221 uint8_t c = float_to_ubyte(setup->blend_color.current.color[i]); in try_update_scene_state()
1227 setup->blend_color.stored = stored; in try_update_scene_state()
1228 setup->fs.current.jit_context.u8_blend_color = stored; in try_update_scene_state()
1229 setup->fs.current.jit_context.f_blend_color = fstored; in try_update_scene_state()
1230 setup->dirty |= LP_SETUP_NEW_FS; in try_update_scene_state()
1233 struct llvmpipe_context *llvmpipe = llvmpipe_context(setup->pipe); in try_update_scene_state()
1235 lp_setup_set_fs_constants(llvmpipe->setup, in try_update_scene_state()
1239 if (setup->dirty & LP_SETUP_NEW_CONSTANTS) { in try_update_scene_state()
1240 for (unsigned i = 0; i < ARRAY_SIZE(setup->constants); ++i) { in try_update_scene_state()
1241 struct pipe_resource *buffer = setup->constants[i].current.buffer; in try_update_scene_state()
1242 const unsigned current_size = MIN2(setup->constants[i].current.buffer_size, in try_update_scene_state()
1252 else if (setup->constants[i].current.user_buffer) { in try_update_scene_state()
1254 current_data = (ubyte *) setup->constants[i].current.user_buffer; in try_update_scene_state()
1258 current_data += setup->constants[i].current.buffer_offset; in try_update_scene_state()
1262 if (setup->constants[i].stored_size != current_size || in try_update_scene_state()
1263 !setup->constants[i].stored_data || in try_update_scene_state()
1264 memcmp(setup->constants[i].stored_data, in try_update_scene_state()
1277 setup->constants[i].stored_size = current_size; in try_update_scene_state()
1278 setup->constants[i].stored_data = stored; in try_update_scene_state()
1280 setup->fs.current.jit_context.constants[i] = in try_update_scene_state()
1281 setup->constants[i].stored_data; in try_update_scene_state()
1284 setup->constants[i].stored_size = 0; in try_update_scene_state()
1285 setup->constants[i].stored_data = NULL; in try_update_scene_state()
1286 setup->fs.current.jit_context.constants[i] = fake_const_buf; in try_update_scene_state()
1290 DIV_ROUND_UP(setup->constants[i].stored_size, in try_update_scene_state()
1292 setup->fs.current.jit_context.num_constants[i] = num_constants; in try_update_scene_state()
1293 setup->dirty |= LP_SETUP_NEW_FS; in try_update_scene_state()
1297 if (setup->dirty & LP_SETUP_NEW_SSBOS) { in try_update_scene_state()
1298 for (unsigned i = 0; i < ARRAY_SIZE(setup->ssbos); ++i) { in try_update_scene_state()
1299 struct pipe_resource *buffer = setup->ssbos[i].current.buffer; in try_update_scene_state()
1307 current_data += setup->ssbos[i].current.buffer_offset; in try_update_scene_state()
1309 setup->fs.current.jit_context.ssbos[i] = in try_update_scene_state()
1311 setup->fs.current.jit_context.num_ssbos[i] = in try_update_scene_state()
1312 setup->ssbos[i].current.buffer_size; in try_update_scene_state()
1314 setup->fs.current.jit_context.ssbos[i] = NULL; in try_update_scene_state()
1315 setup->fs.current.jit_context.num_ssbos[i] = 0; in try_update_scene_state()
1317 setup->dirty |= LP_SETUP_NEW_FS; in try_update_scene_state()
1321 if (setup->dirty & LP_SETUP_NEW_FS) { in try_update_scene_state()
1322 if (!setup->fs.stored || in try_update_scene_state()
1323 memcmp(setup->fs.stored, in try_update_scene_state()
1324 &setup->fs.current, in try_update_scene_state()
1325 sizeof setup->fs.current) != 0) { in try_update_scene_state()
1328 * and append it to the bin's setup data buffer. in try_update_scene_state()
1338 &setup->fs.current.jit_context, in try_update_scene_state()
1339 sizeof setup->fs.current.jit_context); in try_update_scene_state()
1343 stored->variant = setup->fs.current.variant; in try_update_scene_state()
1346 setup->fs.current.variant)) { in try_update_scene_state()
1350 setup->fs.stored = stored; in try_update_scene_state()
1355 for (unsigned i = 0; i < ARRAY_SIZE(setup->fs.current_tex); i++) { in try_update_scene_state()
1356 if (setup->fs.current_tex[i]) { in try_update_scene_state()
1358 setup->fs.current_tex[i], in try_update_scene_state()
1366 for (unsigned i = 0; i < ARRAY_SIZE(setup->ssbos); i++) { in try_update_scene_state()
1367 if (setup->ssbos[i].current.buffer) { in try_update_scene_state()
1369 setup->ssbos[i].current.buffer, in try_update_scene_state()
1370 new_scene, setup->ssbo_write_mask & (1 << i))) { in try_update_scene_state()
1377 for (unsigned i = 0; i < ARRAY_SIZE(setup->images); i++) { in try_update_scene_state()
1378 if (setup->images[i].current.resource) { in try_update_scene_state()
1380 setup->images[i].current.resource, in try_update_scene_state()
1382 … setup->images[i].current.shader_access & PIPE_IMAGE_ACCESS_WRITE)) { in try_update_scene_state()
1391 if (setup->dirty & LP_SETUP_NEW_SCISSOR) { in try_update_scene_state()
1393 setup->draw_regions[i] = setup->framebuffer; in try_update_scene_state()
1394 if (setup->scissor_test) { in try_update_scene_state()
1395 u_rect_possible_intersection(&setup->scissors[i], in try_update_scene_state()
1396 &setup->draw_regions[i]); in try_update_scene_state()
1399 if (setup->permit_linear_rasterizer) { in try_update_scene_state()
1402 !!memcmp(&setup->vpwh, &setup->framebuffer, in try_update_scene_state()
1403 sizeof(setup->framebuffer)); in try_update_scene_state()
1405 assert(setup->viewport_index_slot < 0); in try_update_scene_state()
1407 u_rect_possible_intersection(&setup->vpwh, in try_update_scene_state()
1408 &setup->draw_regions[0]); in try_update_scene_state()
1411 else if (setup->point_tri_clip) { in try_update_scene_state()
1424 !!memcmp(&setup->vpwh, &setup->framebuffer, in try_update_scene_state()
1425 sizeof(setup->framebuffer)); in try_update_scene_state()
1427 u_rect_possible_intersection(&setup->vpwh, in try_update_scene_state()
1428 &setup->draw_regions[0]); in try_update_scene_state()
1433 setup->dirty = 0; in try_update_scene_state()
1435 assert(setup->fs.stored); in try_update_scene_state()
1441 lp_setup_update_state(struct lp_setup_context *setup, in lp_setup_update_state() argument
1448 * setup code. This may get refactored/changed... in lp_setup_update_state()
1451 struct llvmpipe_context *lp = llvmpipe_context(setup->pipe); in lp_setup_update_state()
1456 if (lp->setup->dirty) { in lp_setup_update_state()
1460 assert(setup->setup.variant); in lp_setup_update_state()
1465 setup->psize_slot = lp->psize_slot; in lp_setup_update_state()
1466 setup->viewport_index_slot = lp->viewport_index_slot; in lp_setup_update_state()
1467 setup->layer_slot = lp->layer_slot; in lp_setup_update_state()
1468 setup->face_slot = lp->face_slot; in lp_setup_update_state()
1473 setup->setup.variant->key.size); in lp_setup_update_state()
1476 &setup->setup.variant->key, in lp_setup_update_state()
1477 setup->setup.variant->key.size) == 0); in lp_setup_update_state()
1480 if (update_scene && setup->state != SETUP_ACTIVE) { in lp_setup_update_state()
1481 if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__)) in lp_setup_update_state()
1488 if (update_scene && setup->scene) { in lp_setup_update_state()
1489 assert(setup->state == SETUP_ACTIVE); in lp_setup_update_state()
1491 if (try_update_scene_state(setup)) in lp_setup_update_state()
1499 if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__)) in lp_setup_update_state()
1502 if (!set_scene_state(setup, SETUP_ACTIVE, __FUNCTION__)) in lp_setup_update_state()
1505 if (!setup->scene) in lp_setup_update_state()
1508 return try_update_scene_state(setup); in lp_setup_update_state()
1519 lp_setup_destroy(struct lp_setup_context *setup) in lp_setup_destroy() argument
1521 lp_setup_reset(setup); in lp_setup_destroy()
1523 util_unreference_framebuffer_state(&setup->fb); in lp_setup_destroy()
1525 for (unsigned i = 0; i < ARRAY_SIZE(setup->fs.current_tex); i++) { in lp_setup_destroy()
1526 struct pipe_resource **res_ptr = &setup->fs.current_tex[i]; in lp_setup_destroy()
1532 for (unsigned i = 0; i < ARRAY_SIZE(setup->constants); i++) { in lp_setup_destroy()
1533 pipe_resource_reference(&setup->constants[i].current.buffer, NULL); in lp_setup_destroy()
1536 for (unsigned i = 0; i < ARRAY_SIZE(setup->ssbos); i++) { in lp_setup_destroy()
1537 pipe_resource_reference(&setup->ssbos[i].current.buffer, NULL); in lp_setup_destroy()
1541 for (unsigned i = 0; i < setup->num_active_scenes; i++) { in lp_setup_destroy()
1542 struct lp_scene *scene = setup->scenes[i]; in lp_setup_destroy()
1550 LP_DBG(DEBUG_SETUP, "number of scenes used: %d\n", setup->num_active_scenes); in lp_setup_destroy()
1551 slab_destroy(&setup->scene_slab); in lp_setup_destroy()
1553 FREE(setup); in lp_setup_destroy()
1567 struct lp_setup_context *setup = CALLOC_STRUCT(lp_setup_context); in lp_setup_create() local
1568 if (!setup) { in lp_setup_create()
1572 lp_setup_init_vbuf(setup); in lp_setup_create()
1576 setup->pipe = pipe; in lp_setup_create()
1578 setup->num_threads = screen->num_threads; in lp_setup_create()
1579 setup->vbuf = draw_vbuf_stage(draw, &setup->base); in lp_setup_create()
1580 if (!setup->vbuf) { in lp_setup_create()
1584 draw_set_rasterize_stage(draw, setup->vbuf); in lp_setup_create()
1585 draw_set_render(draw, &setup->base); in lp_setup_create()
1587 slab_create(&setup->scene_slab, in lp_setup_create()
1591 setup->scenes[0] = lp_scene_create(setup); in lp_setup_create()
1592 if (!setup->scenes[0]) { in lp_setup_create()
1595 setup->num_active_scenes++; in lp_setup_create()
1597 setup->triangle = first_triangle; in lp_setup_create()
1598 setup->line = first_line; in lp_setup_create()
1599 setup->point = first_point; in lp_setup_create()
1601 setup->dirty = ~0; in lp_setup_create()
1604 setup->framebuffer.x1 = -1; in lp_setup_create()
1605 setup->framebuffer.y1 = -1; in lp_setup_create()
1607 return setup; in lp_setup_create()
1611 if (setup->scenes[i]) { in lp_setup_create()
1612 lp_scene_destroy(setup->scenes[i]); in lp_setup_create()
1616 setup->vbuf->destroy(setup->vbuf); in lp_setup_create()
1618 FREE(setup); in lp_setup_create()
1628 lp_setup_begin_query(struct lp_setup_context *setup, in lp_setup_begin_query() argument
1631 set_scene_state(setup, SETUP_ACTIVE, "begin_query"); in lp_setup_begin_query()
1641 assert(setup->active_binned_queries < LP_MAX_ACTIVE_BINNED_QUERIES); in lp_setup_begin_query()
1643 if (setup->active_binned_queries >= LP_MAX_ACTIVE_BINNED_QUERIES) { in lp_setup_begin_query()
1646 assert(setup->active_queries[setup->active_binned_queries] == NULL); in lp_setup_begin_query()
1647 setup->active_queries[setup->active_binned_queries] = pq; in lp_setup_begin_query()
1648 setup->active_binned_queries++; in lp_setup_begin_query()
1650 assert(setup->scene); in lp_setup_begin_query()
1651 if (setup->scene) { in lp_setup_begin_query()
1652 if (!lp_scene_bin_everywhere(setup->scene, in lp_setup_begin_query()
1656 if (!lp_setup_flush_and_restart(setup)) in lp_setup_begin_query()
1659 if (!lp_scene_bin_everywhere(setup->scene, in lp_setup_begin_query()
1665 setup->scene->had_queries |= TRUE; in lp_setup_begin_query()
1674 lp_setup_end_query(struct lp_setup_context *setup, struct llvmpipe_query *pq) in lp_setup_end_query() argument
1676 set_scene_state(setup, SETUP_ACTIVE, "end_query"); in lp_setup_end_query()
1678 assert(setup->scene); in lp_setup_end_query()
1679 if (setup->scene) { in lp_setup_end_query()
1683 lp_fence_reference(&pq->fence, setup->scene->fence); in lp_setup_end_query()
1692 !(setup->scene->tiles_x | setup->scene->tiles_y)) { in lp_setup_end_query()
1700 if (!lp_scene_bin_everywhere(setup->scene, in lp_setup_end_query()
1703 if (!lp_setup_flush_and_restart(setup)) in lp_setup_end_query()
1706 if (!lp_scene_bin_everywhere(setup->scene, in lp_setup_end_query()
1712 setup->scene->had_queries |= TRUE; in lp_setup_end_query()
1716 struct llvmpipe_screen *screen = llvmpipe_screen(setup->pipe->screen); in lp_setup_end_query()
1734 for (i = 0; i < setup->active_binned_queries; i++) { in lp_setup_end_query()
1735 if (setup->active_queries[i] == pq) in lp_setup_end_query()
1738 assert(i < setup->active_binned_queries); in lp_setup_end_query()
1739 if (i == setup->active_binned_queries) in lp_setup_end_query()
1741 setup->active_binned_queries--; in lp_setup_end_query()
1742 setup->active_queries[i] = setup->active_queries[setup->active_binned_queries]; in lp_setup_end_query()
1743 setup->active_queries[setup->active_binned_queries] = NULL; in lp_setup_end_query()
1749 lp_setup_flush_and_restart(struct lp_setup_context *setup) in lp_setup_flush_and_restart() argument
1753 assert(setup->state == SETUP_ACTIVE); in lp_setup_flush_and_restart()
1755 if (!set_scene_state(setup, SETUP_FLUSHED, __FUNCTION__)) in lp_setup_flush_and_restart()
1758 if (!lp_setup_update_state(setup, TRUE)) in lp_setup_flush_and_restart()