Bug 1594091 - Unify text and brush instance attribute decoding. r=gw

Depends on D51883

Differential Revision: https://phabricator.services.mozilla.com/D51884

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Nicolas Silva 2019-11-05 19:06:20 +00:00
parent eff2972112
commit 9393a43660
3 changed files with 40 additions and 23 deletions

View File

@ -29,25 +29,21 @@ void brush_vs(
void main(void) {
// Load the brush instance from vertex attributes.
int prim_header_address = aData.x;
int render_task_index = aData.y >> 16;
int clip_address = aData.y & 0xffff;
int segment_index = aData.z & 0xffff;
int edge_flags = (aData.z >> 16) & 0xff;
int brush_flags = (aData.z >> 24) & 0xff;
int segment_user_data = aData.w;
PrimitiveHeader ph = fetch_prim_header(prim_header_address);
Instance instance = decode_instance_attributes();
int edge_flags = (instance.flags >> 16) & 0xff;
int brush_flags = (instance.flags >> 24) & 0xff;
PrimitiveHeader ph = fetch_prim_header(instance.prim_header_address);
// Fetch the segment of this brush primitive we are drawing.
vec4 segment_data;
RectWithSize segment_rect;
if (segment_index == INVALID_SEGMENT_INDEX) {
if (instance.segment_index == INVALID_SEGMENT_INDEX) {
segment_rect = ph.local_rect;
segment_data = vec4(0.0);
} else {
int segment_address = ph.specific_prim_address +
VECS_PER_SPECIFIC_BRUSH +
segment_index * VECS_PER_SEGMENT;
instance.segment_index * VECS_PER_SEGMENT;
vec4[2] segment_info = fetch_from_gpu_cache_2(segment_address);
segment_rect = RectWithSize(segment_info[0].xy, segment_info[0].zw);
@ -58,8 +54,8 @@ void main(void) {
VertexInfo vi;
// Fetch the dynamic picture that we are drawing on.
PictureTask pic_task = fetch_picture_task(render_task_index);
ClipArea clip_area = fetch_clip_area(clip_address);
PictureTask pic_task = fetch_picture_task(instance.picture_task_address);
ClipArea clip_area = fetch_clip_area(instance.clip_address);
Transform transform = fetch_transform(ph.transform_id);
@ -117,7 +113,7 @@ void main(void) {
ph.local_rect,
segment_rect,
ph.user_data,
segment_user_data,
instance.user_data,
transform.m,
pic_task,
brush_flags,

View File

@ -50,6 +50,29 @@ in ivec4 aData;
#define VECS_PER_PRIM_HEADER_F 2U
#define VECS_PER_PRIM_HEADER_I 2U
struct Instance
{
int prim_header_address;
int picture_task_address;
int clip_address;
int segment_index;
int flags;
int user_data;
};
Instance decode_instance_attributes() {
Instance instance;
instance.prim_header_address = aData.x;
instance.picture_task_address = aData.y >> 16;
instance.clip_address = aData.y & 0xffff;
instance.segment_index = aData.z & 0xffff;
instance.flags = aData.z & 0xffff0000;
instance.user_data = aData.w;
return instance;
}
struct PrimitiveHeader {
RectWithSize local_rect;
RectWithSize local_clip_rect;

View File

@ -174,19 +174,17 @@ VertexInfo write_text_vertex(RectWithSize local_clip_rect,
}
void main(void) {
int prim_header_address = aData.x;
int render_task_index = aData.y >> 16;
int clip_address = aData.y & 0xffff;
int glyph_index = aData.z & 0xffff;
int subpx_dir = (aData.z >> 24) & 0xff;
int color_mode = (aData.z >> 16) & 0xff;
int resource_address = aData.w;
Instance instance = decode_instance_attributes();
int glyph_index = instance.segment_index;
int subpx_dir = (instance.flags >> 24) & 0xff;
int color_mode = (instance.flags >> 16) & 0xff;
int resource_address = instance.user_data;
PrimitiveHeader ph = fetch_prim_header(prim_header_address);
PrimitiveHeader ph = fetch_prim_header(instance.prim_header_address);
Transform transform = fetch_transform(ph.transform_id);
ClipArea clip_area = fetch_clip_area(clip_address);
PictureTask task = fetch_picture_task(render_task_index);
ClipArea clip_area = fetch_clip_area(instance.clip_address);
PictureTask task = fetch_picture_task(instance.picture_task_address);
int raster_space = ph.user_data.w;