コード例 #1
0
ファイル: video.c プロジェクト: zmike/compiz
static int
getYV12FragmentFunction(CompScreen *s,
                        CompTexture *texture,
                        int param)
{
   VideoFunction *function;
   CompFunctionData *data;
   int target;

   VIDEO_SCREEN(s);

   if (texture->target == GL_TEXTURE_2D)
     target = COMP_FETCH_TARGET_2D;
   else
     target = COMP_FETCH_TARGET_RECT;

   for (function = vs->yv12Functions; function; function = function->next)
     if (function->param == param && function->target == target)
       return function->handle;

   data = createFunctionData();
   if (data)
     {
        static char *temp[] = { "uv", "tmp", "position" };
        int i, handle = 0;
        char str[1024];
        Bool ok = TRUE;

        for (i = 0; i < sizeof (temp) / sizeof (temp[0]); i++)
          ok &= addTempHeaderOpToFunctionData(data, temp[i]);

        snprintf(str, 1024,
                 "MOV position, fragment.texcoord[0];"
                 "MAX position, position, program.env[%d];"
                 "MIN position, position, program.env[%d].zwww;",
                 param, param);

        ok &= addDataOpToFunctionData(data, str);

        if (target == COMP_FETCH_TARGET_RECT)
          {
             snprintf(str, 1024,
                      "TEX output, position, texture[0], RECT;"
                      "MOV output, output.a;");

             ok &= addDataOpToFunctionData(data, str);

             if (s->glxPixmapFBConfigs[8].yInverted)
               {
                  snprintf(str, 1024,
                           "MAD position, position, 0.5, program.env[%d].xy;",
                           param + 1);
               }
             else
               {
                  snprintf(str, 1024,
                           "ADD position, position, program.env[%d].xy;"
                           "MUL position, position, 0.5;",
                           param + 1);
               }

             ok &= addDataOpToFunctionData(data, str);

             snprintf(str, 1024,
                      "TEX tmp, position, texture[0], RECT;"
                      "MOV uv, tmp.a;"
                      "MAD output, output, 1.164, -0.073;"
                      "ADD position.x, position.x, program.env[%d].z;"
                      "TEX tmp, position, texture[0], RECT;"
                      "MOV uv.y, tmp.a;",
                      param + 1);
          }
        else
          {
             snprintf(str, 1024,
                      "TEX output, position, texture[0], 2D;"
                      "MOV output, output.a;");

             ok &= addDataOpToFunctionData(data, str);

             if (s->glxPixmapFBConfigs[8].yInverted)
               {
                  snprintf(str, 1024,
                           "MAD position, position, 0.5, { 0.0, %f };",
                           2.0f / 3.0f);
               }
             else
               {
                  snprintf(str, 1024,
                           "SUB position, position, { 0.0, %f };"
                           "MUL position, position, 0.5;",
                           1.0f / 3.0f);
               }

             ok &= addDataOpToFunctionData(data, str);

             snprintf(str, 1024,
                      "TEX tmp, position, texture[0], 2D;"
                      "MOV uv, tmp.a;"
                      "MAD output, output, 1.164, -0.073;"
                      "ADD position.x, position.x, 0.5;"
                      "TEX tmp, position, texture[0], 2D;"
                      "MOV uv.y, tmp.a;");
          }

        ok &= addDataOpToFunctionData(data, str);

        snprintf(str, 1024,
                 "SUB uv, uv, { 0.5, 0.5 };"
                 "MAD output.xyz, { 1.596, -0.813,   0.0 }, uv.xxxw, output;"
                 "MAD output.xyz, {   0.0, -0.391, 2.018 }, uv.yyyw, output;"
                 "MOV output.a, 1.0;");

        ok &= addDataOpToFunctionData(data, str);

        if (!ok)
          {
             destroyFunctionData(data);
             return 0;
          }

        function = malloc(sizeof (VideoFunction));
        if (function)
          {
             handle = createFragmentFunction(s, "video", data);

             function->handle = handle;
             function->target = target;
             function->param = param;

             function->next = vs->yv12Functions;
             vs->yv12Functions = function;
          }

        destroyFunctionData(data);

        return handle;
     }

   return 0;
}
コード例 #2
0
ファイル: fragment.c プロジェクト: noodlylight/fusilli
int
getSaturateFragmentFunction (CompScreen  *s,
                             CompTexture *texture,
                             int         param)
{
	int target;

	if (param >= 64)
		return 0;

	if (texture->target == GL_TEXTURE_2D)
		target = COMP_FETCH_TARGET_2D;
	else
		target = COMP_FETCH_TARGET_RECT;

	if (!s->saturateFunction[target][param])
	{
		static const char *saturateData =
		        "MUL temp, output, { 1.0, 1.0, 1.0, 0.0 };"
		        "DP3 temp, temp, program.env[%d];"
		        "LRP output.xyz, program.env[%d].w, output, temp;";
		CompFunctionData  *data;

		data = createFunctionData ();
		if (data)
		{
			char str[1024];

			if (!addTempHeaderOpToFunctionData (data, "temp"))
			{
				destroyFunctionData (data);
				return 0;
			}

			if (!addFetchOpToFunctionData (data, "output", NULL, target))
			{
				destroyFunctionData (data);
				return 0;
			}

			if (!addColorOpToFunctionData (data, "output", "output"))
			{
				destroyFunctionData (data);
				return 0;
			}

			snprintf (str, 1024, saturateData, param, param);

			if (!addDataOpToFunctionData (data, str))
			{
				destroyFunctionData (data);
				return 0;
			}

			s->saturateFunction[target][param] =
				createFragmentFunction (s, "__core_saturate", data);

			destroyFunctionData (data);
		}
	}

	return s->saturateFunction[target][param];
}
コード例 #3
0
ファイル: water.c プロジェクト: AtheistSpacePirate/compiz
static int
getBumpMapFragmentFunction(CompScreen * s,
			   CompTexture * texture, int unit, int param)
{
	WaterFunction *function;
	CompFunctionData *data;
	int target;

	WATER_SCREEN(s);

	if (texture->target == GL_TEXTURE_2D)
		target = COMP_FETCH_TARGET_2D;
	else
		target = COMP_FETCH_TARGET_RECT;

	for (function = ws->bumpMapFunctions; function;
	     function = function->next) {
		if (function->param == param && function->unit == unit
		    && function->target == target)
			return function->handle;
	}

	data = createFunctionData();
	if (data) {
		static char *temp[] =
		    { "normal", "temp", "total", "bump", "offset" };
		int i, handle = 0;
		char str[1024];

		for (i = 0; i < sizeof(temp) / sizeof(temp[0]); i++) {
			if (!addTempHeaderOpToFunctionData(data, temp[i])) {
				destroyFunctionData(data);
				return 0;
			}
		}

		snprintf(str, 1024,
			 /* get normal from normal map */
			 "TEX normal, fragment.texcoord[%d], texture[%d], %s;"
			 /* save height */
			 "MOV offset, normal;"
			 /* remove scale and bias from normal */
			 "MAD normal, normal, 2.0, -1.0;"
			 /* normalize the normal map */
			 "DP3 temp, normal, normal;"
			 "RSQ temp, temp.x;" "MUL normal, normal, temp;"
			 /* scale down normal by height and constant and use as
			    offset in texture */
			 "MUL offset, normal, offset.w;"
			 "MUL offset, offset, program.env[%d];",
			 unit, unit,
			 (ws->target == GL_TEXTURE_2D) ? "2D" : "RECT", param);

		if (!addDataOpToFunctionData(data, str)) {
			destroyFunctionData(data);
			return 0;
		}

		if (!addFetchOpToFunctionData
		    (data, "output", "offset.yxzz", target)) {
			destroyFunctionData(data);
			return 0;
		}

		snprintf(str, 1024,
			 /* normal dot lightdir, this should eventually be
			    changed to a real light vector */
			 "DP3 bump, normal, { 0.707, 0.707, 0.0, 0.0 };"
			 "MUL bump, bump, state.light[0].diffuse;");

		if (!addDataOpToFunctionData(data, str)) {
			destroyFunctionData(data);
			return 0;
		}

		if (!addColorOpToFunctionData(data, "output", "output")) {
			destroyFunctionData(data);
			return 0;
		}

		snprintf(str, 1024,
			 /* diffuse per-vertex lighting, opacity and brightness
			    and add lightsource bump color */
			 "ADD output, output, bump;");

		if (!addDataOpToFunctionData(data, str)) {
			destroyFunctionData(data);
			return 0;
		}

		function = malloc(sizeof(WaterFunction));
		if (function) {
			handle = createFragmentFunction(s, "water", data);

			function->handle = handle;
			function->target = target;
			function->param = param;
			function->unit = unit;

			function->next = ws->bumpMapFunctions;
			ws->bumpMapFunctions = function;
		}

		destroyFunctionData(data);

		return handle;
	}

	return 0;
}
コード例 #4
0
static int
getNegFragmentFunction (CompScreen  *s,
			CompTexture *texture,
			Bool        alpha)
{
    CompFunctionData *data;
    int              target;

    NEG_SCREEN (s);

    if (texture->target == GL_TEXTURE_2D)
	target = COMP_FETCH_TARGET_2D;
    else
	target = COMP_FETCH_TARGET_RECT;

    if (alpha)
    {
	if (ns->negAlphaFunction)
	    return ns->negAlphaFunction;
    }
    else
    {
	if (ns->negFunction)
	    return ns->negFunction;
    }

    data = createFunctionData ();
    if (data)
    {
	Bool ok = TRUE;
	int  handle = 0;

	if (alpha)
	    ok &= addTempHeaderOpToFunctionData (data, "neg" );

	ok &= addFetchOpToFunctionData (data, "output", NULL, target);
	if (alpha)
	{
	    ok &= addDataOpToFunctionData (data, "RCP neg.a, output.a;");
	    ok &= addDataOpToFunctionData (data,
			"MAD output.rgb, -neg.a, output, 1.0;");
	}
	else
	    ok &= addDataOpToFunctionData (data,
			"SUB output.rgb, 1.0, output;");

	if (alpha)
	    ok &= addDataOpToFunctionData (data,
			"MUL output.rgb, output.a, output;");
		
	ok &= addColorOpToFunctionData (data, "output", "output");
	if (!ok)
	{
	    destroyFunctionData (data);
	    return 0;
	}

	handle = createFragmentFunction (s, "neg", data);

	if (alpha)
	    ns->negAlphaFunction = handle;
	else
	    ns->negFunction = handle;

	destroyFunctionData (data);

	return handle;
    }

    return 0;
}