@@ -18,6 +18,7 @@ extern "C" {
1818typedef struct GX2AttribVar GX2AttribVar ;
1919typedef struct GX2AttribStream GX2AttribStream ;
2020typedef struct GX2FetchShader GX2FetchShader ;
21+ typedef struct GX2ComputeShader GX2ComputeShader ;
2122typedef struct GX2GeometryShader GX2GeometryShader ;
2223typedef struct GX2LoopVar GX2LoopVar ;
2324typedef struct GX2PixelShader GX2PixelShader ;
@@ -336,6 +337,57 @@ WUT_CHECK_OFFSET(GX2GeometryShader, 0x90, streamOutStride);
336337WUT_CHECK_OFFSET (GX2GeometryShader , 0xA0 , gx2rBuffer );
337338WUT_CHECK_SIZE (GX2GeometryShader , 0xB0 );
338339
340+ struct GX2ComputeShader
341+ {
342+ uint32_t regs [12 ];
343+
344+ uint32_t size ;
345+ void * program ;
346+
347+ uint32_t uniformBlockCount ;
348+ GX2UniformBlock * uniformBlocks ;
349+
350+ uint32_t uniformVarCount ;
351+ GX2UniformVar * uniformVars ;
352+
353+ uint32_t initialValueCount ;
354+ GX2UniformInitialValue * initialValues ;
355+
356+ uint32_t loopVarCount ;
357+ GX2LoopVar * loopVars ;
358+
359+ uint32_t samplerVarCount ;
360+ GX2SamplerVar * samplerVars ;
361+
362+ uint32_t workgroupSizeX ;
363+ uint32_t workgroupSizeY ;
364+ uint32_t workgroupSizeZ ;
365+ BOOL over64Mode ;
366+ uint32_t numWavesPerSimd ;
367+
368+ GX2RBuffer gx2rBuffer ;
369+ };
370+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x00 , regs );
371+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x30 , size );
372+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x34 , program );
373+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x38 , uniformBlockCount );
374+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x3C , uniformBlocks );
375+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x40 , uniformVarCount );
376+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x44 , uniformVars );
377+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x48 , initialValueCount );
378+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x4C , initialValues );
379+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x50 , loopVarCount );
380+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x54 , loopVars );
381+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x58 , samplerVarCount );
382+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x5C , samplerVars );
383+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x60 , workgroupSizeX );
384+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x64 , workgroupSizeY );
385+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x68 , workgroupSizeZ );
386+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x6C , over64Mode );
387+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x70 , numWavesPerSimd );
388+ WUT_CHECK_OFFSET (GX2ComputeShader , 0x74 , gx2rBuffer );
389+ WUT_CHECK_SIZE (GX2ComputeShader , 0x84 );
390+
339391struct GX2AttribStream
340392{
341393 uint32_t location ;
@@ -388,6 +440,9 @@ GX2SetPixelShader(const GX2PixelShader *shader);
388440void
389441GX2SetGeometryShader (const GX2GeometryShader * shader );
390442
443+ void
444+ GX2SetComputeShader (const GX2ComputeShader * shader );
445+
391446void
392447GX2SetVertexSampler (const GX2Sampler * sampler ,
393448 uint32_t id );
@@ -400,6 +455,10 @@ void
400455GX2SetGeometrySampler (const GX2Sampler * sampler ,
401456 uint32_t id );
402457
458+ void
459+ GX2SetComputeSampler (const GX2Sampler * sampler ,
460+ uint32_t id );
461+
403462void
404463GX2SetVertexUniformReg (uint32_t offset ,
405464 uint32_t count ,
@@ -425,6 +484,11 @@ GX2SetGeometryUniformBlock(uint32_t location,
425484 uint32_t size ,
426485 const void * data );
427486
487+ void
488+ GX2SetComputeUniformBlock (uint32_t location ,
489+ uint32_t size ,
490+ const void * data );
491+
428492void
429493GX2SetShaderModeEx (GX2ShaderMode mode ,
430494 uint32_t numVsGpr ,
@@ -502,6 +566,19 @@ GX2GetVertexUniformBlock(const GX2VertexShader *shader,
502566 return NULL ;
503567}
504568
569+ static inline GX2UniformBlock *
570+ GX2GetComputeUniformBlock (const GX2ComputeShader * shader ,
571+ const char * name )
572+ {
573+ for (uint32_t i = 0 ; i < shader -> uniformBlockCount ; ++ i ) {
574+ if (strcmp (name , shader -> uniformBlocks [i ].name ) == 0 ) {
575+ return & shader -> uniformBlocks [i ];
576+ }
577+ }
578+
579+ return NULL ;
580+ }
581+
505582static inline GX2UniformVar *
506583GX2GetGeometryUniformVar (const GX2GeometryShader * shader ,
507584 const char * name )
@@ -541,6 +618,19 @@ GX2GetVertexUniformVar(const GX2VertexShader *shader,
541618 return NULL ;
542619}
543620
621+ static inline GX2UniformVar *
622+ GX2GetComputeUniformVar (const GX2ComputeShader * shader ,
623+ const char * name )
624+ {
625+ for (uint32_t i = 0 ; i < shader -> uniformVarCount ; ++ i ) {
626+ if (strcmp (name , shader -> uniformVars [i ].name ) == 0 ) {
627+ return & shader -> uniformVars [i ];
628+ }
629+ }
630+
631+ return NULL ;
632+ }
633+
544634static inline void
545635GX2SetShaderMode (GX2ShaderMode mode )
546636{
0 commit comments