| 485 | } |
| 486 | |
| 487 | void wf::render_pass_t::add_texture(const wf::texture_t& texture, const wf::render_target_t& adjusted_target, |
| 488 | const wlr_fbox& geometry, const wf::region_t& damage, float alpha) |
| 489 | { |
| 490 | if (wlr_renderer_is_gles2(this->get_wlr_renderer())) |
| 491 | { |
| 492 | // This is a hack to make sure that plugins can do whatever they want and we render on the correct |
| 493 | // target. For example, managing auxilliary textures can mess up with the state of the pipeline on |
| 494 | // GLES but not on Vulkan, so to make it easier to write plugins, we just bind the render target again |
| 495 | // here to ensure that the state is correct. |
| 496 | wf::gles::bind_render_buffer(adjusted_target); |
| 497 | } |
| 498 | |
| 499 | wf::region_t fb_damage = adjusted_target.framebuffer_region_from_geometry_region(damage); |
| 500 | |
| 501 | wlr_render_texture_options opts{}; |
| 502 | opts.texture = texture.texture; |
| 503 | opts.alpha = α |
| 504 | opts.blend_mode = WLR_RENDER_BLEND_MODE_PREMULTIPLIED; |
| 505 | |
| 506 | // use GL_NEAREST for integer scale. |
| 507 | // GL_NEAREST makes scaled text blocky instead of blurry, which looks better |
| 508 | // but only for integer scale. |
| 509 | const auto preferred_filter = ((adjusted_target.scale - floor(adjusted_target.scale)) < 0.001) ? |
| 510 | WLR_SCALE_FILTER_NEAREST : WLR_SCALE_FILTER_BILINEAR; |
| 511 | opts.filter_mode = texture.filter_mode.value_or(preferred_filter); |
| 512 | opts.transform = wlr_output_transform_compose(wlr_output_transform_invert(texture.transform), |
| 513 | adjusted_target.wl_transform); |
| 514 | opts.clip = fb_damage.to_pixman(); |
| 515 | opts.src_box = texture.source_box.value_or(wlr_fbox{0, 0, 0, 0}); |
| 516 | opts.dst_box = fbox_to_geometry(adjusted_target.framebuffer_box_from_geometry_box(geometry)); |
| 517 | wlr_render_pass_add_texture(get_wlr_pass(), &opts); |
| 518 | } |
| 519 | |
| 520 | void wf::render_pass_t::add_rect(const wf::color_t& color, const wf::render_target_t& adjusted_target, |
| 521 | const wlr_fbox& geometry, const wf::region_t& damage) |
no test coverage detected