gtk/gsk/gpu/gskgpuscissorop.c
Benjamin Otte 1733671295 gpu: Add a CommandState struct to the command vfuncs
This way, we can make it writable and track things like the active
textures and the current program.

We don't do that yet, but we can.
2024-01-07 07:22:51 +01:00

91 lines
2.2 KiB
C

#include "config.h"
#include "gskgpuscissoropprivate.h"
#include "gskgpuopprivate.h"
#include "gskgpuprintprivate.h"
typedef struct _GskGpuScissorOp GskGpuScissorOp;
struct _GskGpuScissorOp
{
GskGpuOp op;
cairo_rectangle_int_t rect;
};
static void
gsk_gpu_scissor_op_finish (GskGpuOp *op)
{
}
static void
gsk_gpu_scissor_op_print (GskGpuOp *op,
GskGpuFrame *frame,
GString *string,
guint indent)
{
GskGpuScissorOp *self = (GskGpuScissorOp *) op;
gsk_gpu_print_op (string, indent, "scissor");
gsk_gpu_print_int_rect (string, &self->rect);
gsk_gpu_print_newline (string);
}
#ifdef GDK_RENDERING_VULKAN
static GskGpuOp *
gsk_gpu_scissor_op_vk_command (GskGpuOp *op,
GskGpuFrame *frame,
GskVulkanCommandState *state)
{
GskGpuScissorOp *self = (GskGpuScissorOp *) op;
vkCmdSetScissor (state->vk_command_buffer,
0,
1,
&(VkRect2D) {
{ self->rect.x, self->rect.y },
{ self->rect.width, self->rect.height },
});
return op->next;
}
#endif
static GskGpuOp *
gsk_gpu_scissor_op_gl_command (GskGpuOp *op,
GskGpuFrame *frame,
GskGLCommandState *state)
{
GskGpuScissorOp *self = (GskGpuScissorOp *) op;
if (state->flip_y)
glScissor (self->rect.x, state->flip_y - self->rect.y - self->rect.height, self->rect.width, self->rect.height);
else
glScissor (self->rect.x, self->rect.y, self->rect.width, self->rect.height);
return op->next;
}
static const GskGpuOpClass GSK_GPU_SCISSOR_OP_CLASS = {
GSK_GPU_OP_SIZE (GskGpuScissorOp),
GSK_GPU_STAGE_COMMAND,
gsk_gpu_scissor_op_finish,
gsk_gpu_scissor_op_print,
#ifdef GDK_RENDERING_VULKAN
gsk_gpu_scissor_op_vk_command,
#endif
gsk_gpu_scissor_op_gl_command
};
void
gsk_gpu_scissor_op (GskGpuFrame *frame,
const cairo_rectangle_int_t *rect)
{
GskGpuScissorOp *self;
self = (GskGpuScissorOp *) gsk_gpu_op_alloc (frame, &GSK_GPU_SCISSOR_OP_CLASS);
self->rect = *rect;
}