diff --git a/basis/cpu/x86/assembler/assembler-tests.factor b/basis/cpu/x86/assembler/assembler-tests.factor index 14d4a1dd7c..47d6434279 100644 --- a/basis/cpu/x86/assembler/assembler-tests.factor +++ b/basis/cpu/x86/assembler/assembler-tests.factor @@ -71,6 +71,7 @@ IN: cpu.x86.assembler.tests ! sse shift instructions [ { HEX: 66 HEX: 0f HEX: 71 HEX: d0 HEX: 05 } ] [ [ XMM0 5 PSRLW ] { } make ] unit-test +[ { HEX: 66 HEX: 0f HEX: d1 HEX: c1 } ] [ [ XMM0 XMM1 PSRLW ] { } make ] unit-test ! sse comparison instructions [ { HEX: 66 HEX: 0f HEX: c2 HEX: c1 HEX: 02 } ] [ [ XMM0 XMM1 CMPLEPD ] { } make ] unit-test diff --git a/basis/cpu/x86/assembler/assembler.factor b/basis/cpu/x86/assembler/assembler.factor index cefc190105..2b99513fc1 100644 --- a/basis/cpu/x86/assembler/assembler.factor +++ b/basis/cpu/x86/assembler/assembler.factor @@ -583,24 +583,57 @@ ALIAS: PINSRQ PINSRD : MAXPD ( dest src -- ) HEX: 5f HEX: 66 2-operand-rm-sse ; : MAXSD ( dest src -- ) HEX: 5f HEX: f2 2-operand-rm-sse ; : MAXSS ( dest src -- ) HEX: 5f HEX: f3 2-operand-rm-sse ; +: PUNPCKLBW ( dest src -- ) HEX: 60 HEX: 66 2-operand-rm-sse ; +: PUNPCKLWD ( dest src -- ) HEX: 61 HEX: 66 2-operand-rm-sse ; +: PUNPCKLDQ ( dest src -- ) HEX: 62 HEX: 66 2-operand-rm-sse ; +: PACKSSWB ( dest src -- ) HEX: 63 HEX: 66 2-operand-rm-sse ; +: PCMPGTB ( dest src -- ) HEX: 64 HEX: 66 2-operand-rm-sse ; +: PCMPGTW ( dest src -- ) HEX: 65 HEX: 66 2-operand-rm-sse ; +: PCMPGTD ( dest src -- ) HEX: 66 HEX: 66 2-operand-rm-sse ; +: PACKUSWB ( dest src -- ) HEX: 67 HEX: 66 2-operand-rm-sse ; +: PUNPCKHBW ( dest src -- ) HEX: 68 HEX: 66 2-operand-rm-sse ; +: PUNPCKHWD ( dest src -- ) HEX: 69 HEX: 66 2-operand-rm-sse ; +: PUNPCKHDQ ( dest src -- ) HEX: 6a HEX: 66 2-operand-rm-sse ; +: PACKSSDW ( dest src -- ) HEX: 6b HEX: 66 2-operand-rm-sse ; : PUNPCKLQDQ ( dest src -- ) HEX: 6c HEX: 66 2-operand-rm-sse ; : PUNPCKHQDQ ( dest src -- ) HEX: 6d HEX: 66 2-operand-rm-sse ; +: MOVD ( dest src -- ) { HEX: 6e HEX: 7e } HEX: 66 2-operand-rm-mr-sse ; : MOVDQA ( dest src -- ) { HEX: 6f HEX: 7f } HEX: 66 2-operand-rm-mr-sse ; : MOVDQU ( dest src -- ) { HEX: 6f HEX: 7f } HEX: f3 2-operand-rm-mr-sse ; : PSHUFD ( dest src imm -- ) HEX: 70 HEX: 66 3-operand-rm-sse ; : PSHUFLW ( dest src imm -- ) HEX: 70 HEX: f2 3-operand-rm-sse ; : PSHUFHW ( dest src imm -- ) HEX: 70 HEX: f3 3-operand-rm-sse ; -: PSRLW ( dest imm -- ) BIN: 010 HEX: 71 HEX: 66 2-operand-sse-shift ; -: PSRAW ( dest imm -- ) BIN: 100 HEX: 71 HEX: 66 2-operand-sse-shift ; -: PSLLW ( dest imm -- ) BIN: 110 HEX: 71 HEX: 66 2-operand-sse-shift ; -: PSRLD ( dest imm -- ) BIN: 010 HEX: 72 HEX: 66 2-operand-sse-shift ; -: PSRAD ( dest imm -- ) BIN: 100 HEX: 72 HEX: 66 2-operand-sse-shift ; -: PSLLD ( dest imm -- ) BIN: 110 HEX: 72 HEX: 66 2-operand-sse-shift ; -: PSRLQ ( dest imm -- ) BIN: 010 HEX: 73 HEX: 66 2-operand-sse-shift ; + +: (PSRLW-imm) ( dest imm -- ) BIN: 010 HEX: 71 HEX: 66 2-operand-sse-shift ; +: (PSRAW-imm) ( dest imm -- ) BIN: 100 HEX: 71 HEX: 66 2-operand-sse-shift ; +: (PSLLW-imm) ( dest imm -- ) BIN: 110 HEX: 71 HEX: 66 2-operand-sse-shift ; +: (PSRLD-imm) ( dest imm -- ) BIN: 010 HEX: 72 HEX: 66 2-operand-sse-shift ; +: (PSRAD-imm) ( dest imm -- ) BIN: 100 HEX: 72 HEX: 66 2-operand-sse-shift ; +: (PSLLD-imm) ( dest imm -- ) BIN: 110 HEX: 72 HEX: 66 2-operand-sse-shift ; +: (PSRLQ-imm) ( dest imm -- ) BIN: 010 HEX: 73 HEX: 66 2-operand-sse-shift ; +: (PSLLQ-imm) ( dest imm -- ) BIN: 110 HEX: 73 HEX: 66 2-operand-sse-shift ; + +: (PSRLW-reg) ( dest src -- ) HEX: d1 HEX: 66 2-operand-rm-sse ; +: (PSRLD-reg) ( dest src -- ) HEX: d2 HEX: 66 2-operand-rm-sse ; +: (PSRLQ-reg) ( dest src -- ) HEX: d3 HEX: 66 2-operand-rm-sse ; +: (PSRAW-reg) ( dest src -- ) HEX: e1 HEX: 66 2-operand-rm-sse ; +: (PSRAD-reg) ( dest src -- ) HEX: e2 HEX: 66 2-operand-rm-sse ; +: (PSLLW-reg) ( dest src -- ) HEX: f1 HEX: 66 2-operand-rm-sse ; +: (PSLLD-reg) ( dest src -- ) HEX: f2 HEX: 66 2-operand-rm-sse ; +: (PSLLQ-reg) ( dest src -- ) HEX: f3 HEX: 66 2-operand-rm-sse ; + +: PSRLW ( dest src -- ) dup integer? [ (PSRLW-imm) ] [ (PSRLW-reg) ] if ; +: PSRAW ( dest src -- ) dup integer? [ (PSRAW-imm) ] [ (PSRAW-reg) ] if ; +: PSLLW ( dest src -- ) dup integer? [ (PSLLW-imm) ] [ (PSLLW-reg) ] if ; +: PSRLD ( dest src -- ) dup integer? [ (PSRLD-imm) ] [ (PSRLD-reg) ] if ; +: PSRAD ( dest src -- ) dup integer? [ (PSRAD-imm) ] [ (PSRAD-reg) ] if ; +: PSLLD ( dest src -- ) dup integer? [ (PSLLD-imm) ] [ (PSLLD-reg) ] if ; +: PSRLQ ( dest src -- ) dup integer? [ (PSRLQ-imm) ] [ (PSRLQ-reg) ] if ; +: PSLLQ ( dest src -- ) dup integer? [ (PSLLQ-imm) ] [ (PSLLQ-reg) ] if ; + : PSRLDQ ( dest imm -- ) BIN: 011 HEX: 73 HEX: 66 2-operand-sse-shift ; -: PSLLQ ( dest imm -- ) BIN: 110 HEX: 73 HEX: 66 2-operand-sse-shift ; : PSLLDQ ( dest imm -- ) BIN: 111 HEX: 73 HEX: 66 2-operand-sse-shift ; : PCMPEQB ( dest src -- ) HEX: 74 HEX: 66 2-operand-rm-sse ; @@ -611,11 +644,14 @@ ALIAS: PINSRQ PINSRD : HSUBPD ( dest src -- ) HEX: 7d HEX: 66 2-operand-rm-sse ; : HSUBPS ( dest src -- ) HEX: 7d HEX: f2 2-operand-rm-sse ; +: FXSAVE ( dest -- ) { BIN: 000 f { HEX: 0f HEX: ae } } 1-operand ; +: FXRSTOR ( src -- ) { BIN: 001 f { HEX: 0f HEX: ae } } 1-operand ; : LDMXCSR ( src -- ) { BIN: 010 f { HEX: 0f HEX: ae } } 1-operand ; : STMXCSR ( dest -- ) { BIN: 011 f { HEX: 0f HEX: ae } } 1-operand ; : LFENCE ( -- ) HEX: 0f , HEX: ae , OCT: 350 , ; : MFENCE ( -- ) HEX: 0f , HEX: ae , OCT: 360 , ; : SFENCE ( -- ) HEX: 0f , HEX: ae , OCT: 370 , ; +: CLFLUSH ( dest -- ) { BIN: 111 f { HEX: 0f HEX: ae } } 1-operand ; : POPCNT ( dest src -- ) HEX: b8 HEX: f3 2-operand-rm-sse ; @@ -664,26 +700,46 @@ ALIAS: PINSRQ PINSRD : ADDSUBPD ( dest src -- ) HEX: d0 HEX: 66 2-operand-rm-sse ; : ADDSUBPS ( dest src -- ) HEX: d0 HEX: f2 2-operand-rm-sse ; : PADDQ ( dest src -- ) HEX: d4 HEX: 66 2-operand-rm-sse ; +: PMULLW ( dest src -- ) HEX: d5 HEX: 66 2-operand-rm-sse ; +: PMOVMSKB ( dest src -- ) HEX: d7 HEX: 66 2-operand-rm-sse ; +: PSUBUSB ( dest src -- ) HEX: d8 HEX: 66 2-operand-rm-sse ; +: PSUBUSW ( dest src -- ) HEX: d9 HEX: 66 2-operand-rm-sse ; : PMINUB ( dest src -- ) HEX: da HEX: 66 2-operand-rm-sse ; +: PAND ( dest src -- ) HEX: db HEX: 66 2-operand-rm-sse ; +: PADDUSB ( dest src -- ) HEX: dc HEX: 66 2-operand-rm-sse ; +: PADDUSW ( dest src -- ) HEX: dd HEX: 66 2-operand-rm-sse ; : PMAXUB ( dest src -- ) HEX: de HEX: 66 2-operand-rm-sse ; +: PANDN ( dest src -- ) HEX: df HEX: 66 2-operand-rm-sse ; : PAVGB ( dest src -- ) HEX: e0 HEX: 66 2-operand-rm-sse ; : PAVGW ( dest src -- ) HEX: e3 HEX: 66 2-operand-rm-sse ; : PMULHUW ( dest src -- ) HEX: e4 HEX: 66 2-operand-rm-sse ; +: PMULHW ( dest src -- ) HEX: e5 HEX: 66 2-operand-rm-sse ; : CVTTPD2DQ ( dest src -- ) HEX: e6 HEX: 66 2-operand-rm-sse ; : CVTPD2DQ ( dest src -- ) HEX: e6 HEX: f2 2-operand-rm-sse ; : CVTDQ2PD ( dest src -- ) HEX: e6 HEX: f3 2-operand-rm-sse ; : MOVNTDQ ( dest src -- ) HEX: e7 HEX: 66 2-operand-mr-sse ; +: PSUBSB ( dest src -- ) HEX: e8 HEX: 66 2-operand-rm-sse ; +: PSUBSW ( dest src -- ) HEX: e9 HEX: 66 2-operand-rm-sse ; : PMINSW ( dest src -- ) HEX: ea HEX: 66 2-operand-rm-sse ; +: POR ( dest src -- ) HEX: eb HEX: 66 2-operand-rm-sse ; +: PADDSB ( dest src -- ) HEX: ec HEX: 66 2-operand-rm-sse ; +: PADDSW ( dest src -- ) HEX: ed HEX: 66 2-operand-rm-sse ; : PMAXSW ( dest src -- ) HEX: ee HEX: 66 2-operand-rm-sse ; +: PXOR ( dest src -- ) HEX: ef HEX: 66 2-operand-rm-sse ; : LDDQU ( dest src -- ) HEX: f0 HEX: f2 2-operand-rm-sse ; : PMULUDQ ( dest src -- ) HEX: f4 HEX: 66 2-operand-rm-sse ; +: PMADDWD ( dest src -- ) HEX: f5 HEX: 66 2-operand-rm-sse ; : PSADBW ( dest src -- ) HEX: f6 HEX: 66 2-operand-rm-sse ; - : MASKMOVDQU ( dest src -- ) HEX: f7 HEX: 66 2-operand-rm-sse ; - +: PSUBB ( dest src -- ) HEX: f8 HEX: 66 2-operand-rm-sse ; +: PSUBW ( dest src -- ) HEX: f9 HEX: 66 2-operand-rm-sse ; +: PSUBD ( dest src -- ) HEX: fa HEX: 66 2-operand-rm-sse ; : PSUBQ ( dest src -- ) HEX: fb HEX: 66 2-operand-rm-sse ; +: PADDB ( dest src -- ) HEX: fc HEX: 66 2-operand-rm-sse ; +: PADDW ( dest src -- ) HEX: fd HEX: 66 2-operand-rm-sse ; +: PADDD ( dest src -- ) HEX: fe HEX: 66 2-operand-rm-sse ; ! x86-64 branch prediction hints diff --git a/extra/gpu/demos/bunny/sobel.f.glsl b/extra/gpu/demos/bunny/sobel.f.glsl index 16d2e408f2..7d21baf2d0 100644 --- a/extra/gpu/demos/bunny/sobel.f.glsl +++ b/extra/gpu/demos/bunny/sobel.f.glsl @@ -37,7 +37,7 @@ border_factor(vec2 texcoord) void main() { - gl_FragColor = /*vec4(border_factor(texcoord));*/ mix( + gl_FragColor = mix( texture2D(color_texture, texcoord), line_color, border_factor(texcoord) diff --git a/extra/gpu/render/render.factor b/extra/gpu/render/render.factor index ce6e0e25ff..8f1679bfa8 100644 --- a/extra/gpu/render/render.factor +++ b/extra/gpu/render/render.factor @@ -8,7 +8,7 @@ gpu.textures gpu.textures.private half-floats images kernel lexer locals math math.order math.parser namespaces opengl opengl.gl parser quotations sequences slots sorting specialized-arrays.alien specialized-arrays.float specialized-arrays.int -specialized-arrays.uint strings tr ui.gadgets.worlds variants +specialized-arrays.uint strings ui.gadgets.worlds variants vocabs.parser words ; IN: gpu.render @@ -338,8 +338,6 @@ DEFER: [bind-uniform-tuple] texture-unit' value>>-quot { value-cleave 2cleave } append ; -TR: hyphens>underscores "-" "_" ; - :: [bind-uniform] ( texture-unit uniform prefix -- texture-unit' quot ) prefix uniform name>> append hyphens>underscores :> name uniform uniform-type>> :> type diff --git a/extra/gpu/shaders/shaders.factor b/extra/gpu/shaders/shaders.factor index d2dd29595a..58633d4a71 100755 --- a/extra/gpu/shaders/shaders.factor +++ b/extra/gpu/shaders/shaders.factor @@ -8,7 +8,7 @@ io.encodings.ascii io.files io.pathnames kernel lexer literals locals math math.parser memoize multiline namespaces opengl opengl.gl opengl.shaders parser quotations sequences specialized-arrays.alien specialized-arrays.int splitting -strings ui.gadgets.worlds variants vectors vocabs vocabs.loader +strings tr ui.gadgets.worlds variants vectors vocabs vocabs.loader vocabs.parser words words.constant ; IN: gpu.shaders @@ -65,6 +65,8 @@ MEMO: output-index ( program-instance output-name -- index ) underscores "-" "_" ; + : gl-vertex-type ( component-type -- gl-type ) { { ubyte-components [ GL_UNSIGNED_BYTE ] } @@ -125,12 +127,12 @@ MEMO: output-index ( program-instance output-name -- index ) } 0&& [ vertex-attribute inaccurate-feedback-attribute-error ] unless ; :: [bind-vertex-attribute] ( stride offset vertex-attribute -- stride offset' quot ) - vertex-attribute name>> :> name - vertex-attribute component-type>> :> type - type gl-vertex-type :> gl-type - vertex-attribute dim>> :> dim - vertex-attribute normalize?>> >c-bool :> normalize? - vertex-attribute vertex-attribute-size :> size + vertex-attribute name>> hyphens>underscores :> name + vertex-attribute component-type>> :> type + type gl-vertex-type :> gl-type + vertex-attribute dim>> :> dim + vertex-attribute normalize?>> >c-bool :> normalize? + vertex-attribute vertex-attribute-size :> size stride offset size + {