ReactOS 0.4.17-dev-934-g091855f
ffp_hlsl.c File Reference
#include "wined3d_private.h"
#include <vkd3d_shader.h>
Include dependency graph for ffp_hlsl.c:

Go to the source code of this file.

Functions

 WINE_DEFAULT_DEBUG_CHANNEL (d3d_shader)
 
static const char * get_material_colour_source (enum wined3d_material_color_source mcs, const char *material)
 
static void generate_lighting_footer (struct wined3d_string_buffer *buffer, const struct wined3d_ffp_vs_settings *settings, unsigned int idx, bool legacy_lighting)
 
static void generate_lighting (struct wined3d_string_buffer *buffer, const struct wined3d_ffp_vs_settings *settings, bool legacy_lighting)
 
static bool ffp_hlsl_generate_vertex_shader (const struct wined3d_ffp_vs_settings *settings, struct wined3d_string_buffer *buffer, bool legacy_lighting)
 
static const char * get_fragment_op_arg (struct wined3d_string_buffer *buffer, unsigned int argnum, unsigned int stage, unsigned int arg)
 
static void generate_fragment_op (struct wined3d_string_buffer *buffer, unsigned int stage, bool color, bool alpha, bool tmp_dst, unsigned int op, unsigned int dw_arg0, unsigned int dw_arg1, unsigned int dw_arg2)
 
static bool ffp_hlsl_generate_pixel_shader (const struct ffp_frag_settings *settings, struct wined3d_string_buffer *buffer)
 
static bool compile_hlsl_shader (const struct wined3d_string_buffer *hlsl, struct vkd3d_shader_code *sm1, const char *profile)
 
bool ffp_hlsl_compile_vs (const struct wined3d_ffp_vs_settings *settings, struct wined3d_shader_desc *shader_desc, struct wined3d_device *device)
 
bool ffp_hlsl_compile_ps (const struct ffp_frag_settings *settings, struct wined3d_shader_desc *shader_desc)
 

Function Documentation

◆ compile_hlsl_shader()

static bool compile_hlsl_shader ( const struct wined3d_string_buffer *  hlsl,
struct vkd3d_shader_code *  sm1,
const char *  profile 
)
static

Definition at line 904 of file ffp_hlsl.c.

906{
909 char *messages;
910 int ret;
911
912 compile_info.source.code = hlsl->buffer;
913 compile_info.source.size = hlsl->content_size;
916 compile_info.log_level = VKD3D_SHADER_LOG_WARNING;
917
918 compile_info.next = &hlsl_source_info;
919 hlsl_source_info.profile = profile;
920
921 ret = vkd3d_shader_compile(&compile_info, sm1, &messages);
922 if (messages && *messages && FIXME_ON(d3d_shader))
923 {
924 const char *ptr, *end, *line;
925
926 FIXME("Shader log:\n");
927 ptr = messages;
928 end = ptr + strlen(ptr);
929 while ((line = wined3d_get_line(&ptr, end)))
930 FIXME(" %.*s", (int)(ptr - line), line);
931 FIXME("\n");
932 }
934
935 if (ret < 0)
936 {
937 ERR("Failed to compile HLSL, ret %d.\n", ret);
938 return false;
939 }
940
941 return true;
942}
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
return ret
Definition: mutex.c:147
GLuint GLuint end
Definition: gl.h:1545
#define profile
Definition: kernel32.h:12
static PVOID ptr
Definition: dispmode.c:27
#define FIXME_ON(ch)
Definition: debug.h:418
Definition: parser.c:49
struct vkd3d_shader_code source
enum vkd3d_shader_log_level log_level
enum vkd3d_shader_structure_type type
enum vkd3d_shader_source_type source_type
enum vkd3d_shader_target_type target_type
enum vkd3d_shader_structure_type type
@ VKD3D_SHADER_SOURCE_HLSL
@ VKD3D_SHADER_LOG_WARNING
@ VKD3D_SHADER_STRUCTURE_TYPE_COMPILE_INFO
Definition: vkd3d_shader.h:68
@ VKD3D_SHADER_STRUCTURE_TYPE_HLSL_SOURCE_INFO
Definition: vkd3d_shader.h:84
VKD3D_SHADER_API int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_code *out, char **messages)
@ VKD3D_SHADER_TARGET_D3D_BYTECODE
VKD3D_SHADER_API void vkd3d_shader_free_messages(char *messages)
static const char * wined3d_get_line(const char **ptr, const char *end)

Referenced by ffp_hlsl_compile_ps(), and ffp_hlsl_compile_vs().

◆ ffp_hlsl_compile_ps()

bool ffp_hlsl_compile_ps ( const struct ffp_frag_settings *  settings,
struct wined3d_shader_desc *  shader_desc 
)

Definition at line 971 of file ffp_hlsl.c.

972{
974 struct vkd3d_shader_code sm1;
975
976 if (!string_buffer_init(&string))
977 return false;
978
980 {
981 string_buffer_free(&string);
982 return false;
983 }
984
985 if (!compile_hlsl_shader(&string, &sm1, "ps_2_a"))
986 {
987 string_buffer_free(&string);
988 return false;
989 }
990 string_buffer_free(&string);
991
992 shader_desc->byte_code = sm1.code;
993 shader_desc->byte_code_size = ~(size_t)0;
994 return true;
995}
struct mke2fs_defaults settings[]
void string_buffer_free(struct wined3d_string_buffer *buffer)
Definition: shader.c:430
BOOL string_buffer_init(struct wined3d_string_buffer *buffer)
Definition: shader.c:417
unsigned int size_t
Definition: corecrt.h:203
static bool compile_hlsl_shader(const struct wined3d_string_buffer *hlsl, struct vkd3d_shader_code *sm1, const char *profile)
Definition: ffp_hlsl.c:904
static bool ffp_hlsl_generate_pixel_shader(const struct ffp_frag_settings *settings, struct wined3d_string_buffer *buffer)
Definition: ffp_hlsl.c:616
const DWORD * byte_code
Definition: wined3d.h:2105
size_t byte_code_size
Definition: wined3d.h:2106

