From 81b741a05ccc23b37e294ac6a17b3546aa9804dc Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Wed, 21 Oct 2015 14:15:50 +1000 Subject: [PATCH] virgl/shaders: handle large shaders. the protocol failed to handle larger shaders, this allow the renderer to reassemble large shaders and recombined the chunks before passing them to the GLSL translation. This also enhances the renderer protocol to allow for some more info in the shader object, and removes the separate vs/gs/fs variants in favour of a type field in the shader. --- src/virgl_protocol.h | 55 +- src/vrend_decode.c | 90 +-- src/vrend_renderer.c | 215 +++--- src/vrend_renderer.h | 15 +- tests/large_shader.h | 1416 ++++++++++++++++++++++++++++++++++++++ tests/test_virgl_cmd.c | 57 +- tests/testvirgl_encode.c | 112 ++- 7 files changed, 1740 insertions(+), 220 deletions(-) create mode 100644 tests/large_shader.h diff --git a/src/virgl_protocol.h b/src/virgl_protocol.h index 11c5b38..bf5a02f 100644 --- a/src/virgl_protocol.h +++ b/src/virgl_protocol.h @@ -1,26 +1,25 @@ -/************************************************************************** - * - * Copyright (C) 2015 Red Hat Inc. +/* + * Copyright 2014, 2015 Red Hat. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation - * the rights to use, copy, modify, merge, publish, distribute, sublicense, - * and/or sell copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included - * in all copies or substantial portions of the Software. + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. * - **************************************************************************/ + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ #ifndef VIRGL_PROTOCOL_H #define VIRGL_PROTOCOL_H @@ -39,15 +38,13 @@ enum virgl_object_type { VIRGL_OBJECT_BLEND, VIRGL_OBJECT_RASTERIZER, VIRGL_OBJECT_DSA, - VIRGL_OBJECT_VS, - VIRGL_OBJECT_FS, + VIRGL_OBJECT_SHADER, VIRGL_OBJECT_VERTEX_ELEMENTS, VIRGL_OBJECT_SAMPLER_VIEW, VIRGL_OBJECT_SAMPLER_STATE, VIRGL_OBJECT_SURFACE, VIRGL_OBJECT_QUERY, VIRGL_OBJECT_STREAMOUT_TARGET, - VIRGL_OBJECT_GS, VIRGL_MAX_OBJECTS, }; @@ -208,17 +205,25 @@ enum virgl_context_cmd { #define VIRGL_OBJ_CLEAR_STENCIL 8 /* shader object */ -#define VIRGL_OBJ_SHADER_HDR_SIZE(nso) (3 + ((nso) ? (nso) + 4 : 0)) +#define VIRGL_OBJ_SHADER_HDR_SIZE(nso) (5 + ((nso) ? (2 * nso) + 4 : 0)) #define VIRGL_OBJ_SHADER_HANDLE 1 -#define VIRGL_OBJ_SHADER_NUM_TOKENS 2 -#define VIRGL_OBJ_SHADER_SO_NUM_OUTPUTS 3 -#define VIRGL_OBJ_SHADER_SO_STRIDE(x) (4 + (x)) -#define VIRGL_OBJ_SHADER_SO_OUTPUT0(x) (8 + (x)) +#define VIRGL_OBJ_SHADER_TYPE 2 +#define VIRGL_OBJ_SHADER_OFFSET 3 +#define VIRGL_OBJ_SHADER_OFFSET_VAL(x) (((x) & 0x7fffffff) << 0) +/* start contains full length in VAL - also implies continuations */ +/* continuation contains offset in VAL */ +#define VIRGL_OBJ_SHADER_OFFSET_CONT (0x1 << 31) +#define VIRGL_OBJ_SHADER_NUM_TOKENS 4 +#define VIRGL_OBJ_SHADER_SO_NUM_OUTPUTS 5 +#define VIRGL_OBJ_SHADER_SO_STRIDE(x) (6 + (x)) +#define VIRGL_OBJ_SHADER_SO_OUTPUT0(x) (10 + (x * 2)) #define VIRGL_OBJ_SHADER_SO_OUTPUT_REGISTER_INDEX(x) (((x) & 0xff) << 0) #define VIRGL_OBJ_SHADER_SO_OUTPUT_START_COMPONENT(x) (((x) & 0x3) << 8) #define VIRGL_OBJ_SHADER_SO_OUTPUT_NUM_COMPONENTS(x) (((x) & 0x7) << 10) #define VIRGL_OBJ_SHADER_SO_OUTPUT_BUFFER(x) (((x) & 0x7) << 13) #define VIRGL_OBJ_SHADER_SO_OUTPUT_DST_OFFSET(x) (((x) & 0xffff) << 16) +#define VIRGL_OBJ_SHADER_SO_OUTPUT0_SO(x) (11 + (x * 2)) +#define VIRGL_OBJ_SHADER_SO_OUTPUT_STREAM(x) (((x) & 0x03) << 0) /* viewport state */ #define VIRGL_SET_VIEWPORT_STATE_SIZE(num_viewports) ((6 * num_viewports) + 1) diff --git a/src/vrend_decode.c b/src/vrend_decode.c index 1d32774..0fef313 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -61,68 +61,48 @@ static inline void *get_buf_ptr(struct vrend_decode_ctx *ctx, return &ctx->ds->buf[ctx->ds->buf_offset + offset]; } -static int vrend_decode_create_shader(struct vrend_decode_ctx *ctx, uint32_t type, +static int vrend_decode_create_shader(struct vrend_decode_ctx *ctx, uint32_t handle, uint16_t length) { - struct pipe_shader_state *state; - struct tgsi_token *tokens; + struct pipe_stream_output_info so_info; int i, ret; uint32_t shader_offset; - unsigned num_tokens; + unsigned num_tokens, num_so_outputs, offlen; uint8_t *shd_text; + uint32_t type; - if (length < 3) + if (length < 5) return EINVAL; - state = CALLOC_STRUCT(pipe_shader_state); - if (!state) - return ENOMEM; - + type = get_buf_entry(ctx, VIRGL_OBJ_SHADER_TYPE); num_tokens = get_buf_entry(ctx, VIRGL_OBJ_SHADER_NUM_TOKENS); - - if (num_tokens == 0) - num_tokens = 300; - - tokens = calloc(num_tokens + 10, sizeof(struct tgsi_token)); - if (!tokens) { - free(state); - return ENOMEM; - } - - state->stream_output.num_outputs = get_buf_entry(ctx, VIRGL_OBJ_SHADER_SO_NUM_OUTPUTS); - if (state->stream_output.num_outputs) { - for (i = 0; i < 4; i++) - state->stream_output.stride[i] = get_buf_entry(ctx, VIRGL_OBJ_SHADER_SO_STRIDE(i)); - for (i = 0; i < state->stream_output.num_outputs; i++) { - uint32_t tmp = get_buf_entry(ctx, VIRGL_OBJ_SHADER_SO_OUTPUT0(i)); - - state->stream_output.output[i].register_index = tmp & 0xff; - state->stream_output.output[i].start_component = (tmp >> 8) & 0x3; - state->stream_output.output[i].num_components = (tmp >> 10) & 0x7; - state->stream_output.output[i].output_buffer = (tmp >> 13) & 0x7; - state->stream_output.output[i].dst_offset = (tmp >> 16) & 0xffff; + offlen = get_buf_entry(ctx, VIRGL_OBJ_SHADER_OFFSET); + num_so_outputs = get_buf_entry(ctx, VIRGL_OBJ_SHADER_SO_NUM_OUTPUTS); + + shader_offset = 6; + if (num_so_outputs) { + so_info.num_outputs = num_so_outputs; + if (so_info.num_outputs) { + for (i = 0; i < 4; i++) + so_info.stride[i] = get_buf_entry(ctx, VIRGL_OBJ_SHADER_SO_STRIDE(i)); + for (i = 0; i < so_info.num_outputs; i++) { + uint32_t tmp = get_buf_entry(ctx, VIRGL_OBJ_SHADER_SO_OUTPUT0(i)); + + so_info.output[i].register_index = tmp & 0xff; + so_info.output[i].start_component = (tmp >> 8) & 0x3; + so_info.output[i].num_components = (tmp >> 10) & 0x7; + so_info.output[i].output_buffer = (tmp >> 13) & 0x7; + so_info.output[i].dst_offset = (tmp >> 16) & 0xffff; + } } - shader_offset = 8 + state->stream_output.num_outputs; + shader_offset += 4 + (2 * num_so_outputs); } else - shader_offset = 4; + memset(&so_info, 0, sizeof(so_info)); shd_text = get_buf_ptr(ctx, shader_offset); - if (vrend_dump_shaders) - fprintf(stderr,"shader\n%s\n", shd_text); - if (!tgsi_text_translate((const char *)shd_text, tokens, num_tokens + 10)) { - fprintf(stderr,"failed to translate\n %s\n", shd_text); - free(tokens); - free(state); - return EINVAL; - } - - state->tokens = tokens; + ret = vrend_create_shader(ctx->grctx, handle, &so_info, (const char *)shd_text, offlen, num_tokens, type, length - shader_offset + 1); - ret = vrend_create_shader(ctx->grctx, handle, state, type); - - free(tokens); - free(state); return ret; } @@ -655,10 +635,8 @@ static int vrend_decode_create_object(struct vrend_decode_ctx *ctx, int length) case VIRGL_OBJECT_RASTERIZER: ret = vrend_decode_create_rasterizer(ctx, handle, length); break; - case VIRGL_OBJECT_VS: - case VIRGL_OBJECT_GS: - case VIRGL_OBJECT_FS: - ret = vrend_decode_create_shader(ctx, obj_type, handle, length); + case VIRGL_OBJECT_SHADER: + ret = vrend_decode_create_shader(ctx, handle, length); break; case VIRGL_OBJECT_VERTEX_ELEMENTS: ret = vrend_decode_create_ve(ctx, handle, length); @@ -704,14 +682,8 @@ static int vrend_decode_bind_object(struct vrend_decode_ctx *ctx, uint16_t lengt case VIRGL_OBJECT_RASTERIZER: vrend_object_bind_rasterizer(ctx->grctx, handle); break; - case VIRGL_OBJECT_VS: - vrend_bind_vs(ctx->grctx, handle); - break; - case VIRGL_OBJECT_GS: - vrend_bind_gs(ctx->grctx, handle); - break; - case VIRGL_OBJECT_FS: - vrend_bind_fs(ctx->grctx, handle); + case VIRGL_OBJECT_SHADER: + vrend_bind_shader(ctx->grctx, handle); break; case VIRGL_OBJECT_VERTEX_ELEMENTS: vrend_bind_vertex_elements_state(ctx->grctx, handle); diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index a0a261a..4200d15 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -47,6 +47,7 @@ #include "virgl_hw.h" +#include "tgsi/tgsi_text.h" /* debugging aid to dump shaders */ int vrend_dump_shaders; @@ -153,6 +154,10 @@ struct vrend_shader_selector { struct vrend_shader *current; struct tgsi_token *tokens; + + char *tmp_buf; + uint32_t buf_len; + uint32_t buf_offset; }; struct vrend_texture { @@ -281,10 +286,8 @@ struct vrend_sub_context { bool sampler_state_dirty; bool stencil_state_dirty; - struct vrend_shader_selector *vs; - struct vrend_shader_selector *gs; - struct vrend_shader_selector *fs; - + uint32_t long_shader_in_progress_handle[PIPE_SHADER_TYPES]; + struct vrend_shader_selector *shaders[PIPE_SHADER_TYPES]; struct vrend_linked_shader_program *prog; struct vrend_shader_view views[PIPE_SHADER_TYPES]; @@ -530,6 +533,7 @@ static void vrend_destroy_shader_selector(struct vrend_shader_selector *sel) } for (i = 0; i < sel->sinfo.so_info.num_outputs; i++) free(sel->sinfo.so_names[i]); + free(sel->tmp_buf); free(sel->sinfo.so_names); free(sel->sinfo.interpinfo); free(sel->tokens); @@ -1941,7 +1945,7 @@ static inline void vrend_fill_shader_key(struct vrend_context *ctx, key->invert_fs_origin = !ctx->sub->inverted_fbo_content; key->coord_replace = ctx->sub->rs_state.point_quad_rasterization ? ctx->sub->rs_state.sprite_coord_enable : 0; - if (ctx->sub->gs) + if (ctx->sub->shaders[PIPE_SHADER_GEOMETRY]) key->gs_present = true; } @@ -2030,96 +2034,148 @@ static int vrend_shader_select(struct vrend_context *ctx, } static void *vrend_create_shader_state(struct vrend_context *ctx, - const struct pipe_shader_state *state, + const struct pipe_stream_output_info *so_info, unsigned pipe_shader_type) { struct vrend_shader_selector *sel = CALLOC_STRUCT(vrend_shader_selector); - int r; if (!sel) return NULL; sel->type = pipe_shader_type; - sel->sinfo.so_info = state->stream_output; - sel->tokens = tgsi_dup_tokens(state->tokens); + sel->sinfo.so_info = *so_info; pipe_reference_init(&sel->reference, 1); - r = vrend_shader_select(ctx, sel, NULL); - if (r) { - vrend_destroy_shader_selector(sel); - return NULL; - } return sel; } -static inline int shader_type_to_pipe_type(int type) +static int vrend_finish_shader(struct vrend_context *ctx, + struct vrend_shader_selector *sel, + const struct tgsi_token *tokens) { - switch (type) { - case VIRGL_OBJECT_GS: - return PIPE_SHADER_GEOMETRY; - case VIRGL_OBJECT_VS: - return PIPE_SHADER_VERTEX; - case VIRGL_OBJECT_FS: - return PIPE_SHADER_FRAGMENT; + int r; + + sel->tokens = tgsi_dup_tokens(tokens); + + r = vrend_shader_select(ctx, sel, NULL); + if (r) { + vrend_destroy_shader_selector(sel); + return EINVAL; } return 0; } int vrend_create_shader(struct vrend_context *ctx, - uint32_t handle, const struct pipe_shader_state *ss, - int type) + uint32_t handle, + const struct pipe_stream_output_info *so_info, + const char *shd_text, uint32_t offlen, uint32_t num_tokens, + int type, uint32_t pkt_length) { struct vrend_shader_selector *sel; int ret_handle; + bool new_shader = true, long_shader = false; + bool finished = false; - sel = vrend_create_shader_state(ctx, ss, shader_type_to_pipe_type(type)); - if (sel == NULL) - return ENOMEM; + if (type > PIPE_SHADER_GEOMETRY) + return EINVAL; - ret_handle = vrend_renderer_object_insert(ctx, sel, sizeof(*sel), handle, type); - if (ret_handle == 0) { - vrend_destroy_shader_selector(sel); - return ENOMEM; + if (offlen & VIRGL_OBJ_SHADER_OFFSET_CONT) + new_shader = false; + else if (((offlen + 3) / 4) > pkt_length) + long_shader = true; + + /* if we have an in progress one - don't allow a new shader + of that type or a different handle. */ + if (ctx->sub->long_shader_in_progress_handle[type]) { + if (new_shader == true) + return EINVAL; + if (handle != ctx->sub->long_shader_in_progress_handle[type]) + return EINVAL; } - return 0; + if (new_shader) { + sel = vrend_create_shader_state(ctx, so_info, type); + if (sel == NULL) + return ENOMEM; + + if (long_shader) { + sel->tmp_buf = malloc(offlen); + if (!sel->tmp_buf) { + free(sel); + return ENOMEM; + } + sel->buf_len = offlen; + memcpy(sel->tmp_buf, shd_text, pkt_length * 4); + sel->buf_offset = pkt_length * 4; + ctx->sub->long_shader_in_progress_handle[type] = handle; + } else + finished = true; + } else { + sel = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_SHADER); + if (!sel) { + fprintf(stderr, "got continuation without original shader %d\n", handle); + return EINVAL; + } -} + offlen &= ~VIRGL_OBJ_SHADER_OFFSET_CONT; + if (offlen != sel->buf_offset) { + fprintf(stderr, "Got mismatched shader continuation %d vs %d\n", + offlen, sel->buf_offset); + vrend_renderer_object_destroy(ctx, handle); + return EINVAL; + } + memcpy(sel->tmp_buf + sel->buf_offset, shd_text, pkt_length * 4); -void vrend_bind_vs(struct vrend_context *ctx, - uint32_t handle) -{ - struct vrend_shader_selector *sel; + sel->buf_offset += pkt_length * 4; + if (sel->buf_offset >= sel->buf_len) { + finished = true; + shd_text = sel->tmp_buf; + } + } - sel = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_VS); + if (finished) { + struct tgsi_token *tokens; - if (ctx->sub->vs != sel) - ctx->sub->shader_dirty = true; - vrend_shader_state_reference(&ctx->sub->vs, sel); -} + tokens = calloc(num_tokens + 10, sizeof(struct tgsi_token)); + if (!tokens) { + return ENOMEM; + } -void vrend_bind_gs(struct vrend_context *ctx, - uint32_t handle) -{ - struct vrend_shader_selector *sel; + if (vrend_dump_shaders) + fprintf(stderr,"shader\n%s\n", shd_text); + if (!tgsi_text_translate((const char *)shd_text, tokens, num_tokens + 10)) + return EINVAL; - sel = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_GS); + vrend_finish_shader(ctx, sel, tokens); + free(sel->tmp_buf); + sel->tmp_buf = NULL; + free(tokens); + ctx->sub->long_shader_in_progress_handle[type] = 0; + } + + if (new_shader) { + ret_handle = vrend_renderer_object_insert(ctx, sel, sizeof(*sel), handle, VIRGL_OBJECT_SHADER); + if (ret_handle == 0) { + vrend_destroy_shader_selector(sel); + return ENOMEM; + } + } + + return 0; - if (ctx->sub->gs != sel) - ctx->sub->shader_dirty = true; - vrend_shader_state_reference(&ctx->sub->gs, sel); } -void vrend_bind_fs(struct vrend_context *ctx, - uint32_t handle) +void vrend_bind_shader(struct vrend_context *ctx, + uint32_t handle) { struct vrend_shader_selector *sel; - sel = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_FS); - - if (ctx->sub->fs != sel) + sel = vrend_object_lookup(ctx->sub->object_hash, handle, VIRGL_OBJECT_SHADER); + if (!sel) + return; + if (ctx->sub->shaders[sel->type] != sel) ctx->sub->shader_dirty = true; - vrend_shader_state_reference(&ctx->sub->fs, sel); + vrend_shader_state_reference(&ctx->sub->shaders[sel->type], sel); } void vrend_clear(struct vrend_context *ctx, @@ -2395,7 +2451,7 @@ static void vrend_draw_bind_samplers(struct vrend_context *ctx) int shader_type; sampler_id = 0; - for (shader_type = PIPE_SHADER_VERTEX; shader_type <= (ctx->sub->gs ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); shader_type++) { + for (shader_type = PIPE_SHADER_VERTEX; shader_type <= (ctx->sub->shaders[PIPE_SHADER_GEOMETRY] ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); shader_type++) { int index = 0; for (i = 0; i < ctx->sub->views[shader_type].num_views; i++) { struct vrend_resource *texture = NULL; @@ -2467,7 +2523,7 @@ static void vrend_draw_bind_ubo(struct vrend_context *ctx) int shader_type; ubo_id = 0; - for (shader_type = PIPE_SHADER_VERTEX; shader_type <= (ctx->sub->gs ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); shader_type++) { + for (shader_type = PIPE_SHADER_VERTEX; shader_type <= (ctx->sub->shaders[PIPE_SHADER_GEOMETRY] ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); shader_type++) { uint32_t mask; int shader_ubo_idx = 0; struct pipe_constant_buffer *cb; @@ -2522,23 +2578,25 @@ void vrend_draw_vbo(struct vrend_context *ctx, struct vrend_linked_shader_program *prog; bool fs_dirty, vs_dirty, gs_dirty; bool dual_src = util_blend_state_is_dual(&ctx->sub->blend_state, 0); - if (!ctx->sub->vs || !ctx->sub->fs) { + if (!ctx->sub->shaders[PIPE_SHADER_VERTEX] || !ctx->sub->shaders[PIPE_SHADER_FRAGMENT]) { fprintf(stderr,"dropping rendering due to missing shaders: %s\n", ctx->debug_name); return; } - vrend_shader_select(ctx, ctx->sub->fs, &fs_dirty); - vrend_shader_select(ctx, ctx->sub->vs, &vs_dirty); - if (ctx->sub->gs) - vrend_shader_select(ctx, ctx->sub->gs, &gs_dirty); + vrend_shader_select(ctx, ctx->sub->shaders[PIPE_SHADER_FRAGMENT], &fs_dirty); + vrend_shader_select(ctx, ctx->sub->shaders[PIPE_SHADER_VERTEX], &vs_dirty); + if (ctx->sub->shaders[PIPE_SHADER_GEOMETRY]) + vrend_shader_select(ctx, ctx->sub->shaders[PIPE_SHADER_GEOMETRY], &gs_dirty); - if (!ctx->sub->vs->current || !ctx->sub->fs->current || (ctx->sub->gs && !ctx->sub->gs->current)) { + if (!ctx->sub->shaders[PIPE_SHADER_VERTEX]->current || !ctx->sub->shaders[PIPE_SHADER_FRAGMENT]->current || (ctx->sub->shaders[PIPE_SHADER_GEOMETRY] && !ctx->sub->shaders[PIPE_SHADER_GEOMETRY]->current)) { fprintf(stderr, "failure to compile shader variants: %s\n", ctx->debug_name); return; } - prog = lookup_shader_program(ctx, ctx->sub->vs->current->id, ctx->sub->fs->current->id, ctx->sub->gs ? ctx->sub->gs->current->id : 0, dual_src); + prog = lookup_shader_program(ctx, ctx->sub->shaders[PIPE_SHADER_VERTEX]->current->id, ctx->sub->shaders[PIPE_SHADER_FRAGMENT]->current->id, ctx->sub->shaders[PIPE_SHADER_GEOMETRY] ? ctx->sub->shaders[PIPE_SHADER_GEOMETRY]->current->id : 0, dual_src); if (!prog) { - prog = add_shader_program(ctx, ctx->sub->vs->current, ctx->sub->fs->current, ctx->sub->gs ? ctx->sub->gs->current : NULL); + prog = add_shader_program(ctx, + ctx->sub->shaders[PIPE_SHADER_VERTEX]->current, + ctx->sub->shaders[PIPE_SHADER_FRAGMENT]->current, ctx->sub->shaders[PIPE_SHADER_GEOMETRY] ? ctx->sub->shaders[PIPE_SHADER_GEOMETRY]->current : NULL); if (!prog) return; } @@ -2555,16 +2613,10 @@ void vrend_draw_vbo(struct vrend_context *ctx, vrend_use_program(ctx, ctx->sub->prog->id); - for (shader_type = PIPE_SHADER_VERTEX; shader_type <= (ctx->sub->gs ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); shader_type++) { + for (shader_type = PIPE_SHADER_VERTEX; shader_type <= (ctx->sub->shaders[PIPE_SHADER_GEOMETRY] ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); shader_type++) { if (ctx->sub->prog->const_locs[shader_type] && (ctx->sub->const_dirty[shader_type] || new_program)) { int nc; - if (shader_type == PIPE_SHADER_VERTEX) { - nc = ctx->sub->vs->sinfo.num_consts; - } else if (shader_type == PIPE_SHADER_GEOMETRY) { - nc = ctx->sub->gs->sinfo.num_consts; - } else if (shader_type == PIPE_SHADER_FRAGMENT) { - nc = ctx->sub->fs->sinfo.num_consts; - } + nc = ctx->sub->shaders[shader_type]->sinfo.num_consts; for (i = 0; i < nc; i++) { if (ctx->sub->prog->const_locs[shader_type][i] != -1 && ctx->sub->consts[shader_type].consts) glUniform4uiv(ctx->sub->prog->const_locs[shader_type][i], 1, &ctx->sub->consts[shader_type].consts[i * 4]); @@ -2602,8 +2654,8 @@ void vrend_draw_vbo(struct vrend_context *ctx, if (ctx->sub->current_so) { if (ctx->sub->current_so->xfb_state == XFB_STATE_STARTED_NEED_BEGIN) { - if (ctx->sub->gs) - glBeginTransformFeedback(get_gs_xfb_mode(ctx->sub->gs->sinfo.gs_out_prim)); + if (ctx->sub->shaders[PIPE_SHADER_GEOMETRY]) + glBeginTransformFeedback(get_gs_xfb_mode(ctx->sub->shaders[PIPE_SHADER_GEOMETRY]->sinfo.gs_out_prim)); else glBeginTransformFeedback(get_xfb_mode(info->mode)); ctx->sub->current_so->xfb_state = XFB_STATE_STARTED; @@ -3427,9 +3479,7 @@ void vrend_renderer_init(struct vrend_if_cbs *cbs) vrend_resource_set_destroy_callback(vrend_destroy_resource_object); vrend_object_set_destroy_callback(VIRGL_OBJECT_QUERY, vrend_destroy_query_object); vrend_object_set_destroy_callback(VIRGL_OBJECT_SURFACE, vrend_destroy_surface_object); - vrend_object_set_destroy_callback(VIRGL_OBJECT_VS, vrend_destroy_shader_object); - vrend_object_set_destroy_callback(VIRGL_OBJECT_FS, vrend_destroy_shader_object); - vrend_object_set_destroy_callback(VIRGL_OBJECT_GS, vrend_destroy_shader_object); + vrend_object_set_destroy_callback(VIRGL_OBJECT_SHADER, vrend_destroy_shader_object); vrend_object_set_destroy_callback(VIRGL_OBJECT_SAMPLER_VIEW, vrend_destroy_sampler_view_object); vrend_object_set_destroy_callback(VIRGL_OBJECT_STREAMOUT_TARGET, vrend_destroy_so_target_object); vrend_object_set_destroy_callback(VIRGL_OBJECT_SAMPLER_STATE, vrend_destroy_sampler_state_object); @@ -3488,9 +3538,10 @@ static void vrend_destroy_sub_context(struct vrend_sub_context *sub) LIST_FOR_EACH_ENTRY_SAFE(obj, tmp, &sub->streamout_list, head) { vrend_destroy_streamout_object(obj); } - vrend_shader_state_reference(&sub->vs, NULL); - vrend_shader_state_reference(&sub->fs, NULL); - vrend_shader_state_reference(&sub->gs, NULL); + + vrend_shader_state_reference(&sub->shaders[PIPE_SHADER_VERTEX], NULL); + vrend_shader_state_reference(&sub->shaders[PIPE_SHADER_FRAGMENT], NULL); + vrend_shader_state_reference(&sub->shaders[PIPE_SHADER_GEOMETRY], NULL); vrend_free_programs(sub); diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index 3cde1d4..e4973ae 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -104,17 +104,12 @@ void vrend_insert_format(struct vrend_format_table *entry, uint32_t bindings); void vrend_insert_format_swizzle(int override_format, struct vrend_format_table *entry, uint32_t bindings, uint8_t swizzle[4]); int vrend_create_shader(struct vrend_context *ctx, uint32_t handle, - const struct pipe_shader_state *vs, - int type); + const struct pipe_stream_output_info *stream_output, + const char *shd_text, uint32_t offlen, uint32_t num_tokens, + int type, uint32_t pkt_length); -void vrend_bind_vs(struct vrend_context *ctx, - uint32_t handle); - -void vrend_bind_gs(struct vrend_context *ctx, - uint32_t handle); - -void vrend_bind_fs(struct vrend_context *ctx, - uint32_t handle); +void vrend_bind_shader(struct vrend_context *ctx, + uint32_t handle); void vrend_bind_vs_so(struct vrend_context *ctx, uint32_t handle); diff --git a/tests/large_shader.h b/tests/large_shader.h new file mode 100644 index 0000000..3671452 --- /dev/null +++ b/tests/large_shader.h @@ -0,0 +1,1416 @@ +#ifndef LARGE_SHADER_H +#define LARGE_SHADER_H + +#define STRINGIFY(...) #__VA_ARGS__ +const char *large_frag = STRINGIFY( +FRAG +PROPERTY FS_COORD_ORIGIN LOWER_LEFT +DCL IN[0], POSITION, LINEAR +DCL OUT[0], COLOR +DCL CONST[1..2] +DCL CONST[0] +DCL TEMP[0] +DCL TEMP[1..258], LOCAL +IMM[0] FLT32 {0x40000000, 0xbf800000, 0x00000000, 0x3f7fffff} +IMM[1] FLT32 {0xbf3504f4, 0x3f3504f4, 0x00000000, 0x3fb504f3} +IMM[2] FLT32 {0xbf87c3b7, 0x80000000, 0xbf733333, 0x41000000} +IMM[3] UINT32 {0, 4294967295, 0, 0} +IMM[4] INT32 {0, 32, 1, 0} +IMM[5] FLT32 {0x3f6e147b, 0x00000000, 0x40400000, 0x42e20000} +IMM[6] FLT32 {0x42640000, 0x3f000000, 0x472aee8c, 0x3f800000} +IMM[7] FLT32 {0x42680000, 0x42e40000, 0x432a0000, 0x432b0000} +IMM[8] FLT32 {0xbf19999a, 0xbef5c28f, 0x3f23d70a, 0x400147ae} +IMM[9] FLT32 {0xbf4ccccd, 0x3eb851ec, 0xbef5c28f, 0x3e800000} +IMM[10] FLT32 {0x00000000, 0x3f4ccccd, 0x3f19999a, 0x4001eb85} +IMM[11] FLT32 {0x3e000000, 0x4000a3d7, 0x3d800000, 0x3d000000} +IMM[12] FLT32 {0x3f888889, 0xbe99999a, 0x3d4ccccd, 0x3f3851ec} +IMM[13] FLT32 {0x3ecccccd, 0x3f800000, 0x402ccccd, 0xbf000000} +IMM[14] FLT32 {0x3f7d70a4, 0x3eaaaa9f, 0x40400000, 0x3f800000} +IMM[15] FLT32 {0x3f800000, 0x3f000000, 0x00000000, 0x3f2aaa9f} +IMM[16] FLT32 {0x3e4ccccd, 0x3f800000, 0xbea3d70b, 0x3a83126f} +IMM[17] FLT32 {0x3eb33333, 0x3f59999a, 0x00000000, 0x00000000} + 0: MOV TEMP[0], IN[0] + 1: MAD TEMP[0].y, IN[0], CONST[2].zzzz, CONST[2].wwww + 2: RCP TEMP[1].x, CONST[0].xxxx + 3: RCP TEMP[1].y, CONST[0].yyyy + 4: MUL TEMP[1].xy, TEMP[0].xyyy, TEMP[1].xyyy + 5: MAD TEMP[1].xy, IMM[0].xxxx, TEMP[1].xyyy, IMM[0].yyyy + 6: MOV TEMP[2].y, TEMP[1].yyyy + 7: RCP TEMP[3].x, CONST[0].yyyy + 8: MUL TEMP[3].x, CONST[0].xxxx, TEMP[3].xxxx + 9: MUL TEMP[2].x, TEMP[1].xxxx, TEMP[3].xxxx + 10: MUL TEMP[2].xyz, TEMP[2].xxxx, IMM[0].zzww + 11: MAD TEMP[1].xyz, TEMP[1].yyyy, IMM[1].xyzz, TEMP[2].xyzz + 12: ADD TEMP[1].xyz, TEMP[1].xyzz, IMM[2].xxyy + 13: DP3 TEMP[2].x, TEMP[1].xyzz, TEMP[1].xyzz + 14: RSQ TEMP[2].x, TEMP[2].xxxx + 15: MUL TEMP[1].xyz, TEMP[1].xyzz, TEMP[2].xxxx + 16: MOV TEMP[2].xyz, IMM[1].wwzw + 17: MOV TEMP[3].x, IMM[3].xxxx + 18: MOV TEMP[4].x, IMM[0].zzzz + 19: MOV TEMP[5].x, IMM[4].xxxx + 20: BGNLOOP :2 + 21: ISGE TEMP[6].x, TEMP[5].xxxx, IMM[4].yyyy + 22: UIF TEMP[6].xxxx :2 + 23: BRK + 24: ENDIF + 25: DP3 TEMP[7].x, TEMP[2].xyzz, TEMP[2].xyzz + 26: RSQ TEMP[8].x, TEMP[7].xxxx + 27: MUL TEMP[8].x, TEMP[8].xxxx, TEMP[7].xxxx + 28: CMP TEMP[8].x, -TEMP[7].xxxx, TEMP[8].xxxx, IMM[0].zzzz + 29: ADD TEMP[9].x, TEMP[8].xxxx, IMM[2].zzzz + 30: MUL TEMP[10].xyz, TEMP[2].xyzz, IMM[2].wwww + 31: MAD TEMP[11].xyz, IMM[5].xyyy, CONST[1].xxxx, TEMP[10].xyzz + 32: FLR TEMP[12].xyz, TEMP[11].xyzz + 33: FRC TEMP[13].xyz, TEMP[11].xyzz + 34: MUL TEMP[14].xyz, TEMP[13].xyzz, TEMP[13].xyzz + 35: MUL TEMP[15].xyz, IMM[0].xxxx, TEMP[13].xyzz + 36: ADD TEMP[16].xyz, IMM[5].zzzz, -TEMP[15].xyzz + 37: MUL TEMP[17].xyz, TEMP[14].xyzz, TEMP[16].xyzz + 38: MAD TEMP[18].x, TEMP[12].yyyy, IMM[6].xxxx, TEMP[12].xxxx + 39: MAD TEMP[19].x, IMM[5].wwww, TEMP[12].zzzz, TEMP[18].xxxx + 40: SIN TEMP[20].x, TEMP[19].xxxx + 41: MUL TEMP[21].x, TEMP[20].xxxx, IMM[6].zzzz + 42: FRC TEMP[22].x, TEMP[21].xxxx + 43: ADD TEMP[23].x, TEMP[19].xxxx, IMM[6].wwww + 44: SIN TEMP[24].x, TEMP[23].xxxx + 45: MUL TEMP[25].x, TEMP[24].xxxx, IMM[6].zzzz + 46: FRC TEMP[26].x, TEMP[25].xxxx + 47: LRP TEMP[27].x, TEMP[17].xxxx, TEMP[26].xxxx, TEMP[22].xxxx + 48: ADD TEMP[28].x, TEMP[19].xxxx, IMM[6].xxxx + 49: SIN TEMP[29].x, TEMP[28].xxxx + 50: MUL TEMP[30].x, TEMP[29].xxxx, IMM[6].zzzz + 51: FRC TEMP[31].x, TEMP[30].xxxx + 52: ADD TEMP[32].x, TEMP[19].xxxx, IMM[7].xxxx + 53: SIN TEMP[33].x, TEMP[32].xxxx + 54: MUL TEMP[34].x, TEMP[33].xxxx, IMM[6].zzzz + 55: FRC TEMP[35].x, TEMP[34].xxxx + 56: LRP TEMP[36].x, TEMP[17].xxxx, TEMP[35].xxxx, TEMP[31].xxxx + 57: LRP TEMP[37].x, TEMP[17].yyyy, TEMP[36].xxxx, TEMP[27].xxxx + 58: ADD TEMP[38].x, TEMP[19].xxxx, IMM[5].wwww + 59: SIN TEMP[39].x, TEMP[38].xxxx + 60: MUL TEMP[40].x, TEMP[39].xxxx, IMM[6].zzzz + 61: FRC TEMP[41].x, TEMP[40].xxxx + 62: ADD TEMP[42].x, TEMP[19].xxxx, IMM[7].yyyy + 63: SIN TEMP[43].x, TEMP[42].xxxx + 64: MUL TEMP[44].x, TEMP[43].xxxx, IMM[6].zzzz + 65: FRC TEMP[45].x, TEMP[44].xxxx + 66: LRP TEMP[46].x, TEMP[17].xxxx, TEMP[45].xxxx, TEMP[41].xxxx + 67: ADD TEMP[47].x, TEMP[19].xxxx, IMM[7].zzzz + 68: SIN TEMP[48].x, TEMP[47].xxxx + 69: MUL TEMP[49].x, TEMP[48].xxxx, IMM[6].zzzz + 70: FRC TEMP[50].x, TEMP[49].xxxx + 71: ADD TEMP[51].x, TEMP[19].xxxx, IMM[7].wwww + 72: SIN TEMP[52].x, TEMP[51].xxxx + 73: MUL TEMP[53].x, TEMP[52].xxxx, IMM[6].zzzz + 74: FRC TEMP[54].x, TEMP[53].xxxx + 75: LRP TEMP[55].x, TEMP[17].xxxx, TEMP[54].xxxx, TEMP[50].xxxx + 76: LRP TEMP[56].x, TEMP[17].yyyy, TEMP[55].xxxx, TEMP[46].xxxx + 77: LRP TEMP[57].x, TEMP[17].zzzz, TEMP[56].xxxx, TEMP[37].xxxx + 78: MUL TEMP[58].x, IMM[6].yyyy, TEMP[57].xxxx + 79: MUL TEMP[59].xyz, IMM[10].xyzz, TEMP[11].xxxx + 80: MAD TEMP[60].xyz, IMM[9].xyzz, TEMP[11].yyyy, TEMP[59].xyzz + 81: MAD TEMP[61].xyz, IMM[8].xyzz, TEMP[11].zzzz, TEMP[60].xyzz + 82: MUL TEMP[11].xyz, TEMP[61].xyzz, IMM[8].wwww + 83: FLR TEMP[62].xyz, TEMP[11].xyzz + 84: FRC TEMP[63].xyz, TEMP[11].xyzz + 85: MUL TEMP[64].xyz, TEMP[63].xyzz, TEMP[63].xyzz + 86: MUL TEMP[65].xyz, IMM[0].xxxx, TEMP[63].xyzz + 87: ADD TEMP[66].xyz, IMM[5].zzzz, -TEMP[65].xyzz + 88: MUL TEMP[67].xyz, TEMP[64].xyzz, TEMP[66].xyzz + 89: MAD TEMP[68].x, TEMP[62].yyyy, IMM[6].xxxx, TEMP[62].xxxx + 90: MAD TEMP[69].x, IMM[5].wwww, TEMP[62].zzzz, TEMP[68].xxxx + 91: SIN TEMP[70].x, TEMP[69].xxxx + 92: MUL TEMP[71].x, TEMP[70].xxxx, IMM[6].zzzz + 93: FRC TEMP[72].x, TEMP[71].xxxx + 94: ADD TEMP[73].x, TEMP[69].xxxx, IMM[6].wwww + 95: SIN TEMP[74].x, TEMP[73].xxxx + 96: MUL TEMP[75].x, TEMP[74].xxxx, IMM[6].zzzz + 97: FRC TEMP[76].x, TEMP[75].xxxx + 98: LRP TEMP[77].x, TEMP[67].xxxx, TEMP[76].xxxx, TEMP[72].xxxx + 99: ADD TEMP[78].x, TEMP[69].xxxx, IMM[6].xxxx +100: SIN TEMP[79].x, TEMP[78].xxxx +101: MUL TEMP[80].x, TEMP[79].xxxx, IMM[6].zzzz +102: FRC TEMP[81].x, TEMP[80].xxxx +103: ADD TEMP[82].x, TEMP[69].xxxx, IMM[7].xxxx +104: SIN TEMP[83].x, TEMP[82].xxxx +105: MUL TEMP[84].x, TEMP[83].xxxx, IMM[6].zzzz +106: FRC TEMP[85].x, TEMP[84].xxxx +107: LRP TEMP[86].x, TEMP[67].xxxx, TEMP[85].xxxx, TEMP[81].xxxx +108: LRP TEMP[87].x, TEMP[67].yyyy, TEMP[86].xxxx, TEMP[77].xxxx +109: ADD TEMP[88].x, TEMP[69].xxxx, IMM[5].wwww +110: SIN TEMP[89].x, TEMP[88].xxxx +111: MUL TEMP[90].x, TEMP[89].xxxx, IMM[6].zzzz +112: FRC TEMP[91].x, TEMP[90].xxxx +113: ADD TEMP[92].x, TEMP[69].xxxx, IMM[7].yyyy +114: SIN TEMP[93].x, TEMP[92].xxxx +115: MUL TEMP[94].x, TEMP[93].xxxx, IMM[6].zzzz +116: FRC TEMP[95].x, TEMP[94].xxxx +117: LRP TEMP[96].x, TEMP[67].xxxx, TEMP[95].xxxx, TEMP[91].xxxx +118: ADD TEMP[97].x, TEMP[69].xxxx, IMM[7].zzzz +119: SIN TEMP[98].x, TEMP[97].xxxx +120: MUL TEMP[99].x, TEMP[98].xxxx, IMM[6].zzzz +121: FRC TEMP[100].x, TEMP[99].xxxx +122: ADD TEMP[101].x, TEMP[69].xxxx, IMM[7].wwww +123: SIN TEMP[102].x, TEMP[101].xxxx +124: MUL TEMP[103].x, TEMP[102].xxxx, IMM[6].zzzz +125: FRC TEMP[104].x, TEMP[103].xxxx +126: LRP TEMP[105].x, TEMP[67].xxxx, TEMP[104].xxxx, TEMP[100].xxxx +127: LRP TEMP[106].x, TEMP[67].yyyy, TEMP[105].xxxx, TEMP[96].xxxx +128: LRP TEMP[107].x, TEMP[67].zzzz, TEMP[106].xxxx, TEMP[87].xxxx +129: MAD TEMP[58].x, IMM[9].wwww, TEMP[107].xxxx, TEMP[58].xxxx +130: MUL TEMP[108].xyz, IMM[10].xyzz, TEMP[11].xxxx +131: MAD TEMP[109].xyz, IMM[9].xyzz, TEMP[11].yyyy, TEMP[108].xyzz +132: MAD TEMP[110].xyz, IMM[8].xyzz, TEMP[11].zzzz, TEMP[109].xyzz +133: MUL TEMP[11].xyz, TEMP[110].xyzz, IMM[10].wwww +134: FLR TEMP[111].xyz, TEMP[11].xyzz +135: FRC TEMP[112].xyz, TEMP[11].xyzz +136: MUL TEMP[113].xyz, TEMP[112].xyzz, TEMP[112].xyzz +137: MUL TEMP[114].xyz, IMM[0].xxxx, TEMP[112].xyzz +138: ADD TEMP[115].xyz, IMM[5].zzzz, -TEMP[114].xyzz +139: MUL TEMP[116].xyz, TEMP[113].xyzz, TEMP[115].xyzz +140: MAD TEMP[117].x, TEMP[111].yyyy, IMM[6].xxxx, TEMP[111].xxxx +141: MAD TEMP[118].x, IMM[5].wwww, TEMP[111].zzzz, TEMP[117].xxxx +142: SIN TEMP[119].x, TEMP[118].xxxx +143: MUL TEMP[120].x, TEMP[119].xxxx, IMM[6].zzzz +144: FRC TEMP[121].x, TEMP[120].xxxx +145: ADD TEMP[122].x, TEMP[118].xxxx, IMM[6].wwww +146: SIN TEMP[123].x, TEMP[122].xxxx +147: MUL TEMP[124].x, TEMP[123].xxxx, IMM[6].zzzz +148: FRC TEMP[125].x, TEMP[124].xxxx +149: LRP TEMP[126].x, TEMP[116].xxxx, TEMP[125].xxxx, TEMP[121].xxxx +150: ADD TEMP[127].x, TEMP[118].xxxx, IMM[6].xxxx +151: SIN TEMP[128].x, TEMP[127].xxxx +152: MUL TEMP[129].x, TEMP[128].xxxx, IMM[6].zzzz +153: FRC TEMP[130].x, TEMP[129].xxxx +154: ADD TEMP[131].x, TEMP[118].xxxx, IMM[7].xxxx +155: SIN TEMP[132].x, TEMP[131].xxxx +156: MUL TEMP[133].x, TEMP[132].xxxx, IMM[6].zzzz +157: FRC TEMP[134].x, TEMP[133].xxxx +158: LRP TEMP[135].x, TEMP[116].xxxx, TEMP[134].xxxx, TEMP[130].xxxx +159: LRP TEMP[136].x, TEMP[116].yyyy, TEMP[135].xxxx, TEMP[126].xxxx +160: ADD TEMP[137].x, TEMP[118].xxxx, IMM[5].wwww +161: SIN TEMP[138].x, TEMP[137].xxxx +162: MUL TEMP[139].x, TEMP[138].xxxx, IMM[6].zzzz +163: FRC TEMP[140].x, TEMP[139].xxxx +164: ADD TEMP[141].x, TEMP[118].xxxx, IMM[7].yyyy +165: SIN TEMP[142].x, TEMP[141].xxxx +166: MUL TEMP[143].x, TEMP[142].xxxx, IMM[6].zzzz +167: FRC TEMP[144].x, TEMP[143].xxxx +168: LRP TEMP[145].x, TEMP[116].xxxx, TEMP[144].xxxx, TEMP[140].xxxx +169: ADD TEMP[146].x, TEMP[118].xxxx, IMM[7].zzzz +170: SIN TEMP[147].x, TEMP[146].xxxx +171: MUL TEMP[148].x, TEMP[147].xxxx, IMM[6].zzzz +172: FRC TEMP[149].x, TEMP[148].xxxx +173: ADD TEMP[150].x, TEMP[118].xxxx, IMM[7].wwww +174: SIN TEMP[151].x, TEMP[150].xxxx +175: MUL TEMP[152].x, TEMP[151].xxxx, IMM[6].zzzz +176: FRC TEMP[153].x, TEMP[152].xxxx +177: LRP TEMP[154].x, TEMP[116].xxxx, TEMP[153].xxxx, TEMP[149].xxxx +178: LRP TEMP[155].x, TEMP[116].yyyy, TEMP[154].xxxx, TEMP[145].xxxx +179: LRP TEMP[156].x, TEMP[116].zzzz, TEMP[155].xxxx, TEMP[136].xxxx +180: MAD TEMP[58].x, IMM[11].xxxx, TEMP[156].xxxx, TEMP[58].xxxx +181: MUL TEMP[157].xyz, IMM[10].xyzz, TEMP[11].xxxx +182: MAD TEMP[158].xyz, IMM[9].xyzz, TEMP[11].yyyy, TEMP[157].xyzz +183: MAD TEMP[159].xyz, IMM[8].xyzz, TEMP[11].zzzz, TEMP[158].xyzz +184: MUL TEMP[11].xyz, TEMP[159].xyzz, IMM[11].yyyy +185: FLR TEMP[160].xyz, TEMP[11].xyzz +186: FRC TEMP[161].xyz, TEMP[11].xyzz +187: MUL TEMP[162].xyz, TEMP[161].xyzz, TEMP[161].xyzz +188: MUL TEMP[163].xyz, IMM[0].xxxx, TEMP[161].xyzz +189: ADD TEMP[164].xyz, IMM[5].zzzz, -TEMP[163].xyzz +190: MUL TEMP[165].xyz, TEMP[162].xyzz, TEMP[164].xyzz +191: MAD TEMP[166].x, TEMP[160].yyyy, IMM[6].xxxx, TEMP[160].xxxx +192: MAD TEMP[167].x, IMM[5].wwww, TEMP[160].zzzz, TEMP[166].xxxx +193: SIN TEMP[168].x, TEMP[167].xxxx +194: MUL TEMP[169].x, TEMP[168].xxxx, IMM[6].zzzz +195: FRC TEMP[170].x, TEMP[169].xxxx +196: ADD TEMP[171].x, TEMP[167].xxxx, IMM[6].wwww +197: SIN TEMP[172].x, TEMP[171].xxxx +198: MUL TEMP[173].x, TEMP[172].xxxx, IMM[6].zzzz +199: FRC TEMP[174].x, TEMP[173].xxxx +200: LRP TEMP[175].x, TEMP[165].xxxx, TEMP[174].xxxx, TEMP[170].xxxx +201: ADD TEMP[176].x, TEMP[167].xxxx, IMM[6].xxxx +202: SIN TEMP[177].x, TEMP[176].xxxx +203: MUL TEMP[178].x, TEMP[177].xxxx, IMM[6].zzzz +204: FRC TEMP[179].x, TEMP[178].xxxx +205: ADD TEMP[180].x, TEMP[167].xxxx, IMM[7].xxxx +206: SIN TEMP[181].x, TEMP[180].xxxx +207: MUL TEMP[182].x, TEMP[181].xxxx, IMM[6].zzzz +208: FRC TEMP[183].x, TEMP[182].xxxx +209: LRP TEMP[184].x, TEMP[165].xxxx, TEMP[183].xxxx, TEMP[179].xxxx +210: LRP TEMP[185].x, TEMP[165].yyyy, TEMP[184].xxxx, TEMP[175].xxxx +211: ADD TEMP[186].x, TEMP[167].xxxx, IMM[5].wwww +212: SIN TEMP[187].x, TEMP[186].xxxx +213: MUL TEMP[188].x, TEMP[187].xxxx, IMM[6].zzzz +214: FRC TEMP[189].x, TEMP[188].xxxx +215: ADD TEMP[190].x, TEMP[167].xxxx, IMM[7].yyyy +216: SIN TEMP[191].x, TEMP[190].xxxx +217: MUL TEMP[192].x, TEMP[191].xxxx, IMM[6].zzzz +218: FRC TEMP[193].x, TEMP[192].xxxx +219: LRP TEMP[194].x, TEMP[165].xxxx, TEMP[193].xxxx, TEMP[189].xxxx +220: ADD TEMP[195].x, TEMP[167].xxxx, IMM[7].zzzz +221: SIN TEMP[196].x, TEMP[195].xxxx +222: MUL TEMP[197].x, TEMP[196].xxxx, IMM[6].zzzz +223: FRC TEMP[198].x, TEMP[197].xxxx +224: ADD TEMP[199].x, TEMP[167].xxxx, IMM[7].wwww +225: SIN TEMP[200].x, TEMP[199].xxxx +226: MUL TEMP[201].x, TEMP[200].xxxx, IMM[6].zzzz +227: FRC TEMP[202].x, TEMP[201].xxxx +228: LRP TEMP[203].x, TEMP[165].xxxx, TEMP[202].xxxx, TEMP[198].xxxx +229: LRP TEMP[204].x, TEMP[165].yyyy, TEMP[203].xxxx, TEMP[194].xxxx +230: LRP TEMP[205].x, TEMP[165].zzzz, TEMP[204].xxxx, TEMP[185].xxxx +231: MAD TEMP[58].x, IMM[11].zzzz, TEMP[205].xxxx, TEMP[58].xxxx +232: MUL TEMP[206].xyz, IMM[10].xyzz, TEMP[11].xxxx +233: MAD TEMP[207].xyz, IMM[9].xyzz, TEMP[11].yyyy, TEMP[206].xyzz +234: MAD TEMP[208].xyz, IMM[8].xyzz, TEMP[11].zzzz, TEMP[207].xyzz +235: MUL TEMP[11].xyz, TEMP[208].xyzz, IMM[8].wwww +236: FLR TEMP[209].xyz, TEMP[11].xyzz +237: FRC TEMP[210].xyz, TEMP[11].xyzz +238: MUL TEMP[211].xyz, TEMP[210].xyzz, TEMP[210].xyzz +239: MUL TEMP[212].xyz, IMM[0].xxxx, TEMP[210].xyzz +240: ADD TEMP[213].xyz, IMM[5].zzzz, -TEMP[212].xyzz +241: MUL TEMP[214].xyz, TEMP[211].xyzz, TEMP[213].xyzz +242: MAD TEMP[215].x, TEMP[209].yyyy, IMM[6].xxxx, TEMP[209].xxxx +243: MAD TEMP[216].x, IMM[5].wwww, TEMP[209].zzzz, TEMP[215].xxxx +244: SIN TEMP[217].x, TEMP[216].xxxx +245: MUL TEMP[218].x, TEMP[217].xxxx, IMM[6].zzzz +246: FRC TEMP[219].x, TEMP[218].xxxx +247: ADD TEMP[220].x, TEMP[216].xxxx, IMM[6].wwww +248: SIN TEMP[221].x, TEMP[220].xxxx +249: MUL TEMP[222].x, TEMP[221].xxxx, IMM[6].zzzz +250: FRC TEMP[223].x, TEMP[222].xxxx +251: LRP TEMP[224].x, TEMP[214].xxxx, TEMP[223].xxxx, TEMP[219].xxxx +252: ADD TEMP[225].x, TEMP[216].xxxx, IMM[6].xxxx +253: SIN TEMP[226].x, TEMP[225].xxxx +254: MUL TEMP[227].x, TEMP[226].xxxx, IMM[6].zzzz +255: FRC TEMP[228].x, TEMP[227].xxxx +256: ADD TEMP[229].x, TEMP[216].xxxx, IMM[7].xxxx +257: SIN TEMP[230].x, TEMP[229].xxxx +258: MUL TEMP[231].x, TEMP[230].xxxx, IMM[6].zzzz +259: FRC TEMP[232].x, TEMP[231].xxxx +260: LRP TEMP[233].x, TEMP[214].xxxx, TEMP[232].xxxx, TEMP[228].xxxx +261: LRP TEMP[234].x, TEMP[214].yyyy, TEMP[233].xxxx, TEMP[224].xxxx +262: ADD TEMP[235].x, TEMP[216].xxxx, IMM[5].wwww +263: SIN TEMP[236].x, TEMP[235].xxxx +264: MUL TEMP[237].x, TEMP[236].xxxx, IMM[6].zzzz +265: FRC TEMP[238].x, TEMP[237].xxxx +266: ADD TEMP[239].x, TEMP[216].xxxx, IMM[7].yyyy +267: SIN TEMP[240].x, TEMP[239].xxxx +268: MUL TEMP[241].x, TEMP[240].xxxx, IMM[6].zzzz +269: FRC TEMP[242].x, TEMP[241].xxxx +270: LRP TEMP[243].x, TEMP[214].xxxx, TEMP[242].xxxx, TEMP[238].xxxx +271: ADD TEMP[244].x, TEMP[216].xxxx, IMM[7].zzzz +272: SIN TEMP[245].x, TEMP[244].xxxx +273: MUL TEMP[246].x, TEMP[245].xxxx, IMM[6].zzzz +274: FRC TEMP[247].x, TEMP[246].xxxx +275: ADD TEMP[248].x, TEMP[216].xxxx, IMM[7].wwww +276: SIN TEMP[249].x, TEMP[248].xxxx +277: MUL TEMP[250].x, TEMP[249].xxxx, IMM[6].zzzz +278: FRC TEMP[251].x, TEMP[250].xxxx +279: LRP TEMP[252].x, TEMP[214].xxxx, TEMP[251].xxxx, TEMP[247].xxxx +280: LRP TEMP[253].x, TEMP[214].yyyy, TEMP[252].xxxx, TEMP[243].xxxx +281: LRP TEMP[254].x, TEMP[214].zzzz, TEMP[253].xxxx, TEMP[234].xxxx +282: ABS TEMP[255].x, TEMP[254].xxxx +283: MAD TEMP[58].x, IMM[11].wwww, TEMP[255].xxxx, TEMP[58].xxxx +284: MUL TEMP[256].x, TEMP[58].xxxx, IMM[12].xxxx +285: MAD TEMP[9].x, TEMP[256].xxxx, IMM[12].yyyy, TEMP[9].xxxx +286: FSLT TEMP[257].x, TEMP[9].xxxx, IMM[12].zzzz +287: UIF TEMP[257].xxxx :2 +288: MOV TEMP[3].x, IMM[3].yyyy +289: MOV TEMP[4].x, TEMP[256].xxxx +290: ENDIF +291: MUL TEMP[258].xyz, TEMP[1].xyzz, TEMP[9].xxxx +292: MAD TEMP[2].xyz, TEMP[258].xyzz, IMM[12].wwww, TEMP[2].xyzz +293: UADD TEMP[5].x, TEMP[5].xxxx, IMM[4].zzzz +294: ENDLOOP :2 +295: MOV TEMP[1], IMM[13].xxxy +296: UIF TEMP[3].xxxx :2 +297: MAD TEMP[3].x, TEMP[4].xxxx, IMM[13].zzzz, IMM[13].wwww +298: MIN TEMP[3].x, TEMP[3].xxxx, IMM[14].xxxx +299: MOV_SAT TEMP[3].x, TEMP[3].xxxx +300: MUL TEMP[4].x, TEMP[3].xxxx, IMM[5].zzzz +301: FRC TEMP[4].x, TEMP[4].xxxx +302: FSLT TEMP[5].x, TEMP[3].xxxx, IMM[14].yyyy +303: UIF TEMP[5].xxxx :2 +304: LRP TEMP[5], TEMP[4].xxxx, IMM[15].xyzx, IMM[14].zzww +305: ELSE :2 +306: FSLT TEMP[6].x, TEMP[3].xxxx, IMM[15].wwww +307: UIF TEMP[6].xxxx :2 +308: LRP TEMP[5], TEMP[4].xxxx, IMM[15].xzzx, IMM[15].xyzx +309: ELSE :2 +310: LRP TEMP[5], TEMP[4].xxxx, IMM[16].xxxy, IMM[15].xzzx +311: ENDIF +312: ENDIF +313: MOV TEMP[4].w, TEMP[5].wwww +314: DP3 TEMP[6].x, TEMP[2].xyzz, TEMP[2].xyzz +315: RSQ TEMP[7].x, TEMP[6].xxxx +316: MUL TEMP[7].x, TEMP[7].xxxx, TEMP[6].xxxx +317: CMP TEMP[7].x, -TEMP[6].xxxx, TEMP[7].xxxx, IMM[0].zzzz +318: ADD TEMP[6].x, TEMP[7].xxxx, IMM[2].zzzz +319: MUL TEMP[7].xyz, TEMP[2].xyzz, IMM[2].wwww +320: MAD TEMP[7].xyz, IMM[5].xyyy, CONST[1].xxxx, TEMP[7].xyzz +321: FLR TEMP[8].xyz, TEMP[7].xyzz +322: FRC TEMP[9].xyz, TEMP[7].xyzz +323: MUL TEMP[10].xyz, TEMP[9].xyzz, TEMP[9].xyzz +324: MUL TEMP[9].xyz, IMM[0].xxxx, TEMP[9].xyzz +325: ADD TEMP[9].xyz, IMM[5].zzzz, -TEMP[9].xyzz +326: MUL TEMP[9].xyz, TEMP[10].xyzz, TEMP[9].xyzz +327: MAD TEMP[10].x, TEMP[8].yyyy, IMM[6].xxxx, TEMP[8].xxxx +328: MAD TEMP[8].x, IMM[5].wwww, TEMP[8].zzzz, TEMP[10].xxxx +329: SIN TEMP[10].x, TEMP[8].xxxx +330: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +331: FRC TEMP[10].x, TEMP[10].xxxx +332: ADD TEMP[11].x, TEMP[8].xxxx, IMM[6].wwww +333: SIN TEMP[11].x, TEMP[11].xxxx +334: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +335: FRC TEMP[11].x, TEMP[11].xxxx +336: LRP TEMP[10].x, TEMP[9].xxxx, TEMP[11].xxxx, TEMP[10].xxxx +337: ADD TEMP[11].x, TEMP[8].xxxx, IMM[6].xxxx +338: SIN TEMP[11].x, TEMP[11].xxxx +339: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +340: FRC TEMP[11].x, TEMP[11].xxxx +341: ADD TEMP[12].x, TEMP[8].xxxx, IMM[7].xxxx +342: SIN TEMP[12].x, TEMP[12].xxxx +343: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +344: FRC TEMP[12].x, TEMP[12].xxxx +345: LRP TEMP[11].x, TEMP[9].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +346: LRP TEMP[10].x, TEMP[9].yyyy, TEMP[11].xxxx, TEMP[10].xxxx +347: ADD TEMP[11].x, TEMP[8].xxxx, IMM[5].wwww +348: SIN TEMP[11].x, TEMP[11].xxxx +349: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +350: FRC TEMP[11].x, TEMP[11].xxxx +351: ADD TEMP[12].x, TEMP[8].xxxx, IMM[7].yyyy +352: SIN TEMP[12].x, TEMP[12].xxxx +353: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +354: FRC TEMP[12].x, TEMP[12].xxxx +355: LRP TEMP[11].x, TEMP[9].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +356: ADD TEMP[12].x, TEMP[8].xxxx, IMM[7].zzzz +357: SIN TEMP[12].x, TEMP[12].xxxx +358: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +359: FRC TEMP[12].x, TEMP[12].xxxx +360: ADD TEMP[8].x, TEMP[8].xxxx, IMM[7].wwww +361: SIN TEMP[8].x, TEMP[8].xxxx +362: MUL TEMP[8].x, TEMP[8].xxxx, IMM[6].zzzz +363: FRC TEMP[8].x, TEMP[8].xxxx +364: LRP TEMP[8].x, TEMP[9].xxxx, TEMP[8].xxxx, TEMP[12].xxxx +365: LRP TEMP[8].x, TEMP[9].yyyy, TEMP[8].xxxx, TEMP[11].xxxx +366: LRP TEMP[8].x, TEMP[9].zzzz, TEMP[8].xxxx, TEMP[10].xxxx +367: MUL TEMP[8].x, IMM[6].yyyy, TEMP[8].xxxx +368: MUL TEMP[9].xyz, IMM[10].xyzz, TEMP[7].xxxx +369: MAD TEMP[9].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[9].xyzz +370: MAD TEMP[9].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[9].xyzz +371: MUL TEMP[7].xyz, TEMP[9].xyzz, IMM[8].wwww +372: FLR TEMP[9].xyz, TEMP[7].xyzz +373: FRC TEMP[10].xyz, TEMP[7].xyzz +374: MUL TEMP[11].xyz, TEMP[10].xyzz, TEMP[10].xyzz +375: MUL TEMP[10].xyz, IMM[0].xxxx, TEMP[10].xyzz +376: ADD TEMP[10].xyz, IMM[5].zzzz, -TEMP[10].xyzz +377: MUL TEMP[10].xyz, TEMP[11].xyzz, TEMP[10].xyzz +378: MAD TEMP[11].x, TEMP[9].yyyy, IMM[6].xxxx, TEMP[9].xxxx +379: MAD TEMP[9].x, IMM[5].wwww, TEMP[9].zzzz, TEMP[11].xxxx +380: SIN TEMP[11].x, TEMP[9].xxxx +381: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +382: FRC TEMP[11].x, TEMP[11].xxxx +383: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].wwww +384: SIN TEMP[12].x, TEMP[12].xxxx +385: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +386: FRC TEMP[12].x, TEMP[12].xxxx +387: LRP TEMP[11].x, TEMP[10].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +388: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].xxxx +389: SIN TEMP[12].x, TEMP[12].xxxx +390: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +391: FRC TEMP[12].x, TEMP[12].xxxx +392: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].xxxx +393: SIN TEMP[13].x, TEMP[13].xxxx +394: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +395: FRC TEMP[13].x, TEMP[13].xxxx +396: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +397: LRP TEMP[11].x, TEMP[10].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +398: ADD TEMP[12].x, TEMP[9].xxxx, IMM[5].wwww +399: SIN TEMP[12].x, TEMP[12].xxxx +400: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +401: FRC TEMP[12].x, TEMP[12].xxxx +402: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].yyyy +403: SIN TEMP[13].x, TEMP[13].xxxx +404: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +405: FRC TEMP[13].x, TEMP[13].xxxx +406: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +407: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].zzzz +408: SIN TEMP[13].x, TEMP[13].xxxx +409: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +410: FRC TEMP[13].x, TEMP[13].xxxx +411: ADD TEMP[9].x, TEMP[9].xxxx, IMM[7].wwww +412: SIN TEMP[9].x, TEMP[9].xxxx +413: MUL TEMP[9].x, TEMP[9].xxxx, IMM[6].zzzz +414: FRC TEMP[9].x, TEMP[9].xxxx +415: LRP TEMP[9].x, TEMP[10].xxxx, TEMP[9].xxxx, TEMP[13].xxxx +416: LRP TEMP[9].x, TEMP[10].yyyy, TEMP[9].xxxx, TEMP[12].xxxx +417: LRP TEMP[9].x, TEMP[10].zzzz, TEMP[9].xxxx, TEMP[11].xxxx +418: MAD TEMP[8].x, IMM[9].wwww, TEMP[9].xxxx, TEMP[8].xxxx +419: MUL TEMP[9].xyz, IMM[10].xyzz, TEMP[7].xxxx +420: MAD TEMP[9].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[9].xyzz +421: MAD TEMP[9].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[9].xyzz +422: MUL TEMP[7].xyz, TEMP[9].xyzz, IMM[10].wwww +423: FLR TEMP[9].xyz, TEMP[7].xyzz +424: FRC TEMP[10].xyz, TEMP[7].xyzz +425: MUL TEMP[11].xyz, TEMP[10].xyzz, TEMP[10].xyzz +426: MUL TEMP[10].xyz, IMM[0].xxxx, TEMP[10].xyzz +427: ADD TEMP[10].xyz, IMM[5].zzzz, -TEMP[10].xyzz +428: MUL TEMP[10].xyz, TEMP[11].xyzz, TEMP[10].xyzz +429: MAD TEMP[11].x, TEMP[9].yyyy, IMM[6].xxxx, TEMP[9].xxxx +430: MAD TEMP[9].x, IMM[5].wwww, TEMP[9].zzzz, TEMP[11].xxxx +431: SIN TEMP[11].x, TEMP[9].xxxx +432: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +433: FRC TEMP[11].x, TEMP[11].xxxx +434: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].wwww +435: SIN TEMP[12].x, TEMP[12].xxxx +436: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +437: FRC TEMP[12].x, TEMP[12].xxxx +438: LRP TEMP[11].x, TEMP[10].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +439: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].xxxx +440: SIN TEMP[12].x, TEMP[12].xxxx +441: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +442: FRC TEMP[12].x, TEMP[12].xxxx +443: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].xxxx +444: SIN TEMP[13].x, TEMP[13].xxxx +445: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +446: FRC TEMP[13].x, TEMP[13].xxxx +447: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +448: LRP TEMP[11].x, TEMP[10].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +449: ADD TEMP[12].x, TEMP[9].xxxx, IMM[5].wwww +450: SIN TEMP[12].x, TEMP[12].xxxx +451: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +452: FRC TEMP[12].x, TEMP[12].xxxx +453: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].yyyy +454: SIN TEMP[13].x, TEMP[13].xxxx +455: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +456: FRC TEMP[13].x, TEMP[13].xxxx +457: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +458: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].zzzz +459: SIN TEMP[13].x, TEMP[13].xxxx +460: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +461: FRC TEMP[13].x, TEMP[13].xxxx +462: ADD TEMP[9].x, TEMP[9].xxxx, IMM[7].wwww +463: SIN TEMP[9].x, TEMP[9].xxxx +464: MUL TEMP[9].x, TEMP[9].xxxx, IMM[6].zzzz +465: FRC TEMP[9].x, TEMP[9].xxxx +466: LRP TEMP[9].x, TEMP[10].xxxx, TEMP[9].xxxx, TEMP[13].xxxx +467: LRP TEMP[9].x, TEMP[10].yyyy, TEMP[9].xxxx, TEMP[12].xxxx +468: LRP TEMP[9].x, TEMP[10].zzzz, TEMP[9].xxxx, TEMP[11].xxxx +469: MAD TEMP[8].x, IMM[11].xxxx, TEMP[9].xxxx, TEMP[8].xxxx +470: MUL TEMP[9].xyz, IMM[10].xyzz, TEMP[7].xxxx +471: MAD TEMP[9].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[9].xyzz +472: MAD TEMP[9].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[9].xyzz +473: MUL TEMP[7].xyz, TEMP[9].xyzz, IMM[11].yyyy +474: FLR TEMP[9].xyz, TEMP[7].xyzz +475: FRC TEMP[10].xyz, TEMP[7].xyzz +476: MUL TEMP[11].xyz, TEMP[10].xyzz, TEMP[10].xyzz +477: MUL TEMP[10].xyz, IMM[0].xxxx, TEMP[10].xyzz +478: ADD TEMP[10].xyz, IMM[5].zzzz, -TEMP[10].xyzz +479: MUL TEMP[10].xyz, TEMP[11].xyzz, TEMP[10].xyzz +480: MAD TEMP[11].x, TEMP[9].yyyy, IMM[6].xxxx, TEMP[9].xxxx +481: MAD TEMP[9].x, IMM[5].wwww, TEMP[9].zzzz, TEMP[11].xxxx +482: SIN TEMP[11].x, TEMP[9].xxxx +483: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +484: FRC TEMP[11].x, TEMP[11].xxxx +485: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].wwww +486: SIN TEMP[12].x, TEMP[12].xxxx +487: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +488: FRC TEMP[12].x, TEMP[12].xxxx +489: LRP TEMP[11].x, TEMP[10].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +490: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].xxxx +491: SIN TEMP[12].x, TEMP[12].xxxx +492: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +493: FRC TEMP[12].x, TEMP[12].xxxx +494: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].xxxx +495: SIN TEMP[13].x, TEMP[13].xxxx +496: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +497: FRC TEMP[13].x, TEMP[13].xxxx +498: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +499: LRP TEMP[11].x, TEMP[10].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +500: ADD TEMP[12].x, TEMP[9].xxxx, IMM[5].wwww +501: SIN TEMP[12].x, TEMP[12].xxxx +502: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +503: FRC TEMP[12].x, TEMP[12].xxxx +504: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].yyyy +505: SIN TEMP[13].x, TEMP[13].xxxx +506: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +507: FRC TEMP[13].x, TEMP[13].xxxx +508: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +509: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].zzzz +510: SIN TEMP[13].x, TEMP[13].xxxx +511: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +512: FRC TEMP[13].x, TEMP[13].xxxx +513: ADD TEMP[9].x, TEMP[9].xxxx, IMM[7].wwww +514: SIN TEMP[9].x, TEMP[9].xxxx +515: MUL TEMP[9].x, TEMP[9].xxxx, IMM[6].zzzz +516: FRC TEMP[9].x, TEMP[9].xxxx +517: LRP TEMP[9].x, TEMP[10].xxxx, TEMP[9].xxxx, TEMP[13].xxxx +518: LRP TEMP[9].x, TEMP[10].yyyy, TEMP[9].xxxx, TEMP[12].xxxx +519: LRP TEMP[9].x, TEMP[10].zzzz, TEMP[9].xxxx, TEMP[11].xxxx +520: MAD TEMP[8].x, IMM[11].zzzz, TEMP[9].xxxx, TEMP[8].xxxx +521: MUL TEMP[9].xyz, IMM[10].xyzz, TEMP[7].xxxx +522: MAD TEMP[9].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[9].xyzz +523: MAD TEMP[9].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[9].xyzz +524: MUL TEMP[7].xyz, TEMP[9].xyzz, IMM[8].wwww +525: FLR TEMP[9].xyz, TEMP[7].xyzz +526: FRC TEMP[7].xyz, TEMP[7].xyzz +527: MUL TEMP[10].xyz, TEMP[7].xyzz, TEMP[7].xyzz +528: MUL TEMP[7].xyz, IMM[0].xxxx, TEMP[7].xyzz +529: ADD TEMP[7].xyz, IMM[5].zzzz, -TEMP[7].xyzz +530: MUL TEMP[7].xyz, TEMP[10].xyzz, TEMP[7].xyzz +531: MAD TEMP[10].x, TEMP[9].yyyy, IMM[6].xxxx, TEMP[9].xxxx +532: MAD TEMP[9].x, IMM[5].wwww, TEMP[9].zzzz, TEMP[10].xxxx +533: SIN TEMP[10].x, TEMP[9].xxxx +534: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +535: FRC TEMP[10].x, TEMP[10].xxxx +536: ADD TEMP[11].x, TEMP[9].xxxx, IMM[6].wwww +537: SIN TEMP[11].x, TEMP[11].xxxx +538: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +539: FRC TEMP[11].x, TEMP[11].xxxx +540: LRP TEMP[10].x, TEMP[7].xxxx, TEMP[11].xxxx, TEMP[10].xxxx +541: ADD TEMP[11].x, TEMP[9].xxxx, IMM[6].xxxx +542: SIN TEMP[11].x, TEMP[11].xxxx +543: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +544: FRC TEMP[11].x, TEMP[11].xxxx +545: ADD TEMP[12].x, TEMP[9].xxxx, IMM[7].xxxx +546: SIN TEMP[12].x, TEMP[12].xxxx +547: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +548: FRC TEMP[12].x, TEMP[12].xxxx +549: LRP TEMP[11].x, TEMP[7].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +550: LRP TEMP[10].x, TEMP[7].yyyy, TEMP[11].xxxx, TEMP[10].xxxx +551: ADD TEMP[11].x, TEMP[9].xxxx, IMM[5].wwww +552: SIN TEMP[11].x, TEMP[11].xxxx +553: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +554: FRC TEMP[11].x, TEMP[11].xxxx +555: ADD TEMP[12].x, TEMP[9].xxxx, IMM[7].yyyy +556: SIN TEMP[12].x, TEMP[12].xxxx +557: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +558: FRC TEMP[12].x, TEMP[12].xxxx +559: LRP TEMP[11].x, TEMP[7].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +560: ADD TEMP[12].x, TEMP[9].xxxx, IMM[7].zzzz +561: SIN TEMP[12].x, TEMP[12].xxxx +562: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +563: FRC TEMP[12].x, TEMP[12].xxxx +564: ADD TEMP[9].x, TEMP[9].xxxx, IMM[7].wwww +565: SIN TEMP[9].x, TEMP[9].xxxx +566: MUL TEMP[9].x, TEMP[9].xxxx, IMM[6].zzzz +567: FRC TEMP[9].x, TEMP[9].xxxx +568: LRP TEMP[9].x, TEMP[7].xxxx, TEMP[9].xxxx, TEMP[12].xxxx +569: LRP TEMP[9].x, TEMP[7].yyyy, TEMP[9].xxxx, TEMP[11].xxxx +570: LRP TEMP[7].x, TEMP[7].zzzz, TEMP[9].xxxx, TEMP[10].xxxx +571: ABS TEMP[7].x, TEMP[7].xxxx +572: MAD TEMP[8].x, IMM[11].wwww, TEMP[7].xxxx, TEMP[8].xxxx +573: MAD TEMP[6].x, IMM[16].zzzz, TEMP[8].xxxx, TEMP[6].xxxx +574: ADD TEMP[7].x, TEMP[2].xxxx, IMM[16].wwww +575: MOV TEMP[7].y, TEMP[2].yyyy +576: MOV TEMP[7].z, TEMP[2].zzzz +577: DP3 TEMP[8].x, TEMP[7].xyzz, TEMP[7].xyzz +578: RSQ TEMP[9].x, TEMP[8].xxxx +579: MUL TEMP[9].x, TEMP[9].xxxx, TEMP[8].xxxx +580: CMP TEMP[9].x, -TEMP[8].xxxx, TEMP[9].xxxx, IMM[0].zzzz +581: ADD TEMP[8].x, TEMP[9].xxxx, IMM[2].zzzz +582: MUL TEMP[7].xyz, TEMP[7].xyzz, IMM[2].wwww +583: MAD TEMP[7].xyz, IMM[5].xyyy, CONST[1].xxxx, TEMP[7].xyzz +584: FLR TEMP[9].xyz, TEMP[7].xyzz +585: FRC TEMP[10].xyz, TEMP[7].xyzz +586: MUL TEMP[11].xyz, TEMP[10].xyzz, TEMP[10].xyzz +587: MUL TEMP[10].xyz, IMM[0].xxxx, TEMP[10].xyzz +588: ADD TEMP[10].xyz, IMM[5].zzzz, -TEMP[10].xyzz +589: MUL TEMP[10].xyz, TEMP[11].xyzz, TEMP[10].xyzz +590: MAD TEMP[11].x, TEMP[9].yyyy, IMM[6].xxxx, TEMP[9].xxxx +591: MAD TEMP[9].x, IMM[5].wwww, TEMP[9].zzzz, TEMP[11].xxxx +592: SIN TEMP[11].x, TEMP[9].xxxx +593: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +594: FRC TEMP[11].x, TEMP[11].xxxx +595: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].wwww +596: SIN TEMP[12].x, TEMP[12].xxxx +597: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +598: FRC TEMP[12].x, TEMP[12].xxxx +599: LRP TEMP[11].x, TEMP[10].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +600: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].xxxx +601: SIN TEMP[12].x, TEMP[12].xxxx +602: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +603: FRC TEMP[12].x, TEMP[12].xxxx +604: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].xxxx +605: SIN TEMP[13].x, TEMP[13].xxxx +606: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +607: FRC TEMP[13].x, TEMP[13].xxxx +608: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +609: LRP TEMP[11].x, TEMP[10].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +610: ADD TEMP[12].x, TEMP[9].xxxx, IMM[5].wwww +611: SIN TEMP[12].x, TEMP[12].xxxx +612: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +613: FRC TEMP[12].x, TEMP[12].xxxx +614: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].yyyy +615: SIN TEMP[13].x, TEMP[13].xxxx +616: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +617: FRC TEMP[13].x, TEMP[13].xxxx +618: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +619: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].zzzz +620: SIN TEMP[13].x, TEMP[13].xxxx +621: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +622: FRC TEMP[13].x, TEMP[13].xxxx +623: ADD TEMP[9].x, TEMP[9].xxxx, IMM[7].wwww +624: SIN TEMP[9].x, TEMP[9].xxxx +625: MUL TEMP[9].x, TEMP[9].xxxx, IMM[6].zzzz +626: FRC TEMP[9].x, TEMP[9].xxxx +627: LRP TEMP[9].x, TEMP[10].xxxx, TEMP[9].xxxx, TEMP[13].xxxx +628: LRP TEMP[9].x, TEMP[10].yyyy, TEMP[9].xxxx, TEMP[12].xxxx +629: LRP TEMP[9].x, TEMP[10].zzzz, TEMP[9].xxxx, TEMP[11].xxxx +630: MUL TEMP[9].x, IMM[6].yyyy, TEMP[9].xxxx +631: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[7].xxxx +632: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[10].xyzz +633: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[10].xyzz +634: MUL TEMP[7].xyz, TEMP[10].xyzz, IMM[8].wwww +635: FLR TEMP[10].xyz, TEMP[7].xyzz +636: FRC TEMP[11].xyz, TEMP[7].xyzz +637: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +638: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +639: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +640: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +641: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +642: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +643: SIN TEMP[12].x, TEMP[10].xxxx +644: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +645: FRC TEMP[12].x, TEMP[12].xxxx +646: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +647: SIN TEMP[13].x, TEMP[13].xxxx +648: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +649: FRC TEMP[13].x, TEMP[13].xxxx +650: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +651: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +652: SIN TEMP[13].x, TEMP[13].xxxx +653: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +654: FRC TEMP[13].x, TEMP[13].xxxx +655: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +656: SIN TEMP[14].x, TEMP[14].xxxx +657: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +658: FRC TEMP[14].x, TEMP[14].xxxx +659: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +660: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +661: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +662: SIN TEMP[13].x, TEMP[13].xxxx +663: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +664: FRC TEMP[13].x, TEMP[13].xxxx +665: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +666: SIN TEMP[14].x, TEMP[14].xxxx +667: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +668: FRC TEMP[14].x, TEMP[14].xxxx +669: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +670: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +671: SIN TEMP[14].x, TEMP[14].xxxx +672: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +673: FRC TEMP[14].x, TEMP[14].xxxx +674: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +675: SIN TEMP[10].x, TEMP[10].xxxx +676: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +677: FRC TEMP[10].x, TEMP[10].xxxx +678: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +679: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +680: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +681: MAD TEMP[9].x, IMM[9].wwww, TEMP[10].xxxx, TEMP[9].xxxx +682: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[7].xxxx +683: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[10].xyzz +684: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[10].xyzz +685: MUL TEMP[7].xyz, TEMP[10].xyzz, IMM[10].wwww +686: FLR TEMP[10].xyz, TEMP[7].xyzz +687: FRC TEMP[11].xyz, TEMP[7].xyzz +688: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +689: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +690: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +691: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +692: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +693: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +694: SIN TEMP[12].x, TEMP[10].xxxx +695: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +696: FRC TEMP[12].x, TEMP[12].xxxx +697: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +698: SIN TEMP[13].x, TEMP[13].xxxx +699: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +700: FRC TEMP[13].x, TEMP[13].xxxx +701: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +702: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +703: SIN TEMP[13].x, TEMP[13].xxxx +704: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +705: FRC TEMP[13].x, TEMP[13].xxxx +706: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +707: SIN TEMP[14].x, TEMP[14].xxxx +708: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +709: FRC TEMP[14].x, TEMP[14].xxxx +710: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +711: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +712: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +713: SIN TEMP[13].x, TEMP[13].xxxx +714: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +715: FRC TEMP[13].x, TEMP[13].xxxx +716: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +717: SIN TEMP[14].x, TEMP[14].xxxx +718: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +719: FRC TEMP[14].x, TEMP[14].xxxx +720: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +721: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +722: SIN TEMP[14].x, TEMP[14].xxxx +723: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +724: FRC TEMP[14].x, TEMP[14].xxxx +725: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +726: SIN TEMP[10].x, TEMP[10].xxxx +727: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +728: FRC TEMP[10].x, TEMP[10].xxxx +729: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +730: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +731: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +732: MAD TEMP[9].x, IMM[11].xxxx, TEMP[10].xxxx, TEMP[9].xxxx +733: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[7].xxxx +734: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[10].xyzz +735: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[10].xyzz +736: MUL TEMP[7].xyz, TEMP[10].xyzz, IMM[11].yyyy +737: FLR TEMP[10].xyz, TEMP[7].xyzz +738: FRC TEMP[11].xyz, TEMP[7].xyzz +739: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +740: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +741: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +742: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +743: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +744: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +745: SIN TEMP[12].x, TEMP[10].xxxx +746: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +747: FRC TEMP[12].x, TEMP[12].xxxx +748: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +749: SIN TEMP[13].x, TEMP[13].xxxx +750: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +751: FRC TEMP[13].x, TEMP[13].xxxx +752: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +753: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +754: SIN TEMP[13].x, TEMP[13].xxxx +755: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +756: FRC TEMP[13].x, TEMP[13].xxxx +757: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +758: SIN TEMP[14].x, TEMP[14].xxxx +759: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +760: FRC TEMP[14].x, TEMP[14].xxxx +761: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +762: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +763: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +764: SIN TEMP[13].x, TEMP[13].xxxx +765: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +766: FRC TEMP[13].x, TEMP[13].xxxx +767: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +768: SIN TEMP[14].x, TEMP[14].xxxx +769: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +770: FRC TEMP[14].x, TEMP[14].xxxx +771: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +772: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +773: SIN TEMP[14].x, TEMP[14].xxxx +774: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +775: FRC TEMP[14].x, TEMP[14].xxxx +776: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +777: SIN TEMP[10].x, TEMP[10].xxxx +778: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +779: FRC TEMP[10].x, TEMP[10].xxxx +780: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +781: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +782: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +783: MAD TEMP[9].x, IMM[11].zzzz, TEMP[10].xxxx, TEMP[9].xxxx +784: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[7].xxxx +785: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[7].yyyy, TEMP[10].xyzz +786: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[7].zzzz, TEMP[10].xyzz +787: MUL TEMP[7].xyz, TEMP[10].xyzz, IMM[8].wwww +788: FLR TEMP[10].xyz, TEMP[7].xyzz +789: FRC TEMP[7].xyz, TEMP[7].xyzz +790: MUL TEMP[11].xyz, TEMP[7].xyzz, TEMP[7].xyzz +791: MUL TEMP[7].xyz, IMM[0].xxxx, TEMP[7].xyzz +792: ADD TEMP[7].xyz, IMM[5].zzzz, -TEMP[7].xyzz +793: MUL TEMP[7].xyz, TEMP[11].xyzz, TEMP[7].xyzz +794: MAD TEMP[11].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +795: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[11].xxxx +796: SIN TEMP[11].x, TEMP[10].xxxx +797: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +798: FRC TEMP[11].x, TEMP[11].xxxx +799: ADD TEMP[12].x, TEMP[10].xxxx, IMM[6].wwww +800: SIN TEMP[12].x, TEMP[12].xxxx +801: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +802: FRC TEMP[12].x, TEMP[12].xxxx +803: LRP TEMP[11].x, TEMP[7].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +804: ADD TEMP[12].x, TEMP[10].xxxx, IMM[6].xxxx +805: SIN TEMP[12].x, TEMP[12].xxxx +806: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +807: FRC TEMP[12].x, TEMP[12].xxxx +808: ADD TEMP[13].x, TEMP[10].xxxx, IMM[7].xxxx +809: SIN TEMP[13].x, TEMP[13].xxxx +810: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +811: FRC TEMP[13].x, TEMP[13].xxxx +812: LRP TEMP[12].x, TEMP[7].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +813: LRP TEMP[11].x, TEMP[7].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +814: ADD TEMP[12].x, TEMP[10].xxxx, IMM[5].wwww +815: SIN TEMP[12].x, TEMP[12].xxxx +816: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +817: FRC TEMP[12].x, TEMP[12].xxxx +818: ADD TEMP[13].x, TEMP[10].xxxx, IMM[7].yyyy +819: SIN TEMP[13].x, TEMP[13].xxxx +820: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +821: FRC TEMP[13].x, TEMP[13].xxxx +822: LRP TEMP[12].x, TEMP[7].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +823: ADD TEMP[13].x, TEMP[10].xxxx, IMM[7].zzzz +824: SIN TEMP[13].x, TEMP[13].xxxx +825: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +826: FRC TEMP[13].x, TEMP[13].xxxx +827: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +828: SIN TEMP[10].x, TEMP[10].xxxx +829: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +830: FRC TEMP[10].x, TEMP[10].xxxx +831: LRP TEMP[10].x, TEMP[7].xxxx, TEMP[10].xxxx, TEMP[13].xxxx +832: LRP TEMP[10].x, TEMP[7].yyyy, TEMP[10].xxxx, TEMP[12].xxxx +833: LRP TEMP[7].x, TEMP[7].zzzz, TEMP[10].xxxx, TEMP[11].xxxx +834: ABS TEMP[7].x, TEMP[7].xxxx +835: MAD TEMP[9].x, IMM[11].wwww, TEMP[7].xxxx, TEMP[9].xxxx +836: MAD TEMP[8].x, IMM[16].zzzz, TEMP[9].xxxx, TEMP[8].xxxx +837: ADD TEMP[7].x, TEMP[8].xxxx, -TEMP[6].xxxx +838: MOV TEMP[8].x, TEMP[2].xxxx +839: ADD TEMP[9].x, TEMP[2].yyyy, IMM[16].wwww +840: MOV TEMP[8].y, TEMP[9].xxxx +841: MOV TEMP[8].z, TEMP[2].zzzz +842: DP3 TEMP[9].x, TEMP[8].xyzz, TEMP[8].xyzz +843: RSQ TEMP[10].x, TEMP[9].xxxx +844: MUL TEMP[10].x, TEMP[10].xxxx, TEMP[9].xxxx +845: CMP TEMP[10].x, -TEMP[9].xxxx, TEMP[10].xxxx, IMM[0].zzzz +846: ADD TEMP[9].x, TEMP[10].xxxx, IMM[2].zzzz +847: MUL TEMP[8].xyz, TEMP[8].xyzz, IMM[2].wwww +848: MAD TEMP[8].xyz, IMM[5].xyyy, CONST[1].xxxx, TEMP[8].xyzz +849: FLR TEMP[10].xyz, TEMP[8].xyzz +850: FRC TEMP[11].xyz, TEMP[8].xyzz +851: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +852: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +853: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +854: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +855: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +856: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +857: SIN TEMP[12].x, TEMP[10].xxxx +858: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +859: FRC TEMP[12].x, TEMP[12].xxxx +860: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +861: SIN TEMP[13].x, TEMP[13].xxxx +862: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +863: FRC TEMP[13].x, TEMP[13].xxxx +864: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +865: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +866: SIN TEMP[13].x, TEMP[13].xxxx +867: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +868: FRC TEMP[13].x, TEMP[13].xxxx +869: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +870: SIN TEMP[14].x, TEMP[14].xxxx +871: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +872: FRC TEMP[14].x, TEMP[14].xxxx +873: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +874: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +875: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +876: SIN TEMP[13].x, TEMP[13].xxxx +877: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +878: FRC TEMP[13].x, TEMP[13].xxxx +879: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +880: SIN TEMP[14].x, TEMP[14].xxxx +881: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +882: FRC TEMP[14].x, TEMP[14].xxxx +883: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +884: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +885: SIN TEMP[14].x, TEMP[14].xxxx +886: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +887: FRC TEMP[14].x, TEMP[14].xxxx +888: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +889: SIN TEMP[10].x, TEMP[10].xxxx +890: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +891: FRC TEMP[10].x, TEMP[10].xxxx +892: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +893: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +894: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +895: MUL TEMP[10].x, IMM[6].yyyy, TEMP[10].xxxx +896: MUL TEMP[11].xyz, IMM[10].xyzz, TEMP[8].xxxx +897: MAD TEMP[11].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[11].xyzz +898: MAD TEMP[11].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[11].xyzz +899: MUL TEMP[8].xyz, TEMP[11].xyzz, IMM[8].wwww +900: FLR TEMP[11].xyz, TEMP[8].xyzz +901: FRC TEMP[12].xyz, TEMP[8].xyzz +902: MUL TEMP[13].xyz, TEMP[12].xyzz, TEMP[12].xyzz +903: MUL TEMP[12].xyz, IMM[0].xxxx, TEMP[12].xyzz +904: ADD TEMP[12].xyz, IMM[5].zzzz, -TEMP[12].xyzz +905: MUL TEMP[12].xyz, TEMP[13].xyzz, TEMP[12].xyzz +906: MAD TEMP[13].x, TEMP[11].yyyy, IMM[6].xxxx, TEMP[11].xxxx +907: MAD TEMP[11].x, IMM[5].wwww, TEMP[11].zzzz, TEMP[13].xxxx +908: SIN TEMP[13].x, TEMP[11].xxxx +909: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +910: FRC TEMP[13].x, TEMP[13].xxxx +911: ADD TEMP[14].x, TEMP[11].xxxx, IMM[6].wwww +912: SIN TEMP[14].x, TEMP[14].xxxx +913: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +914: FRC TEMP[14].x, TEMP[14].xxxx +915: LRP TEMP[13].x, TEMP[12].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +916: ADD TEMP[14].x, TEMP[11].xxxx, IMM[6].xxxx +917: SIN TEMP[14].x, TEMP[14].xxxx +918: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +919: FRC TEMP[14].x, TEMP[14].xxxx +920: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].xxxx +921: SIN TEMP[15].x, TEMP[15].xxxx +922: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +923: FRC TEMP[15].x, TEMP[15].xxxx +924: LRP TEMP[14].x, TEMP[12].xxxx, TEMP[15].xxxx, TEMP[14].xxxx +925: LRP TEMP[13].x, TEMP[12].yyyy, TEMP[14].xxxx, TEMP[13].xxxx +926: ADD TEMP[14].x, TEMP[11].xxxx, IMM[5].wwww +927: SIN TEMP[14].x, TEMP[14].xxxx +928: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +929: FRC TEMP[14].x, TEMP[14].xxxx +930: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].yyyy +931: SIN TEMP[15].x, TEMP[15].xxxx +932: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +933: FRC TEMP[15].x, TEMP[15].xxxx +934: LRP TEMP[14].x, TEMP[12].xxxx, TEMP[15].xxxx, TEMP[14].xxxx +935: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].zzzz +936: SIN TEMP[15].x, TEMP[15].xxxx +937: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +938: FRC TEMP[15].x, TEMP[15].xxxx +939: ADD TEMP[11].x, TEMP[11].xxxx, IMM[7].wwww +940: SIN TEMP[11].x, TEMP[11].xxxx +941: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +942: FRC TEMP[11].x, TEMP[11].xxxx +943: LRP TEMP[11].x, TEMP[12].xxxx, TEMP[11].xxxx, TEMP[15].xxxx +944: LRP TEMP[11].x, TEMP[12].yyyy, TEMP[11].xxxx, TEMP[14].xxxx +945: LRP TEMP[11].x, TEMP[12].zzzz, TEMP[11].xxxx, TEMP[13].xxxx +946: MAD TEMP[10].x, IMM[9].wwww, TEMP[11].xxxx, TEMP[10].xxxx +947: MUL TEMP[11].xyz, IMM[10].xyzz, TEMP[8].xxxx +948: MAD TEMP[11].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[11].xyzz +949: MAD TEMP[11].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[11].xyzz +950: MUL TEMP[8].xyz, TEMP[11].xyzz, IMM[10].wwww +951: FLR TEMP[11].xyz, TEMP[8].xyzz +952: FRC TEMP[12].xyz, TEMP[8].xyzz +953: MUL TEMP[13].xyz, TEMP[12].xyzz, TEMP[12].xyzz +954: MUL TEMP[12].xyz, IMM[0].xxxx, TEMP[12].xyzz +955: ADD TEMP[12].xyz, IMM[5].zzzz, -TEMP[12].xyzz +956: MUL TEMP[12].xyz, TEMP[13].xyzz, TEMP[12].xyzz +957: MAD TEMP[13].x, TEMP[11].yyyy, IMM[6].xxxx, TEMP[11].xxxx +958: MAD TEMP[11].x, IMM[5].wwww, TEMP[11].zzzz, TEMP[13].xxxx +959: SIN TEMP[13].x, TEMP[11].xxxx +960: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +961: FRC TEMP[13].x, TEMP[13].xxxx +962: ADD TEMP[14].x, TEMP[11].xxxx, IMM[6].wwww +963: SIN TEMP[14].x, TEMP[14].xxxx +964: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +965: FRC TEMP[14].x, TEMP[14].xxxx +966: LRP TEMP[13].x, TEMP[12].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +967: ADD TEMP[14].x, TEMP[11].xxxx, IMM[6].xxxx +968: SIN TEMP[14].x, TEMP[14].xxxx +969: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +970: FRC TEMP[14].x, TEMP[14].xxxx +971: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].xxxx +972: SIN TEMP[15].x, TEMP[15].xxxx +973: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +974: FRC TEMP[15].x, TEMP[15].xxxx +975: LRP TEMP[14].x, TEMP[12].xxxx, TEMP[15].xxxx, TEMP[14].xxxx +976: LRP TEMP[13].x, TEMP[12].yyyy, TEMP[14].xxxx, TEMP[13].xxxx +977: ADD TEMP[14].x, TEMP[11].xxxx, IMM[5].wwww +978: SIN TEMP[14].x, TEMP[14].xxxx +979: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +980: FRC TEMP[14].x, TEMP[14].xxxx +981: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].yyyy +982: SIN TEMP[15].x, TEMP[15].xxxx +983: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +984: FRC TEMP[15].x, TEMP[15].xxxx +985: LRP TEMP[14].x, TEMP[12].xxxx, TEMP[15].xxxx, TEMP[14].xxxx +986: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].zzzz +987: SIN TEMP[15].x, TEMP[15].xxxx +988: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +989: FRC TEMP[15].x, TEMP[15].xxxx +990: ADD TEMP[11].x, TEMP[11].xxxx, IMM[7].wwww +991: SIN TEMP[11].x, TEMP[11].xxxx +992: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +993: FRC TEMP[11].x, TEMP[11].xxxx +994: LRP TEMP[11].x, TEMP[12].xxxx, TEMP[11].xxxx, TEMP[15].xxxx +995: LRP TEMP[11].x, TEMP[12].yyyy, TEMP[11].xxxx, TEMP[14].xxxx +996: LRP TEMP[11].x, TEMP[12].zzzz, TEMP[11].xxxx, TEMP[13].xxxx +997: MAD TEMP[10].x, IMM[11].xxxx, TEMP[11].xxxx, TEMP[10].xxxx +998: MUL TEMP[11].xyz, IMM[10].xyzz, TEMP[8].xxxx +999: MAD TEMP[11].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[11].xyzz +1000: MAD TEMP[11].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[11].xyzz +1001: MUL TEMP[8].xyz, TEMP[11].xyzz, IMM[11].yyyy +1002: FLR TEMP[11].xyz, TEMP[8].xyzz +1003: FRC TEMP[12].xyz, TEMP[8].xyzz +1004: MUL TEMP[13].xyz, TEMP[12].xyzz, TEMP[12].xyzz +1005: MUL TEMP[12].xyz, IMM[0].xxxx, TEMP[12].xyzz +1006: ADD TEMP[12].xyz, IMM[5].zzzz, -TEMP[12].xyzz +1007: MUL TEMP[12].xyz, TEMP[13].xyzz, TEMP[12].xyzz +1008: MAD TEMP[13].x, TEMP[11].yyyy, IMM[6].xxxx, TEMP[11].xxxx +1009: MAD TEMP[11].x, IMM[5].wwww, TEMP[11].zzzz, TEMP[13].xxxx +1010: SIN TEMP[13].x, TEMP[11].xxxx +1011: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1012: FRC TEMP[13].x, TEMP[13].xxxx +1013: ADD TEMP[14].x, TEMP[11].xxxx, IMM[6].wwww +1014: SIN TEMP[14].x, TEMP[14].xxxx +1015: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1016: FRC TEMP[14].x, TEMP[14].xxxx +1017: LRP TEMP[13].x, TEMP[12].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1018: ADD TEMP[14].x, TEMP[11].xxxx, IMM[6].xxxx +1019: SIN TEMP[14].x, TEMP[14].xxxx +1020: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1021: FRC TEMP[14].x, TEMP[14].xxxx +1022: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].xxxx +1023: SIN TEMP[15].x, TEMP[15].xxxx +1024: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +1025: FRC TEMP[15].x, TEMP[15].xxxx +1026: LRP TEMP[14].x, TEMP[12].xxxx, TEMP[15].xxxx, TEMP[14].xxxx +1027: LRP TEMP[13].x, TEMP[12].yyyy, TEMP[14].xxxx, TEMP[13].xxxx +1028: ADD TEMP[14].x, TEMP[11].xxxx, IMM[5].wwww +1029: SIN TEMP[14].x, TEMP[14].xxxx +1030: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1031: FRC TEMP[14].x, TEMP[14].xxxx +1032: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].yyyy +1033: SIN TEMP[15].x, TEMP[15].xxxx +1034: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +1035: FRC TEMP[15].x, TEMP[15].xxxx +1036: LRP TEMP[14].x, TEMP[12].xxxx, TEMP[15].xxxx, TEMP[14].xxxx +1037: ADD TEMP[15].x, TEMP[11].xxxx, IMM[7].zzzz +1038: SIN TEMP[15].x, TEMP[15].xxxx +1039: MUL TEMP[15].x, TEMP[15].xxxx, IMM[6].zzzz +1040: FRC TEMP[15].x, TEMP[15].xxxx +1041: ADD TEMP[11].x, TEMP[11].xxxx, IMM[7].wwww +1042: SIN TEMP[11].x, TEMP[11].xxxx +1043: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +1044: FRC TEMP[11].x, TEMP[11].xxxx +1045: LRP TEMP[11].x, TEMP[12].xxxx, TEMP[11].xxxx, TEMP[15].xxxx +1046: LRP TEMP[11].x, TEMP[12].yyyy, TEMP[11].xxxx, TEMP[14].xxxx +1047: LRP TEMP[11].x, TEMP[12].zzzz, TEMP[11].xxxx, TEMP[13].xxxx +1048: MAD TEMP[10].x, IMM[11].zzzz, TEMP[11].xxxx, TEMP[10].xxxx +1049: MUL TEMP[11].xyz, IMM[10].xyzz, TEMP[8].xxxx +1050: MAD TEMP[11].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[11].xyzz +1051: MAD TEMP[11].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[11].xyzz +1052: MUL TEMP[8].xyz, TEMP[11].xyzz, IMM[8].wwww +1053: FLR TEMP[11].xyz, TEMP[8].xyzz +1054: FRC TEMP[8].xyz, TEMP[8].xyzz +1055: MUL TEMP[12].xyz, TEMP[8].xyzz, TEMP[8].xyzz +1056: MUL TEMP[8].xyz, IMM[0].xxxx, TEMP[8].xyzz +1057: ADD TEMP[8].xyz, IMM[5].zzzz, -TEMP[8].xyzz +1058: MUL TEMP[8].xyz, TEMP[12].xyzz, TEMP[8].xyzz +1059: MAD TEMP[12].x, TEMP[11].yyyy, IMM[6].xxxx, TEMP[11].xxxx +1060: MAD TEMP[11].x, IMM[5].wwww, TEMP[11].zzzz, TEMP[12].xxxx +1061: SIN TEMP[12].x, TEMP[11].xxxx +1062: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1063: FRC TEMP[12].x, TEMP[12].xxxx +1064: ADD TEMP[13].x, TEMP[11].xxxx, IMM[6].wwww +1065: SIN TEMP[13].x, TEMP[13].xxxx +1066: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1067: FRC TEMP[13].x, TEMP[13].xxxx +1068: LRP TEMP[12].x, TEMP[8].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1069: ADD TEMP[13].x, TEMP[11].xxxx, IMM[6].xxxx +1070: SIN TEMP[13].x, TEMP[13].xxxx +1071: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1072: FRC TEMP[13].x, TEMP[13].xxxx +1073: ADD TEMP[14].x, TEMP[11].xxxx, IMM[7].xxxx +1074: SIN TEMP[14].x, TEMP[14].xxxx +1075: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1076: FRC TEMP[14].x, TEMP[14].xxxx +1077: LRP TEMP[13].x, TEMP[8].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1078: LRP TEMP[12].x, TEMP[8].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +1079: ADD TEMP[13].x, TEMP[11].xxxx, IMM[5].wwww +1080: SIN TEMP[13].x, TEMP[13].xxxx +1081: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1082: FRC TEMP[13].x, TEMP[13].xxxx +1083: ADD TEMP[14].x, TEMP[11].xxxx, IMM[7].yyyy +1084: SIN TEMP[14].x, TEMP[14].xxxx +1085: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1086: FRC TEMP[14].x, TEMP[14].xxxx +1087: LRP TEMP[13].x, TEMP[8].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1088: ADD TEMP[14].x, TEMP[11].xxxx, IMM[7].zzzz +1089: SIN TEMP[14].x, TEMP[14].xxxx +1090: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1091: FRC TEMP[14].x, TEMP[14].xxxx +1092: ADD TEMP[11].x, TEMP[11].xxxx, IMM[7].wwww +1093: SIN TEMP[11].x, TEMP[11].xxxx +1094: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +1095: FRC TEMP[11].x, TEMP[11].xxxx +1096: LRP TEMP[11].x, TEMP[8].xxxx, TEMP[11].xxxx, TEMP[14].xxxx +1097: LRP TEMP[11].x, TEMP[8].yyyy, TEMP[11].xxxx, TEMP[13].xxxx +1098: LRP TEMP[8].x, TEMP[8].zzzz, TEMP[11].xxxx, TEMP[12].xxxx +1099: ABS TEMP[8].x, TEMP[8].xxxx +1100: MAD TEMP[10].x, IMM[11].wwww, TEMP[8].xxxx, TEMP[10].xxxx +1101: MAD TEMP[9].x, IMM[16].zzzz, TEMP[10].xxxx, TEMP[9].xxxx +1102: ADD TEMP[8].x, TEMP[9].xxxx, -TEMP[6].xxxx +1103: MOV TEMP[7].y, TEMP[8].xxxx +1104: MOV TEMP[8].x, TEMP[2].xxxx +1105: MOV TEMP[8].y, TEMP[2].yyyy +1106: ADD TEMP[2].x, TEMP[2].zzzz, IMM[16].wwww +1107: MOV TEMP[8].z, TEMP[2].xxxx +1108: DP3 TEMP[2].x, TEMP[8].xyzz, TEMP[8].xyzz +1109: RSQ TEMP[9].x, TEMP[2].xxxx +1110: MUL TEMP[9].x, TEMP[9].xxxx, TEMP[2].xxxx +1111: CMP TEMP[9].x, -TEMP[2].xxxx, TEMP[9].xxxx, IMM[0].zzzz +1112: ADD TEMP[2].x, TEMP[9].xxxx, IMM[2].zzzz +1113: MUL TEMP[8].xyz, TEMP[8].xyzz, IMM[2].wwww +1114: MAD TEMP[8].xyz, IMM[5].xyyy, CONST[1].xxxx, TEMP[8].xyzz +1115: FLR TEMP[9].xyz, TEMP[8].xyzz +1116: FRC TEMP[10].xyz, TEMP[8].xyzz +1117: MUL TEMP[11].xyz, TEMP[10].xyzz, TEMP[10].xyzz +1118: MUL TEMP[10].xyz, IMM[0].xxxx, TEMP[10].xyzz +1119: ADD TEMP[10].xyz, IMM[5].zzzz, -TEMP[10].xyzz +1120: MUL TEMP[10].xyz, TEMP[11].xyzz, TEMP[10].xyzz +1121: MAD TEMP[11].x, TEMP[9].yyyy, IMM[6].xxxx, TEMP[9].xxxx +1122: MAD TEMP[9].x, IMM[5].wwww, TEMP[9].zzzz, TEMP[11].xxxx +1123: SIN TEMP[11].x, TEMP[9].xxxx +1124: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +1125: FRC TEMP[11].x, TEMP[11].xxxx +1126: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].wwww +1127: SIN TEMP[12].x, TEMP[12].xxxx +1128: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1129: FRC TEMP[12].x, TEMP[12].xxxx +1130: LRP TEMP[11].x, TEMP[10].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +1131: ADD TEMP[12].x, TEMP[9].xxxx, IMM[6].xxxx +1132: SIN TEMP[12].x, TEMP[12].xxxx +1133: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1134: FRC TEMP[12].x, TEMP[12].xxxx +1135: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].xxxx +1136: SIN TEMP[13].x, TEMP[13].xxxx +1137: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1138: FRC TEMP[13].x, TEMP[13].xxxx +1139: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1140: LRP TEMP[11].x, TEMP[10].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +1141: ADD TEMP[12].x, TEMP[9].xxxx, IMM[5].wwww +1142: SIN TEMP[12].x, TEMP[12].xxxx +1143: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1144: FRC TEMP[12].x, TEMP[12].xxxx +1145: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].yyyy +1146: SIN TEMP[13].x, TEMP[13].xxxx +1147: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1148: FRC TEMP[13].x, TEMP[13].xxxx +1149: LRP TEMP[12].x, TEMP[10].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1150: ADD TEMP[13].x, TEMP[9].xxxx, IMM[7].zzzz +1151: SIN TEMP[13].x, TEMP[13].xxxx +1152: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1153: FRC TEMP[13].x, TEMP[13].xxxx +1154: ADD TEMP[9].x, TEMP[9].xxxx, IMM[7].wwww +1155: SIN TEMP[9].x, TEMP[9].xxxx +1156: MUL TEMP[9].x, TEMP[9].xxxx, IMM[6].zzzz +1157: FRC TEMP[9].x, TEMP[9].xxxx +1158: LRP TEMP[9].x, TEMP[10].xxxx, TEMP[9].xxxx, TEMP[13].xxxx +1159: LRP TEMP[9].x, TEMP[10].yyyy, TEMP[9].xxxx, TEMP[12].xxxx +1160: LRP TEMP[9].x, TEMP[10].zzzz, TEMP[9].xxxx, TEMP[11].xxxx +1161: MUL TEMP[9].x, IMM[6].yyyy, TEMP[9].xxxx +1162: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[8].xxxx +1163: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[10].xyzz +1164: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[10].xyzz +1165: MUL TEMP[8].xyz, TEMP[10].xyzz, IMM[8].wwww +1166: FLR TEMP[10].xyz, TEMP[8].xyzz +1167: FRC TEMP[11].xyz, TEMP[8].xyzz +1168: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +1169: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +1170: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +1171: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +1172: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +1173: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +1174: SIN TEMP[12].x, TEMP[10].xxxx +1175: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1176: FRC TEMP[12].x, TEMP[12].xxxx +1177: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +1178: SIN TEMP[13].x, TEMP[13].xxxx +1179: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1180: FRC TEMP[13].x, TEMP[13].xxxx +1181: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1182: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +1183: SIN TEMP[13].x, TEMP[13].xxxx +1184: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1185: FRC TEMP[13].x, TEMP[13].xxxx +1186: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +1187: SIN TEMP[14].x, TEMP[14].xxxx +1188: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1189: FRC TEMP[14].x, TEMP[14].xxxx +1190: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1191: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +1192: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +1193: SIN TEMP[13].x, TEMP[13].xxxx +1194: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1195: FRC TEMP[13].x, TEMP[13].xxxx +1196: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +1197: SIN TEMP[14].x, TEMP[14].xxxx +1198: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1199: FRC TEMP[14].x, TEMP[14].xxxx +1200: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1201: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +1202: SIN TEMP[14].x, TEMP[14].xxxx +1203: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1204: FRC TEMP[14].x, TEMP[14].xxxx +1205: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +1206: SIN TEMP[10].x, TEMP[10].xxxx +1207: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +1208: FRC TEMP[10].x, TEMP[10].xxxx +1209: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +1210: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +1211: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +1212: MAD TEMP[9].x, IMM[9].wwww, TEMP[10].xxxx, TEMP[9].xxxx +1213: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[8].xxxx +1214: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[10].xyzz +1215: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[10].xyzz +1216: MUL TEMP[8].xyz, TEMP[10].xyzz, IMM[10].wwww +1217: FLR TEMP[10].xyz, TEMP[8].xyzz +1218: FRC TEMP[11].xyz, TEMP[8].xyzz +1219: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +1220: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +1221: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +1222: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +1223: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +1224: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +1225: SIN TEMP[12].x, TEMP[10].xxxx +1226: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1227: FRC TEMP[12].x, TEMP[12].xxxx +1228: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +1229: SIN TEMP[13].x, TEMP[13].xxxx +1230: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1231: FRC TEMP[13].x, TEMP[13].xxxx +1232: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1233: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +1234: SIN TEMP[13].x, TEMP[13].xxxx +1235: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1236: FRC TEMP[13].x, TEMP[13].xxxx +1237: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +1238: SIN TEMP[14].x, TEMP[14].xxxx +1239: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1240: FRC TEMP[14].x, TEMP[14].xxxx +1241: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1242: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +1243: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +1244: SIN TEMP[13].x, TEMP[13].xxxx +1245: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1246: FRC TEMP[13].x, TEMP[13].xxxx +1247: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +1248: SIN TEMP[14].x, TEMP[14].xxxx +1249: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1250: FRC TEMP[14].x, TEMP[14].xxxx +1251: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1252: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +1253: SIN TEMP[14].x, TEMP[14].xxxx +1254: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1255: FRC TEMP[14].x, TEMP[14].xxxx +1256: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +1257: SIN TEMP[10].x, TEMP[10].xxxx +1258: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +1259: FRC TEMP[10].x, TEMP[10].xxxx +1260: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +1261: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +1262: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +1263: MAD TEMP[9].x, IMM[11].xxxx, TEMP[10].xxxx, TEMP[9].xxxx +1264: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[8].xxxx +1265: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[10].xyzz +1266: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[10].xyzz +1267: MUL TEMP[8].xyz, TEMP[10].xyzz, IMM[11].yyyy +1268: FLR TEMP[10].xyz, TEMP[8].xyzz +1269: FRC TEMP[11].xyz, TEMP[8].xyzz +1270: MUL TEMP[12].xyz, TEMP[11].xyzz, TEMP[11].xyzz +1271: MUL TEMP[11].xyz, IMM[0].xxxx, TEMP[11].xyzz +1272: ADD TEMP[11].xyz, IMM[5].zzzz, -TEMP[11].xyzz +1273: MUL TEMP[11].xyz, TEMP[12].xyzz, TEMP[11].xyzz +1274: MAD TEMP[12].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +1275: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[12].xxxx +1276: SIN TEMP[12].x, TEMP[10].xxxx +1277: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1278: FRC TEMP[12].x, TEMP[12].xxxx +1279: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].wwww +1280: SIN TEMP[13].x, TEMP[13].xxxx +1281: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1282: FRC TEMP[13].x, TEMP[13].xxxx +1283: LRP TEMP[12].x, TEMP[11].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1284: ADD TEMP[13].x, TEMP[10].xxxx, IMM[6].xxxx +1285: SIN TEMP[13].x, TEMP[13].xxxx +1286: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1287: FRC TEMP[13].x, TEMP[13].xxxx +1288: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].xxxx +1289: SIN TEMP[14].x, TEMP[14].xxxx +1290: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1291: FRC TEMP[14].x, TEMP[14].xxxx +1292: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1293: LRP TEMP[12].x, TEMP[11].yyyy, TEMP[13].xxxx, TEMP[12].xxxx +1294: ADD TEMP[13].x, TEMP[10].xxxx, IMM[5].wwww +1295: SIN TEMP[13].x, TEMP[13].xxxx +1296: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1297: FRC TEMP[13].x, TEMP[13].xxxx +1298: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].yyyy +1299: SIN TEMP[14].x, TEMP[14].xxxx +1300: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1301: FRC TEMP[14].x, TEMP[14].xxxx +1302: LRP TEMP[13].x, TEMP[11].xxxx, TEMP[14].xxxx, TEMP[13].xxxx +1303: ADD TEMP[14].x, TEMP[10].xxxx, IMM[7].zzzz +1304: SIN TEMP[14].x, TEMP[14].xxxx +1305: MUL TEMP[14].x, TEMP[14].xxxx, IMM[6].zzzz +1306: FRC TEMP[14].x, TEMP[14].xxxx +1307: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +1308: SIN TEMP[10].x, TEMP[10].xxxx +1309: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +1310: FRC TEMP[10].x, TEMP[10].xxxx +1311: LRP TEMP[10].x, TEMP[11].xxxx, TEMP[10].xxxx, TEMP[14].xxxx +1312: LRP TEMP[10].x, TEMP[11].yyyy, TEMP[10].xxxx, TEMP[13].xxxx +1313: LRP TEMP[10].x, TEMP[11].zzzz, TEMP[10].xxxx, TEMP[12].xxxx +1314: MAD TEMP[9].x, IMM[11].zzzz, TEMP[10].xxxx, TEMP[9].xxxx +1315: MUL TEMP[10].xyz, IMM[10].xyzz, TEMP[8].xxxx +1316: MAD TEMP[10].xyz, IMM[9].xyzz, TEMP[8].yyyy, TEMP[10].xyzz +1317: MAD TEMP[10].xyz, IMM[8].xyzz, TEMP[8].zzzz, TEMP[10].xyzz +1318: MUL TEMP[8].xyz, TEMP[10].xyzz, IMM[8].wwww +1319: FLR TEMP[10].xyz, TEMP[8].xyzz +1320: FRC TEMP[8].xyz, TEMP[8].xyzz +1321: MUL TEMP[11].xyz, TEMP[8].xyzz, TEMP[8].xyzz +1322: MUL TEMP[8].xyz, IMM[0].xxxx, TEMP[8].xyzz +1323: ADD TEMP[8].xyz, IMM[5].zzzz, -TEMP[8].xyzz +1324: MUL TEMP[8].xyz, TEMP[11].xyzz, TEMP[8].xyzz +1325: MAD TEMP[11].x, TEMP[10].yyyy, IMM[6].xxxx, TEMP[10].xxxx +1326: MAD TEMP[10].x, IMM[5].wwww, TEMP[10].zzzz, TEMP[11].xxxx +1327: SIN TEMP[11].x, TEMP[10].xxxx +1328: MUL TEMP[11].x, TEMP[11].xxxx, IMM[6].zzzz +1329: FRC TEMP[11].x, TEMP[11].xxxx +1330: ADD TEMP[12].x, TEMP[10].xxxx, IMM[6].wwww +1331: SIN TEMP[12].x, TEMP[12].xxxx +1332: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1333: FRC TEMP[12].x, TEMP[12].xxxx +1334: LRP TEMP[11].x, TEMP[8].xxxx, TEMP[12].xxxx, TEMP[11].xxxx +1335: ADD TEMP[12].x, TEMP[10].xxxx, IMM[6].xxxx +1336: SIN TEMP[12].x, TEMP[12].xxxx +1337: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1338: FRC TEMP[12].x, TEMP[12].xxxx +1339: ADD TEMP[13].x, TEMP[10].xxxx, IMM[7].xxxx +1340: SIN TEMP[13].x, TEMP[13].xxxx +1341: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1342: FRC TEMP[13].x, TEMP[13].xxxx +1343: LRP TEMP[12].x, TEMP[8].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1344: LRP TEMP[11].x, TEMP[8].yyyy, TEMP[12].xxxx, TEMP[11].xxxx +1345: ADD TEMP[12].x, TEMP[10].xxxx, IMM[5].wwww +1346: SIN TEMP[12].x, TEMP[12].xxxx +1347: MUL TEMP[12].x, TEMP[12].xxxx, IMM[6].zzzz +1348: FRC TEMP[12].x, TEMP[12].xxxx +1349: ADD TEMP[13].x, TEMP[10].xxxx, IMM[7].yyyy +1350: SIN TEMP[13].x, TEMP[13].xxxx +1351: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1352: FRC TEMP[13].x, TEMP[13].xxxx +1353: LRP TEMP[12].x, TEMP[8].xxxx, TEMP[13].xxxx, TEMP[12].xxxx +1354: ADD TEMP[13].x, TEMP[10].xxxx, IMM[7].zzzz +1355: SIN TEMP[13].x, TEMP[13].xxxx +1356: MUL TEMP[13].x, TEMP[13].xxxx, IMM[6].zzzz +1357: FRC TEMP[13].x, TEMP[13].xxxx +1358: ADD TEMP[10].x, TEMP[10].xxxx, IMM[7].wwww +1359: SIN TEMP[10].x, TEMP[10].xxxx +1360: MUL TEMP[10].x, TEMP[10].xxxx, IMM[6].zzzz +1361: FRC TEMP[10].x, TEMP[10].xxxx +1362: LRP TEMP[10].x, TEMP[8].xxxx, TEMP[10].xxxx, TEMP[13].xxxx +1363: LRP TEMP[10].x, TEMP[8].yyyy, TEMP[10].xxxx, TEMP[12].xxxx +1364: LRP TEMP[8].x, TEMP[8].zzzz, TEMP[10].xxxx, TEMP[11].xxxx +1365: ABS TEMP[8].x, TEMP[8].xxxx +1366: MAD TEMP[9].x, IMM[11].wwww, TEMP[8].xxxx, TEMP[9].xxxx +1367: MAD TEMP[2].x, IMM[16].zzzz, TEMP[9].xxxx, TEMP[2].xxxx +1368: ADD TEMP[2].x, TEMP[2].xxxx, -TEMP[6].xxxx +1369: MOV TEMP[7].z, TEMP[2].xxxx +1370: DP3 TEMP[2].x, TEMP[7].xyzz, TEMP[7].xyzz +1371: RSQ TEMP[2].x, TEMP[2].xxxx +1372: MUL TEMP[2].z, TEMP[7].xyzz, TEMP[2].xxxx +1373: MAD TEMP[2].x, TEMP[2].zzzz, IMM[17].xxxx, IMM[17].yyyy +1374: MUL TEMP[2].xyz, TEMP[5].xyzz, TEMP[2].xxxx +1375: ADD TEMP[3].x, TEMP[3].xxxx, IMM[13].wwww +1376: MUL TEMP[3].x, TEMP[3].xxxx, IMM[0].xxxx +1377: MOV_SAT TEMP[3].x, TEMP[3].xxxx +1378: LRP TEMP[4].xyz, TEMP[3].xxxx, TEMP[2].xyzz, TEMP[5].xyzz +1379: MOV TEMP[1], TEMP[4] +1380: ENDIF +1381: MOV OUT[0], TEMP[1] +1382: END + ); +#endif diff --git a/tests/test_virgl_cmd.c b/tests/test_virgl_cmd.c index b3c102e..525cef3 100644 --- a/tests/test_virgl_cmd.c +++ b/tests/test_virgl_cmd.c @@ -33,6 +33,7 @@ #include "virgl_protocol.h" #include "util/u_memory.h" +#include "large_shader.h" /* test creating objects with same ID causes context err */ START_TEST(virgl_test_overlap_obj_id) { @@ -343,9 +344,9 @@ START_TEST(virgl_test_render_simple) " 2: END\n"; memset(&vs, 0, sizeof(vs)); vs_handle = ctx_handle++; - virgl_encode_shader_state(&ctx, vs_handle, VIRGL_OBJECT_VS, + virgl_encode_shader_state(&ctx, vs_handle, PIPE_SHADER_VERTEX, &vs, text); - virgl_encode_bind_object(&ctx, vs_handle, VIRGL_OBJECT_VS); + virgl_encode_bind_object(&ctx, vs_handle, VIRGL_OBJECT_SHADER); } /* create fragment shader */ @@ -359,10 +360,10 @@ START_TEST(virgl_test_render_simple) " 1: END\n"; memset(&fs, 0, sizeof(fs)); fs_handle = ctx_handle++; - virgl_encode_shader_state(&ctx, fs_handle, VIRGL_OBJECT_FS, + virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT, &fs, text); - virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_FS); + virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_SHADER); } /* set blend state */ @@ -568,9 +569,9 @@ START_TEST(virgl_test_render_geom_simple) " 2: END\n"; memset(&vs, 0, sizeof(vs)); vs_handle = ctx_handle++; - virgl_encode_shader_state(&ctx, vs_handle, VIRGL_OBJECT_VS, + virgl_encode_shader_state(&ctx, vs_handle, PIPE_SHADER_VERTEX, &vs, text); - virgl_encode_bind_object(&ctx, vs_handle, VIRGL_OBJECT_VS); + virgl_encode_bind_object(&ctx, vs_handle, VIRGL_OBJECT_SHADER); } /* create geometry shader */ @@ -599,9 +600,9 @@ START_TEST(virgl_test_render_geom_simple) "9:END\n"; memset(&gs, 0, sizeof(gs)); gs_handle = ctx_handle++; - virgl_encode_shader_state(&ctx, gs_handle, VIRGL_OBJECT_GS, + virgl_encode_shader_state(&ctx, gs_handle, PIPE_SHADER_GEOMETRY, &gs, text); - virgl_encode_bind_object(&ctx, gs_handle, VIRGL_OBJECT_GS); + virgl_encode_bind_object(&ctx, gs_handle, VIRGL_OBJECT_SHADER); } /* create fragment shader */ @@ -615,10 +616,10 @@ START_TEST(virgl_test_render_geom_simple) " 1: END\n"; memset(&fs, 0, sizeof(fs)); fs_handle = ctx_handle++; - virgl_encode_shader_state(&ctx, fs_handle, VIRGL_OBJECT_FS, + virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT, &fs, text); - virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_FS); + virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_SHADER); } /* set blend state */ @@ -844,9 +845,9 @@ START_TEST(virgl_test_render_xfb) vs.stream_output.num_outputs = 1; vs.stream_output.stride[0] = 4; vs.stream_output.output[0].num_components = 4; - virgl_encode_shader_state(&ctx, vs_handle, VIRGL_OBJECT_VS, + virgl_encode_shader_state(&ctx, vs_handle, PIPE_SHADER_VERTEX, &vs, text); - virgl_encode_bind_object(&ctx, vs_handle, VIRGL_OBJECT_VS); + virgl_encode_bind_object(&ctx, vs_handle, VIRGL_OBJECT_SHADER); } /* create fragment shader */ @@ -860,10 +861,10 @@ START_TEST(virgl_test_render_xfb) " 1: END\n"; memset(&fs, 0, sizeof(fs)); fs_handle = ctx_handle++; - virgl_encode_shader_state(&ctx, fs_handle, VIRGL_OBJECT_FS, + virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT, &fs, text); - virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_FS); + virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_SHADER); } /* set blend state */ @@ -977,6 +978,33 @@ START_TEST(virgl_test_render_xfb) } END_TEST +/* send a large shader across */ +START_TEST(virgl_test_large_shader) +{ + int ret; + struct virgl_context ctx; + int ctx_handle = 1; + int fs_handle; + ret = testvirgl_init_ctx_cmdbuf(&ctx); + ck_assert_int_eq(ret, 0); + + /* create large fragment shader */ + { + struct pipe_shader_state fs; + const char *text = large_frag; + + memset(&fs, 0, sizeof(fs)); + fs_handle = ctx_handle++; + virgl_encode_shader_state(&ctx, fs_handle, PIPE_SHADER_FRAGMENT, + &fs, text); + + virgl_encode_bind_object(&ctx, fs_handle, VIRGL_OBJECT_SHADER); + } + + testvirgl_fini_ctx_cmdbuf(&ctx); +} +END_TEST + Suite *virgl_init_suite(void) { Suite *s; @@ -987,6 +1015,7 @@ Suite *virgl_init_suite(void) tcase_add_test(tc_core, virgl_test_clear); tcase_add_test(tc_core, virgl_test_blit_simple); tcase_add_test(tc_core, virgl_test_overlap_obj_id); + tcase_add_test(tc_core, virgl_test_large_shader); tcase_add_test(tc_core, virgl_test_render_simple); tcase_add_test(tc_core, virgl_test_render_geom_simple); tcase_add_test(tc_core, virgl_test_render_xfb); diff --git a/tests/testvirgl_encode.c b/tests/testvirgl_encode.c index 5b53ea1..f1d5409 100644 --- a/tests/testvirgl_encode.c +++ b/tests/testvirgl_encode.c @@ -189,59 +189,111 @@ int virgl_encode_rasterizer_state(struct virgl_context *ctx, return 0; } +static void virgl_emit_shader_header(struct virgl_context *ctx, + uint32_t handle, uint32_t len, + uint32_t type, uint32_t offlen, + uint32_t num_tokens) +{ + virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_CREATE_OBJECT, VIRGL_OBJECT_SHADER, len)); + virgl_encoder_write_dword(ctx->cbuf, handle); + virgl_encoder_write_dword(ctx->cbuf, type); + virgl_encoder_write_dword(ctx->cbuf, offlen); + virgl_encoder_write_dword(ctx->cbuf, num_tokens); +} + +static void virgl_emit_shader_streamout(struct virgl_context *ctx, + const struct pipe_stream_output_info *so_info) +{ + int num_outputs = 0; + int i; + uint32_t tmp; + + if (so_info) + num_outputs = so_info->num_outputs; + + virgl_encoder_write_dword(ctx->cbuf, num_outputs); + if (num_outputs) { + for (i = 0; i < 4; i++) + virgl_encoder_write_dword(ctx->cbuf, so_info->stride[i]); + + for (i = 0; i < so_info->num_outputs; i++) { + tmp = + VIRGL_OBJ_SHADER_SO_OUTPUT_REGISTER_INDEX(so_info->output[i].register_index) | + VIRGL_OBJ_SHADER_SO_OUTPUT_START_COMPONENT(so_info->output[i].start_component) | + VIRGL_OBJ_SHADER_SO_OUTPUT_NUM_COMPONENTS(so_info->output[i].num_components) | + VIRGL_OBJ_SHADER_SO_OUTPUT_BUFFER(so_info->output[i].output_buffer) | + VIRGL_OBJ_SHADER_SO_OUTPUT_DST_OFFSET(so_info->output[i].dst_offset); + virgl_encoder_write_dword(ctx->cbuf, tmp); + virgl_encoder_write_dword(ctx->cbuf, 0); + } + } +} + int virgl_encode_shader_state(struct virgl_context *ctx, - uint32_t handle, - uint32_t type, - const struct pipe_shader_state *shader, - const char *shad_str) + uint32_t handle, + uint32_t type, + const struct pipe_shader_state *shader, + const char *shad_str) { - char *str; + char *str, *sptr; uint32_t shader_len, len; - int i; int ret; - uint32_t tmp; int num_tokens; int str_total_size = 65536; + uint32_t left_bytes, base_hdr_size, strm_hdr_size, thispass; + bool first_pass; if (!shad_str) { num_tokens = tgsi_num_tokens(shader->tokens); str = CALLOC(1, str_total_size); if (!str) - return -1; + return -1; ret = tgsi_dump_str(shader->tokens, TGSI_DUMP_FLOAT_AS_HEX, str, str_total_size); if (ret == -1) { - fprintf(stderr, "Failed to translate shader in available space\n"); - FREE(str); - return -1; + fprintf(stderr, "Failed to translate shader in available space\n"); + FREE(str); + return -1; } } else { - num_tokens = 0; + num_tokens = 300; str = (char *)shad_str; } shader_len = strlen(str) + 1; - len = ((shader_len + 3) / 4) + VIRGL_OBJ_SHADER_HDR_SIZE(shader->stream_output.num_outputs); - virgl_encoder_write_cmd_dword(ctx, VIRGL_CMD0(VIRGL_CCMD_CREATE_OBJECT, type, len)); - virgl_encoder_write_dword(ctx->cbuf, handle); - virgl_encoder_write_dword(ctx->cbuf, num_tokens); - virgl_encoder_write_dword(ctx->cbuf, shader->stream_output.num_outputs); - if (shader->stream_output.num_outputs) { - for (i = 0; i < 4; i++) - virgl_encoder_write_dword(ctx->cbuf, shader->stream_output.stride[i]); + left_bytes = shader_len; - for (i = 0; i < shader->stream_output.num_outputs; i++) { - tmp = - VIRGL_OBJ_SHADER_SO_OUTPUT_REGISTER_INDEX(shader->stream_output.output[i].register_index) | - VIRGL_OBJ_SHADER_SO_OUTPUT_START_COMPONENT(shader->stream_output.output[i].start_component) | - VIRGL_OBJ_SHADER_SO_OUTPUT_NUM_COMPONENTS(shader->stream_output.output[i].num_components) | - VIRGL_OBJ_SHADER_SO_OUTPUT_BUFFER(shader->stream_output.output[i].output_buffer) | - VIRGL_OBJ_SHADER_SO_OUTPUT_DST_OFFSET(shader->stream_output.output[i].dst_offset); - virgl_encoder_write_dword(ctx->cbuf, tmp); - } + base_hdr_size = 5; + strm_hdr_size = shader->stream_output.num_outputs ? shader->stream_output.num_outputs * 2 + 4 : 0; + first_pass = true; + sptr = str; + while (left_bytes) { + uint32_t length, offlen; + int hdr_len = base_hdr_size + (first_pass ? strm_hdr_size : 0); + if (ctx->cbuf->cdw + hdr_len + 1 > VIRGL_MAX_CMDBUF_DWORDS) + ctx->flush(ctx); + + thispass = (VIRGL_MAX_CMDBUF_DWORDS - ctx->cbuf->cdw - hdr_len - 1) * 4; + + length = MIN2(thispass, left_bytes); + len = ((length + 3) / 4) + hdr_len; + + if (first_pass) + offlen = VIRGL_OBJ_SHADER_OFFSET_VAL(shader_len); + else + offlen = VIRGL_OBJ_SHADER_OFFSET_VAL((uintptr_t)sptr - (uintptr_t)str) | VIRGL_OBJ_SHADER_OFFSET_CONT; + + virgl_emit_shader_header(ctx, handle, len, type, offlen, num_tokens); + + virgl_emit_shader_streamout(ctx, first_pass ? &shader->stream_output : NULL); + + virgl_encoder_write_block(ctx->cbuf, (uint8_t *)sptr, length); + + sptr += length; + first_pass = false; + left_bytes -= length; } - virgl_encoder_write_block(ctx->cbuf, (uint8_t *)str, shader_len); if (str != shad_str) FREE(str);