Bug 62236 - the issue of not correct display from MALI Integer Logic sample
Summary: the issue of not correct display from MALI Integer Logic sample
Status: NEW
Alias: None
Product: Mesa
Classification: Unclassified
Component: Drivers/Gallium/softpipe (show other bugs)
Version: unspecified
Hardware: Other Windows (All)
: medium major
Assignee: mesa-dev
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2013-03-12 15:14 UTC by alanchang544
Modified: 2018-04-21 03:23 UTC (History)
0 users

See Also:
i915 platform:
i915 features:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description alanchang544 2013-03-12 15:14:25 UTC
Hi 
I use MALI Integer Logic sample and work with Mesa code to run together. 
No matter Mesa3d GIT Feb version or Mesa 9.0 (modify to let it support gles3), I found there is wrong display issue of this sample. 
If I modify something in \src\gallium\drivers\softpipe\sp_setup.c (yes, I use softpipe in gallium), and find it's ok. 
But I don't know the rasterization algorithm exactly and don't know the solution good enough or not. 
Please help me to give your professional comment. 

Note1:  the change of sp_setup.c  (the last two lines are changed only )
static void
tri_persp_coeff(struct setup_context *setup,
                struct tgsi_interp_coef *coef,
                uint i,
                const float v[3])
{
   /* premultiply by 1/w  (v[0][3] is always W):
    */
   float mina = v[0] * setup->vmin[0][3];
   float mida = v[1] * setup->vmid[0][3];
   float maxa = v[2] * setup->vmax[0][3];
   float botda = mida - mina;
   float majda = maxa - mina;
   float a = setup->ebot.dy * majda - botda * setup->emaj.dy;
   float b = setup->emaj.dx * botda - majda * setup->ebot.dx;
   float dadx = a * setup->oneoverarea;
   float dady = b * setup->oneoverarea;

   /*
   debug_printf("tri persp %d,%d: %f %f %f\n", vertSlot, i,
          	setup->vmin[vertSlot][i],
          	setup->vmid[vertSlot][i],
       		setup->vmax[vertSlot][i]
          );
   */
   assert(i <= 3);
   coef->dadx[i] = dadx;
   coef->dady[i] = dady;
   coef->a0[i] = (mina -
                  (dadx * (setup->vmin[0][0] - setup->pixel_offset/setup->vmin[0][3]) +
                   dady * (setup->vmin[0][1] - setup->pixel_offset/setup->vmin[0][3])));
}

Note2:  MALI sample is from the attach file Mali_OpenGL_ES_SDK_for_Linux_On_ARM_v2.0.0.9444_Win32.msi 
And there are some patches to let it run it with mesa 

The first place to let integer type texture to use GL_NEAREST as mag/min filter, not GL_LINEAR in original IntegerLogics.cpp
    /* Load ping texture data. */
    GL_CHECK(glActiveTexture(GL_TEXTURE0));
    GL_CHECK(glBindTexture  (GL_TEXTURE_2D, pingTextureID));
    GL_CHECK(glTexImage2D   (GL_TEXTURE_2D, 0,                     GL_R8UI, WINDOW_W, WINDOW_H, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, pingTextureData));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP_TO_EDGE));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_CLAMP_TO_EDGE));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));

    /* Load pong texture data. */
    GL_CHECK(glActiveTexture(GL_TEXTURE1));
    GL_CHECK(glBindTexture  (GL_TEXTURE_2D, pongTextureID));
    GL_CHECK(glTexImage2D   (GL_TEXTURE_2D, 0,                     GL_R8UI, WINDOW_W, WINDOW_H, 0, GL_RED_INTEGER, GL_UNSIGNED_BYTE, NULL));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,     GL_CLAMP_TO_EDGE));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,     GL_CLAMP_TO_EDGE));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST));
    GL_CHECK(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST));

The second place to add explicit type conversion in IntegerLogic_Merge_shader.frag
void main()
{
	/* Determine if the currently drawn line is odd or even. */
	if((uint(gl_FragCoord.y) & 1u) == 0u)
	{
		/* Use the ping texture. */
		fragColor = vec4(texture(pingTexture, fragmentTexCoord).rrrr);
	}
	else
	{
		/* Use the pong texture. */
		fragColor = vec4(texture(pongTexture, fragmentTexCoord).rrrr);
	}
}


Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.