Referenced by wined3d_shader_init_object().

◆ ffp_hlsl_compile_vs()

bool ffp_hlsl_compile_vs ( const struct wined3d_ffp_vs_settings *  settings,
struct wined3d_shader_desc *  shader_desc,
struct wined3d_device *  device 
)

Definition at line 944 of file ffp_hlsl.c.

946{
948 struct vkd3d_shader_code sm1;
949
950 if (!string_buffer_init(&string))
951 return false;
952
954 {
955 string_buffer_free(&string);
956 return false;
957 }
958
959 if (!compile_hlsl_shader(&string, &sm1, "vs_2_a"))
960 {
961 string_buffer_free(&string);
962 return false;
963 }
964 string_buffer_free(&string);
965
966 shader_desc->byte_code = sm1.code;
967 shader_desc->byte_code_size = ~(size_t)0;
968 return true;
969}
static bool ffp_hlsl_generate_vertex_shader(const struct wined3d_ffp_vs_settings *settings, struct wined3d_string_buffer *buffer, bool legacy_lighting)
Definition: ffp_hlsl.c:199
Definition: devices.h:37
#define WINED3D_LEGACY_FFP_LIGHTING
Definition: wined3d.h:1329

Referenced by wined3d_shader_init_object().

◆ ffp_hlsl_generate_pixel_shader()

static bool ffp_hlsl_generate_pixel_shader ( const struct ffp_frag_settings *  settings,
struct wined3d_string_buffer *  buffer 
)
static

Definition at line 616 of file ffp_hlsl.c.

618{
619 uint8_t tex_map = 0;
620 unsigned int i;
621
622 /* Find out which textures are read. */
623 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
624 {
625 unsigned int arg0, arg1, arg2;
626
627 if (settings->op[i].cop == WINED3D_TOP_DISABLE)
628 break;
629
630 arg0 = settings->op[i].carg0 & WINED3DTA_SELECTMASK;
631 arg1 = settings->op[i].carg1 & WINED3DTA_SELECTMASK;
632 arg2 = settings->op[i].carg2 & WINED3DTA_SELECTMASK;
633
635 || (i == 0 && settings->color_key_enabled))
636 tex_map |= 1u << i;
637
638 switch (settings->op[i].cop)
639 {
644 tex_map |= 1u << i;
645 break;
646
647 default:
648 break;
649 }
650
651 if (settings->op[i].aop == WINED3D_TOP_DISABLE)
652 continue;
653
654 arg0 = settings->op[i].aarg0 & WINED3DTA_SELECTMASK;
655 arg1 = settings->op[i].aarg1 & WINED3DTA_SELECTMASK;
656 arg2 = settings->op[i].aarg2 & WINED3DTA_SELECTMASK;
657
659 tex_map |= 1u << i;
660 }
661
662 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
663 {
664 const char *sampler_type;
665
666 if (!(tex_map & (1u << i)))
667 continue;
668
669 switch (settings->op[i].tex_type)
670 {
672 sampler_type = "1D";
673 break;
675 sampler_type = "2D";
676 break;
678 sampler_type = "3D";
679 break;
681 sampler_type = "CUBE";
682 break;
683 default:
684 FIXME("Unhandled sampler type %#x.\n", settings->op[i].tex_type);
685 sampler_type = NULL;
686 break;
687 }
688 if (sampler_type)
689 shader_addline(buffer, "sampler%s ps_sampler%u : register(s%u);\n", sampler_type, i, i);
690
691 shader_addline(buffer, "static float4 tex%u;\n", i);
692 }
693
694 /* This must be kept in sync with struct wined3d_ffp_vs_constants. */
695 shader_addline(buffer, "uniform struct\n");
696 shader_addline(buffer, "{\n");
697 shader_addline(buffer, " float4 texture_constants[%u];\n", WINED3D_MAX_FFP_TEXTURES);
698 shader_addline(buffer, " float4 texture_factor;\n");
699 shader_addline(buffer, " float4 specular_enable;\n");
700 shader_addline(buffer, " float4 color_key[2];\n");
701 /* Bumpenv constants are manually packed. */
702 shader_addline(buffer, " float4 bumpenv_matrices[%u];\n", WINED3D_MAX_FFP_TEXTURES);
703 shader_addline(buffer, " float4 bumpenv_lscale[2];\n");
704 shader_addline(buffer, " float4 bumpenv_loffset[2];\n");
705 shader_addline(buffer, "} c;\n");
706
707 shader_addline(buffer, "struct input\n");
708 shader_addline(buffer, "{\n");
709 shader_addline(buffer, " float4 pos : POSITION;\n");
710 shader_addline(buffer, " float4 diffuse : COLOR0;\n");
711 shader_addline(buffer, " float4 specular : COLOR1;\n");
712 shader_addline(buffer, " float4 texcoord[%u] : TEXCOORD;\n", WINED3D_MAX_FFP_TEXTURES);
713 shader_addline(buffer, "};\n\n");
714
715 shader_addline(buffer, "struct output\n");
716 shader_addline(buffer, "{\n");
717 shader_addline(buffer, " float4 colour : COLOR;\n");
718 shader_addline(buffer, "};\n\n");
719
720 shader_addline(buffer, "void main(in struct input i, out struct output o)\n");
721 shader_addline(buffer, "{\n");
722
723 shader_addline(buffer, " float4 texcoord[%u];\n", WINED3D_MAX_FFP_TEXTURES);
724 shader_addline(buffer, " float4 temp_reg = 0.0;\n\n");
725 shader_addline(buffer, " float4 ret, arg0, arg1, arg2;\n\n");
726
727 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
728 {
729 if (tex_map & (1u << i))
730 {
731 if (settings->pointsprite || (settings->texcoords_initialized & (1u << i)))
732 shader_addline(buffer, " texcoord[%u] = i.texcoord[%u];\n", i, i);
733 else
734 shader_addline(buffer, " texcoord[%u] = 0.0;\n", i);
735 }
736 }
737
738 /* Texture sampling. */
739
740 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES && settings->op[i].cop != WINED3D_TOP_DISABLE; ++i)
741 {
742 const char *texture_function, *coord_mask;
743 bool proj;
744
745 if (!(tex_map & (1u << i)))
746 continue;
747
748 if (settings->op[i].projected == WINED3D_PROJECTION_NONE)
749 {
750 proj = false;
751 }
752 else if (settings->op[i].projected == WINED3D_PROJECTION_COUNT4
753 || settings->op[i].projected == WINED3D_PROJECTION_COUNT3)
754 {
755 proj = true;
756 }
757 else
758 {
759 FIXME("Unexpected projection mode %d.\n", settings->op[i].projected);
760 proj = true;
761 }
762
763 switch (settings->op[i].tex_type)
764 {
766 texture_function = "tex1D";
767 coord_mask = "x";
768 break;
770 texture_function = "tex2D";
771 coord_mask = "xy";
772 break;
774 texture_function = "tex3D";
775 coord_mask = "xyz";
776 break;
778 texture_function = "texCUBE";
779 coord_mask = "xyz";
780 break;
781 default:
782 FIXME("Unhandled texture type %#x.\n", settings->op[i].tex_type);
783 texture_function = "";
784 coord_mask = "xyzw";
785 proj = false;
786 break;
787 }
788
789 if (proj)
790 coord_mask = "xyzw";
791
792 if (i > 0
793 && (settings->op[i - 1].cop == WINED3D_TOP_BUMPENVMAP
794 || settings->op[i - 1].cop == WINED3D_TOP_BUMPENVMAP_LUMINANCE))
795 {
796 shader_addline(buffer, "ret.xy = mul(transpose((float2x2)c.bumpenv_matrices[%u]), tex%u.xy);\n", i - 1, i - 1);
797
798 /* With projective textures, texbem only divides the static texture
799 * coordinate, not the displacement, so multiply the displacement
800 * with the dividing parameter before sampling. */
801 if (settings->op[i].projected != WINED3D_PROJECTION_NONE)
802 {
803 if (settings->op[i].projected == WINED3D_PROJECTION_COUNT4)
804 {
805 shader_addline(buffer, "ret.xy = (ret.xy * texcoord[%u].w) + texcoord[%u].xy;\n", i, i);
806 shader_addline(buffer, "ret.zw = texcoord[%u].ww;\n", i);
807 }
808 else
809 {
810 shader_addline(buffer, "ret.xy = (ret.xy * texcoord[%u].z) + texcoord[%u].xy;\n", i, i);
811 shader_addline(buffer, "ret.zw = texcoord[%u].zz;\n", i);
812 }
813 }
814 else
815 {
816 shader_addline(buffer, "ret = texcoord[%u] + ret.xyxy;\n", i);
817 }
818
819 shader_addline(buffer, "tex%u = %s%s(ps_sampler%u, ret.%s);\n",
820 i, texture_function, proj ? "proj" : "", i, coord_mask);
821
822 if (settings->op[i - 1].cop == WINED3D_TOP_BUMPENVMAP_LUMINANCE)
823 {
824 shader_addline(buffer, "tex%u *= saturate(tex%u.z * c.bumpenv_lscale[%u][%u] + c.bumpenv_loffset[%u][%u]);\n",
825 i, i - 1, (i - 1) / 4, (i - 1) % 4, (i - 1) / 4, (i - 1) % 4);
826 }
827 }
828 else if (settings->op[i].projected == WINED3D_PROJECTION_COUNT3)
829 {
830 shader_addline(buffer, " tex%u = %s%s(ps_sampler%u, texcoord[%u].xyzz);\n",
831 i, texture_function, proj ? "proj" : "", i, i);
832 }
833 else
834 {
835 shader_addline(buffer, " tex%u = %s%s(ps_sampler%u, texcoord[%u].%s);\n",
836 i, texture_function, proj ? "proj" : "", i, i, coord_mask);
837 }
838 }
839
840 if (settings->color_key_enabled)
841 {
842 shader_addline(buffer, " if (all(tex0 >= c.color_key[0]) && all(tex0 < c.color_key[1]))\n");
843 shader_addline(buffer, " discard;\n");
844 }
845
846 shader_addline(buffer, " ret = i.diffuse;\n");
847
848 for (i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
849 {
850 bool op_equal;
851
852 if (settings->op[i].cop == WINED3D_TOP_DISABLE)
853 break;
854
855 if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG1
856 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG1)
857 op_equal = settings->op[i].carg1 == settings->op[i].aarg1;
858 else if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG1
859 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG2)
860 op_equal = settings->op[i].carg1 == settings->op[i].aarg2;
861 else if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG2
862 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG1)
863 op_equal = settings->op[i].carg2 == settings->op[i].aarg1;
864 else if (settings->op[i].cop == WINED3D_TOP_SELECT_ARG2
865 && settings->op[i].aop == WINED3D_TOP_SELECT_ARG2)
866 op_equal = settings->op[i].carg2 == settings->op[i].aarg2;
867 else
868 op_equal = settings->op[i].aop == settings->op[i].cop
869 && settings->op[i].carg0 == settings->op[i].aarg0
870 && settings->op[i].carg1 == settings->op[i].aarg1
871 && settings->op[i].carg2 == settings->op[i].aarg2;
872
873 if (settings->op[i].aop == WINED3D_TOP_DISABLE)
874 {
875 generate_fragment_op(buffer, i, true, false, settings->op[i].tmp_dst,
876 settings->op[i].cop, settings->op[i].carg0,
877 settings->op[i].carg1, settings->op[i].carg2);
878 }
879 else if (op_equal)
880 {
881 generate_fragment_op(buffer, i, true, true, settings->op[i].tmp_dst,
882 settings->op[i].cop, settings->op[i].carg0,
883 settings->op[i].carg1, settings->op[i].carg2);
884 }
885 else if (settings->op[i].cop != WINED3D_TOP_BUMPENVMAP
887 {
888 generate_fragment_op(buffer, i, true, false, settings->op[i].tmp_dst,
889 settings->op[i].cop, settings->op[i].carg0,
890 settings->op[i].carg1, settings->op[i].carg2);
891 generate_fragment_op(buffer, i, false, true, settings->op[i].tmp_dst,
892 settings->op[i].aop, settings->op[i].aarg0,
893 settings->op[i].aarg1, settings->op[i].aarg2);
894 }
895 }
896
897 shader_addline(buffer, " o.colour = i.specular * c.specular_enable + ret;\n");
898
899 shader_addline(buffer, "}\n");
900
901 return true;
902}
#define NULL
Definition: types.h:112
int shader_addline(struct wined3d_string_buffer *buffer, const char *format,...)
Definition: shader.c:467
unsigned char uint8_t
Definition: stdint.h:33
static void generate_fragment_op(struct wined3d_string_buffer *buffer, unsigned int stage, bool color, bool alpha, bool tmp_dst, unsigned int op, unsigned int dw_arg0, unsigned int dw_arg1, unsigned int dw_arg2)
Definition: ffp_hlsl.c:470
GLuint buffer
Definition: glext.h:5915
GLuint GLuint GLuint GLuint arg1
Definition: glext.h:9513
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
Definition: glext.h:9514
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define WINED3DTA_SELECTMASK
Definition: wined3d.h:880
@ WINED3D_TOP_SELECT_ARG1
Definition: wined3d.h:629
@ WINED3D_TOP_DISABLE
Definition: wined3d.h:628
@ WINED3D_TOP_BLEND_TEXTURE_ALPHA_PM
Definition: wined3d.h:642
@ WINED3D_TOP_BUMPENVMAP_LUMINANCE
Definition: wined3d.h:650
@ WINED3D_TOP_BUMPENVMAP
Definition: wined3d.h:649
@ WINED3D_TOP_SELECT_ARG2
Definition: wined3d.h:630
@ WINED3D_TOP_BLEND_TEXTURE_ALPHA
Definition: wined3d.h:640
#define WINED3D_MAX_FFP_TEXTURES
Definition: wined3d.h:1597
#define WINED3DTA_TEXTURE
Definition: wined3d.h:883
@ WINED3D_GL_RES_TYPE_TEX_3D
@ WINED3D_GL_RES_TYPE_TEX_CUBE
@ WINED3D_GL_RES_TYPE_TEX_2D
@ WINED3D_GL_RES_TYPE_TEX_1D
@ WINED3D_PROJECTION_COUNT3
@ WINED3D_PROJECTION_NONE
@ WINED3D_PROJECTION_COUNT4

Referenced by ffp_hlsl_compile_ps().

◆ ffp_hlsl_generate_vertex_shader()

static bool ffp_hlsl_generate_vertex_shader ( const struct wined3d_ffp_vs_settings *  settings,
struct wined3d_string_buffer *  buffer,
bool  legacy_lighting 
)
static

Definition at line 199 of file ffp_hlsl.c.

201{
202 struct wined3d_string_buffer texcoord;
203
204 /* This must be kept in sync with struct wined3d_ffp_vs_constants. */
205 shader_addline(buffer, "uniform struct\n");
206 shader_addline(buffer, "{\n");
207 shader_addline(buffer, " float4x4 modelview_matrices[%u];\n", MAX_VERTEX_BLENDS);
208 shader_addline(buffer, " float4x4 projection_matrix;\n");
209 shader_addline(buffer, " float4x4 texture_matrices[%u];\n", WINED3D_MAX_FFP_TEXTURES);
210 shader_addline(buffer, " float4 point_params;\n");
211 shader_addline(buffer, " struct\n");
212 shader_addline(buffer, " {\n");
213 shader_addline(buffer, " float4 diffuse;\n");
214 shader_addline(buffer, " float4 ambient;\n");
215 shader_addline(buffer, " float4 specular;\n");
216 shader_addline(buffer, " float4 emissive;\n");
217 shader_addline(buffer, " float power;\n");
218 shader_addline(buffer, " } material;\n");
219 shader_addline(buffer, " float4 ambient_colour;\n");
220 shader_addline(buffer, " struct\n");
221 shader_addline(buffer, " {\n");
222 shader_addline(buffer, " float4 diffuse, specular, ambient;\n");
223 shader_addline(buffer, " float4 position, direction;\n");
224 shader_addline(buffer, " float4 packed_params;\n");
225 shader_addline(buffer, " float4 attenuation;\n");
226 shader_addline(buffer, " } lights[%u];\n", WINED3D_MAX_ACTIVE_LIGHTS);
227 shader_addline(buffer, "} c;\n");
228
229 shader_addline(buffer, "struct input\n");
230 shader_addline(buffer, "{\n");
231 shader_addline(buffer, " float4 pos : POSITION;\n");
232 shader_addline(buffer, " float4 blend_weight : BLENDWEIGHT;\n");
233 shader_addline(buffer, " uint blend_indices : BLENDINDICES;\n");
234 shader_addline(buffer, " float3 normal : NORMAL;\n");
235 shader_addline(buffer, " float point_size : PSIZE;\n");
236 shader_addline(buffer, " float4 diffuse : COLOR0;\n");
237 shader_addline(buffer, " float4 specular : COLOR1;\n");
238 shader_addline(buffer, " float4 texcoord[%u] : TEXCOORD;\n", WINED3D_MAX_FFP_TEXTURES);
239 shader_addline(buffer, "};\n\n");
240
241 shader_addline(buffer, "struct output\n");
242 shader_addline(buffer, "{\n");
243 shader_addline(buffer, " float4 pos : POSITION;\n");
244 shader_addline(buffer, " float4 diffuse : COLOR0;\n");
245 shader_addline(buffer, " float4 specular : COLOR1;\n");
246 for (unsigned int i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
247 {
248 if (((settings->texgen[i] & 0xffff0000) != WINED3DTSS_TCI_PASSTHRU) || (settings->texcoords & (1u << i)))
249 shader_addline(buffer, " float4 texcoord%u : TEXCOORD%u;\n", i, i);
250 }
252 shader_addline(buffer, " float fogcoord : FOG;\n");
253 shader_addline(buffer, " float point_size : PSIZE;\n");
254 shader_addline(buffer, "};\n\n");
255
256 shader_addline(buffer, "float3 ffp_normalize(float3 n)\n{\n");
257 shader_addline(buffer, " float lensq = dot(n, n);\n");
258 shader_addline(buffer, " return lensq == 0.0 ? n : (n * rsqrt(lensq));\n");
259 shader_addline(buffer, "}\n\n");
260
261 shader_addline(buffer, "void main(in struct input i, out struct output o)\n");
262 shader_addline(buffer, "{\n");
263
264 shader_addline(buffer, " i.blend_weight[%u] = 1.0;\n", settings->vertexblends);
265
266 if (settings->transformed)
267 {
268 shader_addline(buffer, " float4 ec_pos = float4(i.pos.xyz, 1.0);\n");
269 /* We reuse the projection matrix to undo the transformation from clip
270 * coordinates to pixel coordinates. */
271 shader_addline(buffer, " float4 out_pos = mul(c.projection_matrix, ec_pos);\n\n");
272
273 /* Use a ternary; this is not the most natural way to write it but is
274 * nicer to the compiler. */
275 shader_addline(buffer, " o.pos = (i.pos.w == 0.0 ? out_pos : out_pos / i.pos.w);\n");
276 }
277 else
278 {
279 for (unsigned int i = 0; i < settings->vertexblends; ++i)
280 shader_addline(buffer, " i.blend_weight[%u] -= i.blend_weight[%u];\n", settings->vertexblends, i);
281
282 shader_addline(buffer, " float4 ec_pos = 0.0;\n\n");
283 for (unsigned int i = 0; i < settings->vertexblends + 1; ++i)
284 shader_addline(buffer, " ec_pos += i.blend_weight[%u] * mul(c.modelview_matrices[%u], float4(i.pos.xyz, 1.0));\n", i, i);
285
286 shader_addline(buffer, " o.pos = mul(c.projection_matrix, ec_pos);\n");
287 shader_addline(buffer, " ec_pos /= ec_pos.w;\n\n");
288 }
289
290 shader_addline(buffer, " float3 normal = 0.0;\n");
291 if (settings->normal)
292 {
293 if (!settings->vertexblends)
294 {
295 if (settings->transformed)
296 shader_addline(buffer, " normal = i.normal;\n");
297 else
298 shader_addline(buffer, " normal = mul((float3x3)c.modelview_matrices[1], i.normal);\n");
299 }
300 else
301 {
302 for (unsigned int i = 0; i < settings->vertexblends + 1; ++i)
303 {
304 if (settings->transformed)
305 shader_addline(buffer, " normal += i.blend_weight[%u] * i.normal;\n", i);
306 else
307 shader_addline(buffer, " normal += i.blend_weight[%u]"
308 " * mul((float3x3)c.modelview_matrices[%u], i.normal);\n", i, i);
309 }
310 }
311
312 if (settings->normalize)
313 shader_addline(buffer, " normal = ffp_normalize(normal);\n");
314 }
315
316 generate_lighting(buffer, settings, legacy_lighting);
317
318 string_buffer_init(&texcoord);
319 for (unsigned int i = 0; i < WINED3D_MAX_FFP_TEXTURES; ++i)
320 {
321 string_buffer_clear(&texcoord);
322
323 switch (settings->texgen[i] & 0xffff0000)
324 {
326 if (settings->texcoords & (1u << i))
327 shader_addline(&texcoord, "i.texcoord[%u]", settings->texgen[i] & 0x0000ffff);
328 else
329 continue;
330 break;
331
332 default:
333 FIXME("Unhandled texgen %#x.\n", settings->texgen[i]);
334 break;
335 }
336
337 if (settings->transformed)
338 shader_addline(buffer, " o.texcoord%u = %s;\n", i, texcoord.buffer);
339 else
340 shader_addline(buffer, " o.texcoord%u = mul(c.texture_matrices[%u], %s);\n", i, i, texcoord.buffer);
341 }
342 string_buffer_free(&texcoord);
343
344 switch (settings->fog_mode)
345 {
347 break;
348
350 /* This is FOGTABLEMODE == NONE, FOGVERTEXMODE == NONE.
351 * The specular W is used in that case, even if we output fogcoord,
352 * so there's no point in outputting fogcoord. */
353 break;
354
356 shader_addline(buffer, " o.fogcoord = length(ec_pos.xyz);\n");
357 break;
358
360 if (settings->transformed)
361 shader_addline(buffer, " o.fogcoord = ec_pos.z;\n");
362 else
363 shader_addline(buffer, " o.fogcoord = abs(o.pos.z);\n");
364 break;
365 }
366
367 shader_addline(buffer, " o.point_size = %s / sqrt(c.point_params.x"
368 " + c.point_params.y * length(ec_pos.xyz)"
369 " + c.point_params.z * dot(ec_pos.xyz, ec_pos.xyz));\n",
370 settings->per_vertex_point_size ? "i.point_size" : "c.point_params.w");
371
372 shader_addline(buffer, "}\n");
373
374 return true;
375}
void string_buffer_clear(struct wined3d_string_buffer *buffer)
Definition: shader.c:411
static void generate_lighting(struct wined3d_string_buffer *buffer, const struct wined3d_ffp_vs_settings *settings, bool legacy_lighting)
Definition: ffp_hlsl.c:64
#define WINED3DTSS_TCI_PASSTHRU
Definition: wined3d.h:874
#define WINED3D_MAX_ACTIVE_LIGHTS
@ WINED3D_FFP_VS_FOG_FOGCOORD
@ WINED3D_FFP_VS_FOG_OFF
@ WINED3D_FFP_VS_FOG_DEPTH
@ WINED3D_FFP_VS_FOG_RANGE
#define MAX_VERTEX_BLENDS

Referenced by ffp_hlsl_compile_vs().

◆ generate_fragment_op()

static void generate_fragment_op ( struct wined3d_string_buffer *  buffer,
unsigned int  stage,
bool  color,
bool  alpha,
bool  tmp_dst,
unsigned int  op,
unsigned int  dw_arg0,
unsigned int  dw_arg1,
unsigned int  dw_arg2 
)
static

Definition at line 470 of file ffp_hlsl.c.

472{
473 const char *dstmask, *dstreg, *arg0, *arg1, *arg2;
474
475 if (color && alpha)
476 dstmask = "";
477 else if (color)
478 dstmask = ".xyz";
479 else
480 dstmask = ".w";
481
482 dstreg = tmp_dst ? "temp_reg" : "ret";
483
484 arg0 = get_fragment_op_arg(buffer, 0, stage, dw_arg0);
485 arg1 = get_fragment_op_arg(buffer, 1, stage, dw_arg1);
486 arg2 = get_fragment_op_arg(buffer, 2, stage, dw_arg2);
487
488 switch (op)
489 {
491 break;
492
494 shader_addline(buffer, " %s%s = %s%s;\n", dstreg, dstmask, arg1, dstmask);
495 break;
496
498 shader_addline(buffer, " %s%s = %s%s;\n", dstreg, dstmask, arg2, dstmask);
499 break;
500
502 shader_addline(buffer, " %s%s = %s%s * %s%s;\n", dstreg, dstmask, arg1, dstmask, arg2, dstmask);
503 break;
504
506 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s * 4.0);\n",
507 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
508 break;
509
511 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s * 2.0);\n",
512 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
513 break;
514
515 case WINED3D_TOP_ADD:
516 shader_addline(buffer, " %s%s = saturate(%s%s + %s%s);\n",
517 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
518 break;
519
521 shader_addline(buffer, " %s%s = saturate(%s%s + (%s - 0.5)%s);\n",
522 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
523 break;
524
526 shader_addline(buffer, " %s%s = saturate((%s%s + (%s - 0.5)%s) * 2.0);\n",
527 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
528 break;
529
531 shader_addline(buffer, " %s%s = saturate(%s%s - %s%s);\n",
532 dstreg, dstmask, arg1, dstmask, arg2, dstmask);
533 break;
534
536 shader_addline(buffer, " %s%s = saturate((1.0 - %s)%s * %s%s + %s%s);\n",
537 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg1, dstmask);
538 break;
539
542 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
543 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
544 break;
545
548 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
549 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
550 break;
551
554 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
555 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
556 break;
557
560 shader_addline(buffer, " %s%s = saturate(%s%s * (1.0 - %s.w) + %s%s);\n",
561 dstreg, dstmask, arg2, dstmask, arg0, arg1, dstmask);
562 break;
563
566 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s.w);\n",
567 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0);
568 break;
569
571 shader_addline(buffer, " %s%s = saturate(%s%s * %s.w + %s%s);\n",
572 dstreg, dstmask, arg2, dstmask, arg1, arg1, dstmask);
573 break;
574
576 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s + %s.w);\n",
577 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg1);
578 break;
579
581 shader_addline(buffer, " %s%s = saturate(%s%s * (1.0 - %s.w) + %s%s);\n",
582 dstreg, dstmask, arg2, dstmask, arg1, arg1, dstmask);
583 break;
585 shader_addline(buffer, " %s%s = saturate((1.0 - %s)%s * %s%s + %s.w);\n",
586 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg1);
587 break;
588
591 /* These are handled in the first pass, nothing to do. */
592 break;
593
595 shader_addline(buffer, " %s%s = saturate(dot(%s.xyz - 0.5, %s.xyz - 0.5) * 4.0);\n",
596 dstreg, dstmask, arg1, arg2);
597 break;
598
600 shader_addline(buffer, " %s%s = saturate(%s%s * %s%s + %s%s);\n",
601 dstreg, dstmask, arg1, dstmask, arg2, dstmask, arg0, dstmask);
602 break;
603
604 case WINED3D_TOP_LERP:
605 /* MSDN isn't quite right here. */
606 shader_addline(buffer, " %s%s = lerp(%s%s, %s%s, %s%s);\n",
607 dstreg, dstmask, arg2, dstmask, arg1, dstmask, arg0, dstmask);
608 break;
609
610 default:
611 FIXME("Unhandled operation %#x.\n", op);
612 break;
613 }
614}
UINT op
Definition: effect.c:235
static const char * get_fragment_op_arg(struct wined3d_string_buffer *buffer, unsigned int argnum, unsigned int stage, unsigned int arg)
Definition: ffp_hlsl.c:377
GLclampf GLclampf GLclampf alpha
Definition: gl.h:1740
GLuint color
Definition: glext.h:6243
#define WINED3DTA_TFACTOR
Definition: wined3d.h:884
#define WINED3DTA_CURRENT
Definition: wined3d.h:882
@ WINED3D_TOP_BLEND_DIFFUSE_ALPHA
Definition: wined3d.h:639
@ WINED3D_TOP_ADD
Definition: wined3d.h:634
@ WINED3D_TOP_BLEND_CURRENT_ALPHA
Definition: wined3d.h:643
@ WINED3D_TOP_ADD_SIGNED_2X
Definition: wined3d.h:636
@ WINED3D_TOP_MODULATE_INVCOLOR_ADD_ALPHA
Definition: wined3d.h:648
@ WINED3D_TOP_MULTIPLY_ADD
Definition: wined3d.h:652
@ WINED3D_TOP_MODULATE_INVALPHA_ADD_COLOR
Definition: wined3d.h:647
@ WINED3D_TOP_SUBTRACT
Definition: wined3d.h:637
@ WINED3D_TOP_MODULATE_COLOR_ADD_ALPHA
Definition: wined3d.h:646
@ WINED3D_TOP_MODULATE
Definition: wined3d.h:631
@ WINED3D_TOP_MODULATE_4X
Definition: wined3d.h:633
@ WINED3D_TOP_LERP
Definition: wined3d.h:653
@ WINED3D_TOP_MODULATE_ALPHA_ADD_COLOR
Definition: wined3d.h:645
@ WINED3D_TOP_ADD_SIGNED
Definition: wined3d.h:635
@ WINED3D_TOP_DOTPRODUCT3
Definition: wined3d.h:651
@ WINED3D_TOP_ADD_SMOOTH
Definition: wined3d.h:638
@ WINED3D_TOP_MODULATE_2X
Definition: wined3d.h:632
@ WINED3D_TOP_BLEND_FACTOR_ALPHA
Definition: wined3d.h:641
#define WINED3DTA_DIFFUSE
Definition: wined3d.h:881

