@@ -149,7 +149,8 @@ typedef struct SceGxmContext {
149149 /* Dirty state tracking */
150150 union {
151151 struct {
152- uint32_t shaders : 1 ;
152+ uint32_t vertex_shader : 1 ;
153+ uint32_t fragment_shader : 1 ;
153154 uint32_t depth_stencil : 1 ;
154155 uint32_t front_stencil : 1 ;
155156 uint32_t back_stencil : 1 ;
@@ -1351,8 +1352,8 @@ EXPORT(SceGxm, 0x31FF8ABD, void, sceGxmSetVertexProgram, SceGxmContext *context,
13511352 dkCmdBufBindVtxAttribState (context -> cmdbuf , vertex_attrib_state , vertexProgram -> attributeCount );
13521353 dkCmdBufBindVtxBufferState (context -> cmdbuf , vertex_buffer_state , vertexProgram -> streamCount );
13531354
1354- context -> state .vertex_program = vertexProgram ;
1355- context -> state .dirty .bit .shaders = true;
1355+ context -> state .vertex_program = vertexProgram ;
1356+ context -> state .dirty .bit .vertex_shader = true;
13561357}
13571358
13581359EXPORT (SceGxm , 0xAD2F48D9 , void , sceGxmSetFragmentProgram , SceGxmContext * context ,
@@ -1366,10 +1367,10 @@ EXPORT(SceGxm, 0xAD2F48D9, void, sceGxmSetFragmentProgram, SceGxmContext *contex
13661367 DkColorMask_A * !!(fragmentProgram -> blendInfo .colorMask & SCE_GXM_COLOR_MASK_A );
13671368
13681369 dkColorWriteStateSetMask (& context -> state .color_write , 0 , mask );
1369- context -> state .dirty .bit .color_write = true;
1370+ context -> state .dirty .bit .color_write = true;
13701371
1371- context -> state .fragment_program = fragmentProgram ;
1372- context -> state .dirty .bit .shaders = true;
1372+ context -> state .fragment_program = fragmentProgram ;
1373+ context -> state .dirty .bit .fragment_shader = true;
13731374}
13741375
13751376EXPORT (SceGxm , 0x29C34DF5 , int , sceGxmSetFragmentTexture , SceGxmContext * context ,
@@ -1915,61 +1916,56 @@ static void context_flush_dirty_state(SceGxmContext *context)
19151916 const SceGxmVertexProgram * vertex_program = context -> state .vertex_program ;
19161917 const SceGxmFragmentProgram * fragment_program = context -> state .fragment_program ;
19171918
1918- if (context -> state .dirty .bit .shaders ) {
1919+ if (context -> state .dirty .bit .vertex_shader && context -> state . dirty . bit . fragment_shader ) {
19191920 shaders [0 ] = & vertex_program -> dk_shader ;
19201921 shaders [1 ] = & fragment_program -> dk_shader ;
1921- dkCmdBufBindShaders (context -> cmdbuf , DkStageFlag_GraphicsMask , shaders ,
1922- ARRAY_SIZE (shaders ));
1923- context -> state .dirty .bit .shaders = false;
1922+ dkCmdBufBindShaders (context -> cmdbuf , DkStageFlag_Vertex | DkStageFlag_Fragment , shaders , 2 );
1923+ } else if (context -> state .dirty .bit .vertex_shader ) {
1924+ shaders [0 ] = & vertex_program -> dk_shader ;
1925+ dkCmdBufBindShaders (context -> cmdbuf , DkStageFlag_Vertex , shaders , 1 );
1926+ } else if (context -> state .dirty .bit .fragment_shader ) {
1927+ shaders [0 ] = & fragment_program -> dk_shader ;
1928+ dkCmdBufBindShaders (context -> cmdbuf , DkStageFlag_Fragment , shaders , 1 );
19241929 }
19251930
1926- if (context -> state .dirty .bit .depth_stencil ) {
1931+ if (context -> state .dirty .bit .depth_stencil )
19271932 dkCmdBufBindDepthStencilState (context -> cmdbuf , & context -> state .depth_stencil );
1928- context -> state .dirty .bit .depth_stencil = false;
1929- }
19301933
19311934 if (context -> state .dirty .bit .front_stencil ) {
19321935 dkCmdBufSetStencil (context -> cmdbuf , DkFace_Front , context -> state .front_stencil .write_mask ,
19331936 context -> state .front_stencil .ref ,
19341937 context -> state .front_stencil .compare_mask );
1935- context -> state .dirty .bit .front_stencil = false;
19361938 }
19371939
19381940 if (context -> state .dirty .bit .back_stencil ) {
19391941 dkCmdBufSetStencil (context -> cmdbuf , DkFace_Back , context -> state .back_stencil .write_mask ,
19401942 context -> state .back_stencil .ref ,
19411943 context -> state .back_stencil .compare_mask );
1942- context -> state .dirty .bit .back_stencil = false;
19431944 }
19441945
1945- if (context -> state .dirty .bit .color_write ) {
1946+ if (context -> state .dirty .bit .color_write )
19461947 dkCmdBufBindColorWriteState (context -> cmdbuf , & context -> state .color_write );
1947- context -> state .dirty .bit .color_write = false;
1948- }
19491948
1950- if (context -> state .dirty .bit .fragment_textures ) {
1949+ if (context -> state .dirty .bit .fragment_textures )
19511950 upload_fragment_texture_descriptors (context );
1952- context -> state .dirty .bit .fragment_textures = false;
1953- }
19541951
19551952 if (context -> state .dirty .bit .vertex_default_uniform ) {
19561953 dkCmdBufBindStorageBuffer (
19571954 context -> cmdbuf , DkStage_Vertex , 0 , context -> state .vertex_default_uniform .gpu_addr ,
19581955 vertex_program -> programId -> programHeader -> default_uniform_buffer_count * sizeof (float ));
1959-
19601956 context -> state .vertex_default_uniform .allocated = false;
1961- context -> state .dirty .bit .vertex_default_uniform = false;
19621957 }
19631958
19641959 if (context -> state .dirty .bit .fragment_default_uniform ) {
19651960 dkCmdBufBindStorageBuffer (
19661961 context -> cmdbuf , DkStage_Fragment , 1 , context -> state .fragment_default_uniform .gpu_addr ,
19671962 fragment_program -> programId -> programHeader -> default_uniform_buffer_count *
19681963 sizeof (float ));
1969-
19701964 context -> state .fragment_default_uniform .allocated = false;
1971- context -> state .dirty .bit .fragment_default_uniform = false;
19721965 }
1966+
1967+ /* We have flushed all the dirty state */
1968+ context -> state .dirty .raw = 0 ;
19731969}
19741970
19751971EXPORT (SceGxm , 0xBC059AFC , int , sceGxmDraw , SceGxmContext * context , SceGxmPrimitiveType primType ,
0 commit comments