mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-24 17:37:30 +09:00
CWebRender pt2
This commit is contained in:
parent
1190eb1c6a
commit
fe181d242f
22 changed files with 1623 additions and 489 deletions
5
gfx/wr/tests/moz.build
Normal file
5
gfx/wr/tests/moz.build
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
|
||||
# This is a standalone C regression executable. It includes the C renderer
|
||||
# implementation directly so it does not require another language's harness.
|
||||
SimplePrograms(['webrender_test'], ext='.c')
|
||||
274
gfx/wr/tests/webrender_test.c
Normal file
274
gfx/wr/tests/webrender_test.c
Normal file
|
|
@ -0,0 +1,274 @@
|
|||
#include "../wr_util.c"
|
||||
#include "../wr_context.c"
|
||||
#include "../wr_display_list.c"
|
||||
#include "../wr_frame.c"
|
||||
#include "../wr_frame_packet.c"
|
||||
#include "../wr_retained.c"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
static void
|
||||
test_retained_frame(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(4);
|
||||
const wr_frame* first;
|
||||
const wr_frame* cached;
|
||||
const wr_frame* culled;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_display_list_push_rect(context, (wr_rect){ 0, 0, 10, 10 },
|
||||
(wr_color){ 1, 0, 0, 1 }));
|
||||
first = wr_context_build_frame(context);
|
||||
cached = wr_context_build_frame(context);
|
||||
assert(first == cached);
|
||||
assert(cached->quad_count == 1 && cached->batch_count == 1);
|
||||
|
||||
wr_context_set_viewport(context, (wr_rect){ 200, 200, 10, 10 });
|
||||
culled = wr_context_build_frame(context);
|
||||
assert(culled && culled->quad_count == 0);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_stacking_and_image(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(4);
|
||||
const wr_frame* frame;
|
||||
const wr_transform translate = { 1, 0, 0, 1, 20, 0 };
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_context_register_image(context, 7, 64, 64));
|
||||
assert(wr_display_list_push_stacking_context(context, translate, 0.5f));
|
||||
assert(wr_display_list_push_clip(context, (wr_rect){ 15, 0, 30, 30 }));
|
||||
assert(wr_display_list_push_rect(context, (wr_rect){ 0, 0, 10, 10 },
|
||||
(wr_color){ 1, 0, 0, 1 }));
|
||||
wr_display_list_pop_stacking_context(context);
|
||||
assert(wr_display_list_push_image(
|
||||
context, (wr_rect){ 30, 0, 20, 20 }, 7,
|
||||
(wr_rect){ 0, 0, 0.5f, 0.5f }, (wr_color){ 0.25f, 0.5f, 0.75f, 1 }));
|
||||
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 2 && frame->batch_count == 2);
|
||||
assert(frame->quads[0].color.a == 0.5f);
|
||||
assert(frame->batches[0].has_clip);
|
||||
assert(frame->batches[0].transform.m31 == 20);
|
||||
assert(frame->batches[1].kind == WR_PRIMITIVE_IMAGE);
|
||||
assert(frame->batches[1].image_key == 7);
|
||||
assert(frame->quads[1].color.r == 0.25f);
|
||||
assert(frame->quads[1].color.g == 0.5f);
|
||||
assert(frame->quads[1].color.b == 0.75f);
|
||||
assert(frame->quads[1].tex_rect.width == 0.5f);
|
||||
wr_context_unregister_image(context, 7);
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 1 && frame->batch_count == 1);
|
||||
wr_context_clear(context);
|
||||
assert(!wr_display_list_push_image(
|
||||
context, (wr_rect){ 30, 0, 20, 20 }, 7,
|
||||
(wr_rect){ 0, 0, 0.5f, 0.5f }, (wr_color){ 1, 1, 1, 1 }));
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_scene_transactions(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(2);
|
||||
const wr_frame* frame;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_display_list_push_rect(context, (wr_rect){ 0, 0, 10, 10 },
|
||||
(wr_color){ 1, 0, 0, 1 }));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 1);
|
||||
|
||||
assert(wr_context_begin_transaction(context));
|
||||
assert(wr_display_list_push_rect(context, (wr_rect){ 20, 0, 10, 10 },
|
||||
(wr_color){ 0, 1, 0, 1 }));
|
||||
wr_context_abort_transaction(context);
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 1);
|
||||
|
||||
assert(wr_context_begin_transaction(context));
|
||||
assert(wr_display_list_push_rect(context, (wr_rect){ 20, 0, 10, 10 },
|
||||
(wr_color){ 0, 1, 0, 1 }));
|
||||
assert(wr_context_begin_transaction(context));
|
||||
assert(wr_display_list_push_rect(context, (wr_rect){ 40, 0, 10, 10 },
|
||||
(wr_color){ 0, 0, 1, 1 }));
|
||||
wr_context_abort_transaction(context);
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 2);
|
||||
assert(wr_context_commit_transaction(context));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 2);
|
||||
|
||||
assert(!wr_context_commit_transaction(context));
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_multiple_image_resources(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(4);
|
||||
const wr_frame* frame;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_context_register_image(context, 11, 32, 32));
|
||||
assert(wr_context_register_image(context, 12, 64, 64));
|
||||
assert(wr_display_list_push_image(
|
||||
context, (wr_rect){ 0, 0, 20, 20 }, 11,
|
||||
(wr_rect){ 0, 0, 1, 1 }, (wr_color){ 1, 1, 1, 1 }));
|
||||
assert(wr_display_list_push_image(
|
||||
context, (wr_rect){ 20, 0, 20, 20 }, 12,
|
||||
(wr_rect){ 0, 0, 1, 1 }, (wr_color){ 1, 1, 1, 1 }));
|
||||
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 2 && frame->batch_count == 2);
|
||||
assert(frame->batches[0].image_key == 11);
|
||||
assert(frame->batches[1].image_key == 12);
|
||||
wr_context_clear_images(context);
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 0 && frame->batch_count == 0);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_stable_item_updates(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(4);
|
||||
const wr_frame* frame;
|
||||
const wr_transform identity = { 1, 0, 0, 1, 0, 0 };
|
||||
wr_item_id item;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
item = wr_display_list_push_rect_with_id(
|
||||
context, 42, (wr_rect){ 0, 0, 10, 10 }, (wr_color){ 1, 0, 0, 1 });
|
||||
assert(item == 42);
|
||||
assert(wr_display_list_push_rect_with_id(
|
||||
context, 42, (wr_rect){ 20, 0, 10, 10 }, (wr_color){ 0, 1, 0, 1 }) == 0);
|
||||
|
||||
assert(wr_context_begin_transaction(context));
|
||||
assert(wr_display_list_update_rect(
|
||||
context, item, (wr_rect){ 20, 0, 10, 10 },
|
||||
(wr_color){ 0, 1, 0, 1 }, identity));
|
||||
wr_context_abort_transaction(context);
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 1);
|
||||
assert(frame->quads[0].rect.x == 0);
|
||||
|
||||
assert(wr_context_begin_transaction(context));
|
||||
assert(wr_display_list_update_rect(
|
||||
context, item, (wr_rect){ 20, 0, 10, 10 },
|
||||
(wr_color){ 0, 1, 0, 1 }, identity));
|
||||
assert(wr_context_commit_transaction(context));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 1);
|
||||
assert(frame->quads[0].rect.x == 20);
|
||||
assert(frame->quads[0].item_id == 42);
|
||||
|
||||
assert(wr_context_remove_item(context, item));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 0);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_opaque_occlusion(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(2);
|
||||
const wr_frame* frame;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_display_list_push_rect(
|
||||
context, (wr_rect){ 0, 0, 20, 20 }, (wr_color){ 1, 0, 0, 1 }));
|
||||
assert(wr_display_list_push_rect(
|
||||
context, (wr_rect){ 0, 0, 20, 20 }, (wr_color){ 0, 0, 1, 1 }));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 1 && frame->batch_count == 1);
|
||||
assert(frame->quads[0].color.b == 1.0f);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_gpu_tessellated_primitives(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(64);
|
||||
const wr_frame* frame;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_display_list_push_linear_gradient(
|
||||
context, (wr_rect){ 0, 0, 40, 20 },
|
||||
(wr_color){ 1, 0, 0, 1 }, (wr_color){ 0, 0, 1, 1 }, 1));
|
||||
assert(wr_display_list_push_rounded_rect(
|
||||
context, (wr_rect){ 0, 20, 40, 20 }, (wr_color){ 0, 1, 0, 1 }, 8));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 48);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_glyph_run(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(4);
|
||||
const wr_frame* frame;
|
||||
const wr_glyph glyphs[2] = {
|
||||
{ { 0, 0, 8, 12 }, { 0, 0, 0.25f, 1 } },
|
||||
{ { 8, 0, 8, 12 }, { 0.25f, 0, 0.25f, 1 } }
|
||||
};
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_context_register_image(context, 21, 256, 256));
|
||||
assert(wr_display_list_push_glyph_run(
|
||||
context, 21, glyphs, 2, (wr_color){ 1, 1, 1, 1 }));
|
||||
frame = wr_context_build_frame(context);
|
||||
assert(frame && frame->quad_count == 2 && frame->batch_count == 1);
|
||||
assert(frame->batches[0].kind == WR_PRIMITIVE_IMAGE);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
static void
|
||||
test_frame_packet(void)
|
||||
{
|
||||
wr_context* context = wr_context_create(2);
|
||||
const wr_frame* frame;
|
||||
size_t packet_size;
|
||||
unsigned char* packet;
|
||||
wr_frame_packet_header header;
|
||||
|
||||
assert(context);
|
||||
wr_context_set_viewport(context, (wr_rect){ 0, 0, 100, 100 });
|
||||
assert(wr_display_list_push_rect(
|
||||
context, (wr_rect){ 0, 0, 10, 10 }, (wr_color){ 1, 0, 0, 1 }));
|
||||
frame = wr_context_build_frame(context);
|
||||
packet_size = wr_frame_packet_size(frame);
|
||||
assert(packet_size > sizeof(header));
|
||||
packet = (unsigned char*)malloc(packet_size);
|
||||
assert(packet);
|
||||
assert(wr_frame_serialize(frame, packet, packet_size));
|
||||
memcpy(&header, packet, sizeof(header));
|
||||
assert(header.version == WR_FRAME_PACKET_VERSION);
|
||||
assert(header.quad_count == 1 && header.batch_count == 1);
|
||||
free(packet);
|
||||
wr_context_destroy(context);
|
||||
}
|
||||
|
||||
int
|
||||
main(void)
|
||||
{
|
||||
test_retained_frame();
|
||||
test_stacking_and_image();
|
||||
test_scene_transactions();
|
||||
test_multiple_image_resources();
|
||||
test_stable_item_updates();
|
||||
test_opaque_occlusion();
|
||||
test_gpu_tessellated_primitives();
|
||||
test_glyph_run();
|
||||
test_frame_packet();
|
||||
return 0;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue