[Bug 110229] glMemoryBarrier doesn't work.
bugzilla-daemon at freedesktop.org
bugzilla-daemon at freedesktop.org
Thu Apr 11 15:00:04 UTC 2019
https://bugs.freedesktop.org/show_bug.cgi?id=110229
--- Comment #31 from Laurent <laurentduroisin at gmail.com> ---
Okey, I've found a temporary solution : putting instructions in the second
fragment shader to slow down the shader execution code and it works...
const std::string fragmentShader2 =
R"(
#version 140
#extension GL_ARB_shader_atomic_counters : require
#extension GL_ARB_shading_language_420pack : require
#extension GL_ARB_shader_image_load_store : require
#extension GL_ARB_shader_storage_buffer_object : require
#define MAX_FRAGMENTS 75
struct NodeType {
vec4 color;
float depth;
uint next;
};
layout(binding = 0, r32ui) coherent uniform uimage2D
headPointers;
layout(binding = 0, std430) coherent buffer linkedLists {
NodeType nodes[];
};
void main() {
NodeType frags[MAX_FRAGMENTS];
NodeType frags2[MAX_FRAGMENTS];
int count = 0;
uint n = imageLoad(headPointers, ivec2(gl_FragCoord.xy)).r;
while( n != 0u && count < MAX_FRAGMENTS) {
frags[count] = nodes[n];
frags2[count] = frags[count];
n = nodes[n].next;
imageStore(headPointers, ivec2(gl_FragCoord.xy),
uvec4(n, 0, 0, 0));
count++;
}
//merge sort
int i, j1, j2, k;
int a, b, c;
int step = 1;
NodeType leftArray[MAX_FRAGMENTS/2]; //for merge sort
while (step <= count)
{
i = 0;
while (i < count - step)
{
////////////////////////////////////////////////////////////////////////
//merge(step, i, i + step, min(i + step + step,
count));
a = i;
b = i + step;
c = (i + step + step) >= count ? count : (i + step +
step);
for (k = 0; k < step; k++)
leftArray[k] = frags[a + k];
j1 = 0;
j2 = 0;
for (k = a; k < c; k++)
{
if (b + j1 >= c || (j2 < step &&
leftArray[j2].depth > frags[b + j1].depth))
frags[k] = leftArray[j2++];
else
frags[k] = frags[b + j1++];
}
////////////////////////////////////////////////////////////////////////
i += 2 * step;
}
step *= 2;
}
vec4 color = vec4(0, 0, 0, 0);
for( int i = 0; i < count; i++ )
{
color = mix( color, frags[i].color, frags[i].color.a);
if (frags2[i].color.r > 1 || frags2[i].color.g > 1 ||
frags2[i].color.b > 1)
color = vec4(1, 1, 1, 1);
}
gl_FragColor = color;
})";
First I had to affect n whith nodes[n] instead of frags[count], I don't
understand why.
Secondly I have to make another array and adding a if in the last loop (for)
when I mix colors, otherwise, I have a black screen....
--
You are receiving this mail because:
You are the assignee for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20190411/13b1a8cf/attachment.html>
More information about the dri-devel
mailing list