| /* |
| * Copyright (C) 2008 Nicolai Haehnle. |
| * |
| * All Rights Reserved. |
| * |
| * 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 (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 NONINFRINGEMENT. |
| * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS 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 __RADEON_PROGRAM_PAIR_H_ |
| #define __RADEON_PROGRAM_PAIR_H_ |
| |
| #include "radeon_program.h" |
| |
| |
| /** |
| * Represents a paired instruction, as found in R300 and R500 |
| * fragment programs. |
| */ |
| struct radeon_pair_instruction_source { |
| GLuint Index:8; |
| GLuint Constant:1; |
| GLuint Used:1; |
| }; |
| |
| struct radeon_pair_instruction_rgb { |
| GLuint Opcode:8; |
| GLuint DestIndex:8; |
| GLuint WriteMask:3; |
| GLuint OutputWriteMask:3; |
| GLuint Saturate:1; |
| |
| struct radeon_pair_instruction_source Src[3]; |
| |
| struct { |
| GLuint Source:2; |
| GLuint Swizzle:9; |
| GLuint Abs:1; |
| GLuint Negate:1; |
| } Arg[3]; |
| }; |
| |
| struct radeon_pair_instruction_alpha { |
| GLuint Opcode:8; |
| GLuint DestIndex:8; |
| GLuint WriteMask:1; |
| GLuint OutputWriteMask:1; |
| GLuint DepthWriteMask:1; |
| GLuint Saturate:1; |
| |
| struct radeon_pair_instruction_source Src[3]; |
| |
| struct { |
| GLuint Source:2; |
| GLuint Swizzle:3; |
| GLuint Abs:1; |
| GLuint Negate:1; |
| } Arg[3]; |
| }; |
| |
| struct radeon_pair_instruction { |
| struct radeon_pair_instruction_rgb RGB; |
| struct radeon_pair_instruction_alpha Alpha; |
| }; |
| |
| |
| /** |
| * |
| */ |
| struct radeon_pair_handler { |
| /** |
| * Fill in the proper hardware index for the given constant register. |
| * |
| * @return GL_FALSE on error. |
| */ |
| GLboolean (*EmitConst)(void*, GLuint file, GLuint index, GLuint *hwindex); |
| |
| /** |
| * Write a paired instruction to the hardware. |
| * |
| * @return GL_FALSE on error. |
| */ |
| GLboolean (*EmitPaired)(void*, struct radeon_pair_instruction*); |
| |
| /** |
| * Write a texture instruction to the hardware. |
| * Register indices have already been rewritten to the allocated |
| * hardware register numbers. |
| * |
| * @return GL_FALSE on error. |
| */ |
| GLboolean (*EmitTex)(void*, struct prog_instruction*); |
| |
| /** |
| * Called before a block of contiguous, independent texture |
| * instructions is emitted. |
| */ |
| GLboolean (*BeginTexBlock)(void*); |
| |
| GLuint MaxHwTemps; |
| }; |
| |
| GLboolean radeonPairProgram(GLcontext *ctx, struct gl_program *program, |
| const struct radeon_pair_handler*, void *userdata); |
| |
| void radeonPrintPairInstruction(struct radeon_pair_instruction *inst); |
| |
| #endif /* __RADEON_PROGRAM_PAIR_H_ */ |