Referenced by ffp_hlsl_generate_pixel_shader().

◆ generate_lighting()

static void generate_lighting ( struct wined3d_string_buffer *  buffer,
const struct wined3d_ffp_vs_settings *  settings,
bool  legacy_lighting 
)
static

Definition at line 64 of file ffp_hlsl.c.

66{
67 const char *ambient, *diffuse, *specular, *emissive;
68 unsigned int idx = 0;
69
70 if (!settings->lighting)
71 {
72 if (settings->diffuse)
73 shader_addline(buffer, " o.diffuse = i.diffuse;\n");
74 else
75 shader_addline(buffer, " o.diffuse = 1.0;\n");
76 shader_addline(buffer, " o.specular = i.specular;\n");
77 return;
78 }
79
80 shader_addline(buffer, " float3 ambient = c.ambient_colour.xyz;\n");
81 shader_addline(buffer, " float3 diffuse = 0.0;\n");
82 shader_addline(buffer, " float3 dir, dst;\n");
83 shader_addline(buffer, " float att, t, range, falloff, cos_htheta, cos_hphi;\n");
84
85 if (settings->specular_enable)
86 shader_addline(buffer, " float4 specular = 0.0;\n");
87
88 ambient = get_material_colour_source(settings->ambient_source, "c.material.ambient");
89 diffuse = get_material_colour_source(settings->diffuse_source, "c.material.diffuse");
90 specular = get_material_colour_source(settings->specular_source, "c.material.specular");
91 emissive = get_material_colour_source(settings->emissive_source, "c.material.emissive");
92
93 for (unsigned int i = 0; i < settings->point_light_count; ++i)
94 {
95 shader_addline(buffer, " dir = c.lights[%u].position.xyz - ec_pos.xyz;\n", idx);
96 shader_addline(buffer, " dst.z = dot(dir, dir);\n");
97 shader_addline(buffer, " dst.y = sqrt(dst.z);\n");
98 shader_addline(buffer, " dst.x = 1.0;\n");
99
100 shader_addline(buffer, " range = c.lights[%u].packed_params.x;\n", idx);
101
102 if (legacy_lighting)
103 {
104 shader_addline(buffer, " dst.y = (range - dst.y) / range;\n");
105 shader_addline(buffer, " dst.z = dst.y * dst.y;\n");
106 shader_addline(buffer, " if (dst.y > 0.0)\n{\n");
107 shader_addline(buffer, " att = dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
108 }
109 else
110 {
111 shader_addline(buffer, " if (dst.y <= range)\n{\n");
112 shader_addline(buffer, " att = 1.0 / dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
113 }
114 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz * att;\n", idx);
115 if (settings->normal)
116 {
117 shader_addline(buffer, " dir = ffp_normalize(dir);\n");
118 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
119 }
120 shader_addline(buffer, " }\n");
121
122 ++idx;
123 }
124
125 for (unsigned int i = 0; i < settings->spot_light_count; ++i)
126 {
127 shader_addline(buffer, " dir = c.lights[%u].position.xyz - ec_pos.xyz;\n", idx);
128 shader_addline(buffer, " dst.z = dot(dir, dir);\n");
129 shader_addline(buffer, " dst.y = sqrt(dst.z);\n");
130 shader_addline(buffer, " dst.x = 1.0;\n");
131
132 shader_addline(buffer, " range = c.lights[%u].packed_params.x;\n", idx);
133 shader_addline(buffer, " falloff = c.lights[%u].packed_params.y;\n", idx);
134 shader_addline(buffer, " cos_htheta = c.lights[%u].packed_params.z;\n", idx);
135 shader_addline(buffer, " cos_hphi = c.lights[%u].packed_params.w;\n", idx);
136
137 if (legacy_lighting)
138 {
139 shader_addline(buffer, " dst.y = (range - dst.y) / range;\n");
140 shader_addline(buffer, " dst.z = dst.y * dst.y;\n");
141 shader_addline(buffer, " if (dst.y > 0.0)\n{\n");
142 }
143 else
144 {
145 shader_addline(buffer, " if (dst.y <= range)\n{\n");
146 }
147 shader_addline(buffer, " dir = ffp_normalize(dir);\n");
148 shader_addline(buffer, " t = dot(-dir, ffp_normalize(c.lights[%u].direction.xyz));\n", idx);
149 shader_addline(buffer, " if (t > cos_htheta) att = 1.0;\n");
150 shader_addline(buffer, " else if (t <= cos_hphi) att = 0.0;\n");
151 shader_addline(buffer, " else att = pow((t - cos_hphi) / (cos_htheta - cos_hphi), falloff);\n");
152 if (legacy_lighting)
153 shader_addline(buffer, " att *= dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
154 else
155 shader_addline(buffer, " att /= dot(dst.xyz, c.lights[%u].attenuation.xyz);\n", idx);
156 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz * att;\n", idx);
157 if (settings->normal)
158 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
159 shader_addline(buffer, " }\n");
160
161 ++idx;
162 }
163
164 for (unsigned int i = 0; i < settings->directional_light_count; ++i)
165 {
166 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz;\n", idx);
167 if (settings->normal)
168 {
169 shader_addline(buffer, " att = 1.0;\n");
170 shader_addline(buffer, " dir = ffp_normalize(c.lights[%u].direction.xyz);\n", idx);
171 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
172 }
173
174 ++idx;
175 }
176
177 for (unsigned int i = 0; i < settings->parallel_point_light_count; ++i)
178 {
179 shader_addline(buffer, " ambient += c.lights[%u].ambient.xyz;\n", idx);
180 if (settings->normal)
181 {
182 shader_addline(buffer, " att = 1.0;\n");
183 shader_addline(buffer, " dir = ffp_normalize(c.lights[%u].position.xyz);\n", idx);
184 generate_lighting_footer(buffer, settings, idx, legacy_lighting);
185 }
186
187 ++idx;
188 }
189
190 shader_addline(buffer, " o.diffuse.xyz = %s.xyz * ambient + %s.xyz * diffuse + %s.xyz;\n",
191 ambient, diffuse, emissive);
192 shader_addline(buffer, " o.diffuse.w = %s.w;\n", diffuse);
193 if (settings->specular_enable)
194 shader_addline(buffer, " o.specular = %s * specular;\n", specular);
195 else
196 shader_addline(buffer, " o.specular = i.specular;\n");
197}
unsigned int idx
Definition: utils.c:40
static const char * get_material_colour_source(enum wined3d_material_color_source mcs, const char *material)
Definition: ffp_hlsl.c:30
static void generate_lighting_footer(struct wined3d_string_buffer *buffer, const struct wined3d_ffp_vs_settings *settings, unsigned int idx, bool legacy_lighting)
Definition: ffp_hlsl.c:46
float specular[3]
Definition: d3drm.c:3534
float emissive[3]
Definition: d3drm.c:3535

Referenced by ffp_hlsl_generate_vertex_shader().

◆ generate_lighting_footer()

static void generate_lighting_footer ( struct wined3d_string_buffer *  buffer,
const struct wined3d_ffp_vs_settings *  settings,
unsigned int  idx,
bool  legacy_lighting 
)
static

Definition at line 46 of file ffp_hlsl.c.

48{
49 shader_addline(buffer, " diffuse += saturate(dot(dir, normal)) * c.lights[%u].diffuse.xyz * att;\n", idx);
50 if (settings->localviewer)
51 shader_addline(buffer, " t = dot(normal, ffp_normalize(dir - ffp_normalize(ec_pos.xyz)));\n");
52 else
53 shader_addline(buffer, " t = dot(normal, ffp_normalize(dir + float3(0.0, 0.0, -1.0)));\n");
54 if (settings->specular_enable)
55 {
56 shader_addline(buffer, " if (dot(dir, normal) > 0.0 && t > 0.0");
57 if (legacy_lighting)
58 shader_addline(buffer, " && c.material.power > 0.0");
59 shader_addline(buffer, ")\n");
60 shader_addline(buffer, " specular += pow(t, c.material.power) * c.lights[%u].specular * att;\n", idx);
61 }
62}

Referenced by generate_lighting().

◆ get_fragment_op_arg()

static const char * get_fragment_op_arg ( struct wined3d_string_buffer *  buffer,
unsigned int  argnum,
unsigned int  stage,
unsigned int  arg 
)
static

Definition at line 377 of file ffp_hlsl.c.

379{
380 const char *ret;
381
382 if (arg == ARG_UNUSED)
383 return "<unused arg>";
384
385 switch (arg & WINED3DTA_SELECTMASK)
386 {
388 ret = "i.diffuse";
389 break;
390
392 ret = "ret";
393 break;
394
396 switch (stage)
397 {
398 case 0: ret = "tex0"; break;
399 case 1: ret = "tex1"; break;
400 case 2: ret = "tex2"; break;
401 case 3: ret = "tex3"; break;
402 case 4: ret = "tex4"; break;
403 case 5: ret = "tex5"; break;
404 case 6: ret = "tex6"; break;
405 case 7: ret = "tex7"; break;
406 default:
407 ret = "<invalid texture>";
408 break;
409 }
410 break;
411
413 ret = "c.texture_factor";
414 break;
415
417 ret = "i.specular";
418 break;
419
420 case WINED3DTA_TEMP:
421 ret = "temp_reg";
422 break;
423
425 switch (stage)
426 {
427 case 0: ret = "c.texture_constants[0]"; break;
428 case 1: ret = "c.texture_constants[1]"; break;
429 case 2: ret = "c.texture_constants[2]"; break;
430 case 3: ret = "c.texture_constants[3]"; break;
431 case 4: ret = "c.texture_constants[4]"; break;
432 case 5: ret = "c.texture_constants[5]"; break;
433 case 6: ret = "c.texture_constants[6]"; break;
434 case 7: ret = "c.texture_constants[7]"; break;
435 default:
436 ret = "<invalid constant>";
437 break;
438 }
439 break;
440
441 default:
442 return "<unhandled arg>";
443 }
444
446 {
447 shader_addline(buffer, " arg%u = 1.0 - %s;\n", argnum, ret);
448 if (argnum == 0)
449 ret = "arg0";
450 else if (argnum == 1)
451 ret = "arg1";
452 else if (argnum == 2)
453 ret = "arg2";
454 }
455
457 {
458 shader_addline(buffer, " arg%u = %s.w;\n", argnum, ret);
459 if (argnum == 0)
460 ret = "arg0";
461 else if (argnum == 1)
462 ret = "arg1";
463 else if (argnum == 2)
464 ret = "arg2";
465 }
466
467 return ret;
468}
#define WINED3DTA_TEMP
Definition: wined3d.h:886
#define WINED3DTA_SPECULAR
Definition: wined3d.h:885
#define WINED3DTA_COMPLEMENT
Definition: wined3d.h:888
#define WINED3DTA_ALPHAREPLICATE
Definition: wined3d.h:889
#define WINED3DTA_CONSTANT
Definition: wined3d.h:887
#define ARG_UNUSED

Referenced by generate_fragment_op().

◆ get_material_colour_source()

static const char * get_material_colour_source ( enum wined3d_material_color_source  mcs,
const char *  material 
)
static

Definition at line 30 of file ffp_hlsl.c.

31{
32 switch (mcs)
33 {
35 return material;
37 return "i.diffuse";
39 return "i.specular";
40 default:
41 ERR("Invalid material color source %#x.\n", mcs);
42 return "<invalid>";
43 }
44}
static struct myctx * mcs
Definition: adnstest.c:53
@ WINED3D_MCS_COLOR2
Definition: wined3d.h:523
@ WINED3D_MCS_MATERIAL
Definition: wined3d.h:521
@ WINED3D_MCS_COLOR1
Definition: wined3d.h:522

Referenced by generate_lighting().

◆ WINE_DEFAULT_DEBUG_CHANNEL()

WINE_DEFAULT_DEBUG_CHANNEL ( d3d_shader  )