Skip to content

Commit 318a80e

Browse files
committed
gxm: separate vertex and fragment dirty
1 parent 7c69393 commit 318a80e

1 file changed

Lines changed: 21 additions & 25 deletions

File tree

source/modules/SceGxm.c

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -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

13581359
EXPORT(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

13751376
EXPORT(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

19751971
EXPORT(SceGxm, 0xBC059AFC, int, sceGxmDraw, SceGxmContext *context, SceGxmPrimitiveType primType,

0 commit comments

Comments
 (0)