GskRenderer *renderer;
GdkVulkanContext *vulkan;
- double scale;
graphene_rect_t viewport;
cairo_region_t *clip;
const graphene_rect_t *rect,
const cairo_region_t *clip)
{
- GdkSurface *surface = gsk_renderer_get_surface (self->renderer);
-
self->target = g_object_ref (target);
+ self->viewport = *rect;
- if (rect)
- {
- self->viewport = *rect;
- self->scale = 1.0;
- }
- else
- {
- self->scale = gdk_surface_get_scale (surface);
- self->viewport = GRAPHENE_RECT_INIT (0, 0,
- (int) ceil (gdk_surface_get_width (surface) * self->scale),
- (int) ceil (gdk_surface_get_height (surface) * self->scale));
- }
if (clip)
{
self->clip = cairo_region_reference ((cairo_region_t *) clip);
gpointer download_data)
{
GskVulkanRenderPass *render_pass;
- graphene_vec2_t scale;
cairo_rectangle_int_t extents;
- graphene_vec2_init (&scale, self->scale, self->scale);
cairo_region_get_extents (self->clip, &extents);
gsk_vulkan_render_pass_begin_op (self,
g_object_ref (self->target),
&extents,
- &self->viewport.size,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
-
render_pass = gsk_vulkan_render_pass_new ();
gsk_vulkan_render_pass_add (render_pass,
self,
- &scale,
- &self->viewport,
+ gsk_vulkan_image_get_width (self->target),
+ gsk_vulkan_image_get_height (self->target),
&extents,
- node);
+ node,
+ &self->viewport);
gsk_vulkan_render_pass_free (render_pass);
gsk_vulkan_render_pass_end_op (self,
{
GskVulkanRenderer *self = GSK_VULKAN_RENDERER (renderer);
GskVulkanRender *render;
+ GdkSurface *surface;
cairo_region_t *render_region;
#ifdef G_ENABLE_DEBUG
GskProfiler *profiler;
gsk_render_node_get_preferred_depth (root),
region);
render = gsk_vulkan_renderer_get_render (self);
+ surface = gdk_draw_context_get_surface (GDK_DRAW_CONTEXT (self->vulkan));
render_region = get_render_region (self);
draw_index = gdk_vulkan_context_get_draw_index (self->vulkan);
gsk_vulkan_render_render (render,
self->targets[draw_index],
- NULL,
+ &GRAPHENE_RECT_INIT(
+ 0, 0,
+ gdk_surface_get_width (surface),
+ gdk_surface_get_height (surface)
+ ),
render_region,
root,
NULL, NULL);
gsk_vulkan_render_pass_begin_op (render,
g_object_ref (better_image),
&(cairo_rectangle_int_t) { 0, 0, width, height },
- &GRAPHENE_SIZE_INIT(width, height),
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
gsk_vulkan_scissor_op (render, &(cairo_rectangle_int_t) { 0, 0, width, height });
void
gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
GskVulkanRender *render,
- const graphene_vec2_t *scale,
- const graphene_rect_t *viewport,
+ int width,
+ int height,
cairo_rectangle_int_t *clip,
- GskRenderNode *node)
+ GskRenderNode *node,
+ const graphene_rect_t *viewport)
{
GskVulkanParseState state;
- graphene_rect_t scaled_clip;
- float scale_x, scale_y;
- scale_x = 1 / graphene_vec2_get_x (scale);
- scale_y = 1 / graphene_vec2_get_y (scale);
state.scissor = *clip;
- scaled_clip = GRAPHENE_RECT_INIT(clip->x, clip->y, clip->width, clip->height);
- graphene_rect_scale (&scaled_clip, scale_x, scale_y, &scaled_clip);
- gsk_vulkan_clip_init_empty (&state.clip, &scaled_clip);
+ gsk_vulkan_clip_init_empty (&state.clip, &GRAPHENE_RECT_INIT (0, 0, viewport->size.width, viewport->size.height));
state.modelview = NULL;
graphene_matrix_init_ortho (&state.projection,
- 0, viewport->size.width,
- 0, viewport->size.height,
+ 0, width,
+ 0, height,
2 * ORTHO_NEAR_PLANE - ORTHO_FAR_PLANE,
ORTHO_FAR_PLANE);
- graphene_vec2_init_from_vec2 (&state.scale, scale);
- state.offset = GRAPHENE_POINT_INIT (-viewport->origin.x * scale_x,
- -viewport->origin.y * scale_y);
+ graphene_vec2_init (&state.scale, width / viewport->size.width,
+ height / viewport->size.height);
+ state.offset = GRAPHENE_POINT_INIT (-viewport->origin.x,
+ -viewport->origin.y);
gsk_vulkan_render_pass_append_scissor (render, node, &state);
gsk_vulkan_render_pass_append_push_constants (render, node, &state);
GskVulkanImage *image;
cairo_rectangle_int_t area;
- graphene_size_t viewport_size;
VkImageLayout initial_layout;
VkImageLayout final_layout;
&(VkViewport) {
.x = 0,
.y = 0,
- .width = self->viewport_size.width,
- .height = self->viewport_size.height,
+ .width = gsk_vulkan_image_get_width (self->image),
+ .height = gsk_vulkan_image_get_height (self->image),
.minDepth = 0,
.maxDepth = 1
});
gsk_vulkan_render_pass_begin_op (GskVulkanRender *render,
GskVulkanImage *image,
const cairo_rectangle_int_t *area,
- const graphene_size_t *viewport_size,
VkImageLayout initial_layout,
VkImageLayout final_layout)
{
self->initial_layout = initial_layout;
self->final_layout = final_layout;
self->area = *area;
- self->viewport_size = *viewport_size;
}
void
{
GskVulkanRenderPass *render_pass;
GdkVulkanContext *context;
- graphene_rect_t view;
GskVulkanImage *image;
- float scale_x, scale_y;
+ int width, height;
- scale_x = graphene_vec2_get_x (scale);
- scale_y = graphene_vec2_get_y (scale);
- view = GRAPHENE_RECT_INIT (scale_x * viewport->origin.x,
- scale_y * viewport->origin.y,
- ceil (scale_x * viewport->size.width),
- ceil (scale_y * viewport->size.height));
+ width = ceil (graphene_vec2_get_x (scale) * viewport->size.width);
+ height = ceil (graphene_vec2_get_y (scale) * viewport->size.height);
context = gsk_vulkan_render_get_context (render);
image = gsk_vulkan_image_new_for_offscreen (context,
gdk_vulkan_context_get_offscreen_format (context,
gsk_render_node_get_preferred_depth (node)),
- view.size.width, view.size.height);
+ width, height);
gsk_vulkan_render_pass_begin_op (render,
image,
- &(cairo_rectangle_int_t) {
- 0, 0,
- gsk_vulkan_image_get_width (image),
- gsk_vulkan_image_get_height (image)
- },
- &viewport->size,
+ &(cairo_rectangle_int_t) { 0, 0, width, height },
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL);
render_pass = gsk_vulkan_render_pass_new ();
gsk_vulkan_render_pass_add (render_pass,
render,
- scale,
- viewport,
- &(cairo_rectangle_int_t) {
- 0, 0,
- gsk_vulkan_image_get_width (image),
- gsk_vulkan_image_get_height (image)
- },
- node);
+ width, height,
+ &(cairo_rectangle_int_t) { 0, 0, width, height },
+ node,
+ viewport);
gsk_vulkan_render_pass_free (render_pass);
gsk_vulkan_render_pass_end_op (render,
void gsk_vulkan_render_pass_begin_op (GskVulkanRender *render,
GskVulkanImage *image,
const cairo_rectangle_int_t *area,
- const graphene_size_t *viewport_size,
VkImageLayout initial_layout,
VkImageLayout final_layout);
void gsk_vulkan_render_pass_end_op (GskVulkanRender *render,
void gsk_vulkan_render_pass_add (GskVulkanRenderPass *self,
GskVulkanRender *render,
- const graphene_vec2_t *scale,
- const graphene_rect_t *viewport,
+ int width,
+ int height,
cairo_rectangle_int_t *clip,
- GskRenderNode *node);
+ GskRenderNode *node,
+ const graphene_rect_t *viewport);
G_END_DECLS