Exemple #1
0
  void GLProgram::link(State* state)
  {
    glCheck("GLProgram::link");
    m_relink = false;
    GLint prog = 0;
    glRun(glGetIntegerv(GL_CURRENT_PROGRAM, &prog));
    if (isLinked()) {
      glRun(glUseProgram(m_prog)); /// @todo Do we need this?
      m_uniformList = getUniformList();
    }

    ShaderErrorList errors(state ? state->material() : MaterialPtr(), name());

    if (!m_transformFeedback.isEmpty()) {
      const char* names[10];
      int m = std::min(m_transformFeedback.size(), 10);
      for (int i = 0; i < m; ++i) {
        names[i] = m_transformFeedback[i].data();
      }
      glRun(glTransformFeedbackVaryings(m_prog, m, names, GL_SEPARATE_ATTRIBS));
    }

    glRun(glLinkProgram(m_prog));
    GLint ok = 0;
    glRun(glGetProgramiv(m_prog, GL_LINK_STATUS, &ok));

    GLint len = 0;
    glRun(glGetProgramiv(m_prog, GL_INFO_LOG_LENGTH, &len));
    // len may include the zero byte
    if (len > 1) {
      std::vector<GLchar> log(len);
      GLsizei size = len;
      glRun(glGetProgramInfoLog(m_prog, size, &size, &log[0]));
      ShaderCompilerOutputParser::instance().parse(QString::fromUtf8(&log[0], size),
          errors);
    }

    if (ok) {
      glRun(glUseProgram(m_prog)); /// @todo Do we need this?
      setUniform(m_uniformList);
    }
    emit linked(errors);

    glRun(glUseProgram(prog));
  }
void COpenGLCgMaterialRenderer::init(s32& materialType,
                                     const c8* vertexProgram, const c8* vertexEntry, E_VERTEX_SHADER_TYPE vertexProfile,
                                     const c8* fragmentProgram, const c8* fragmentEntry, E_PIXEL_SHADER_TYPE fragmentProfile,
                                     const c8* geometryProgram, const c8* geometryEntry, E_GEOMETRY_SHADER_TYPE geometryProfile,
                                     scene::E_PRIMITIVE_TYPE inType, scene::E_PRIMITIVE_TYPE outType, u32 vertices)
{
    bool Status = true;
    CGerror Error = CG_NO_ERROR;
    materialType = -1;

    // TODO: add profile selection

    if (vertexProgram)
    {
        VertexProfile = cgGLGetLatestProfile(CG_GL_VERTEX);

        if (VertexProfile)
            VertexProgram = cgCreateProgram(Driver->getCgContext(), CG_SOURCE, vertexProgram, VertexProfile, vertexEntry, 0);

        if (!VertexProgram)
        {
            Error = cgGetError();
            os::Printer::log("Cg vertex program failed to compile:", ELL_ERROR);
            os::Printer::log(cgGetLastListing(Driver->getCgContext()), ELL_ERROR);

            Status = false;
        }
        else
            cgGLLoadProgram(VertexProgram);
    }

    if (fragmentProgram)
    {
        FragmentProfile = cgGLGetLatestProfile(CG_GL_FRAGMENT);

        if (FragmentProfile)
            FragmentProgram = cgCreateProgram(Driver->getCgContext(), CG_SOURCE, fragmentProgram, FragmentProfile, fragmentEntry, 0);

        if (!FragmentProgram)
        {
            Error = cgGetError();
            os::Printer::log("Cg fragment program failed to compile:", ELL_ERROR);
            os::Printer::log(cgGetLastListing(Driver->getCgContext()), ELL_ERROR);

            Status = false;
        }
        else
            cgGLLoadProgram(FragmentProgram);
    }

    if (geometryProgram)
    {
        GeometryProfile = cgGLGetLatestProfile(CG_GL_GEOMETRY);

        if (GeometryProfile)
            GeometryProgram = cgCreateProgram(Driver->getCgContext(), CG_SOURCE, geometryProgram, GeometryProfile, geometryEntry, 0);

        if (!GeometryProgram)
        {
            Error = cgGetError();
            os::Printer::log("Cg geometry program failed to compile:", ELL_ERROR);
            os::Printer::log(cgGetLastListing(Driver->getCgContext()), ELL_ERROR);

            Status = false;
        }
        else
            cgGLLoadProgram(GeometryProgram);
    }

    getUniformList();

    // create OpenGL specifics sampler uniforms.
    for (unsigned int i = 0; i < UniformInfo.size(); ++i)
    {
        if (UniformInfo[i]->getType() == CG_SAMPLER2D)
        {
            bool IsGlobal = true;

            if (UniformInfo[i]->getSpace() == CG_PROGRAM)
                IsGlobal = false;

            CCgUniform* Uniform = new COpenGLCgUniformSampler2D(UniformInfo[i]->getParameter(), IsGlobal);
            delete UniformInfo[i];
            UniformInfo[i] = Uniform;
        }
    }

    if (Status)
        materialType = Driver->addMaterialRenderer(this);
}
void CD3D9CgMaterialRenderer::init(s32& pMaterialType,
	const c8* pVertexProgram, const c8* pVertexEntry, E_VERTEX_SHADER_TYPE pVertexProfile,
	const c8* pFragmentProgram, const c8* pFragmentEntry, E_PIXEL_SHADER_TYPE pFragmentProfile,
	const c8* pGeometryProgram, const c8* pGeometryEntry, E_GEOMETRY_SHADER_TYPE pGeometryProfile,
	scene::E_PRIMITIVE_TYPE pInType, scene::E_PRIMITIVE_TYPE pOutType, u32 pVertices)
{
	bool Status = true;
	CGerror Error = CG_NO_ERROR;
	pMaterialType = -1;

	// TODO: add profile selection

	if (pVertexProgram)
	{
		VertexProfile = cgD3D9GetLatestVertexProfile();

		if (VertexProfile)
			VertexProgram = cgCreateProgram(Driver->getCgContext(), CG_SOURCE, pVertexProgram, VertexProfile, pVertexEntry, 0);

		if (!VertexProgram)
		{
			Error = cgGetError();
			os::Printer::log("Cg vertex program failed to compile:", ELL_ERROR);
			os::Printer::log(cgGetLastListing(Driver->getCgContext()), ELL_ERROR);

			Status = false;
		}
		else
			cgD3D9LoadProgram(VertexProgram, 0, 0);
	}

	if (pFragmentProgram)
	{
		FragmentProfile = cgD3D9GetLatestPixelProfile();

		if (FragmentProfile)
			FragmentProgram = cgCreateProgram(Driver->getCgContext(), CG_SOURCE, pFragmentProgram, FragmentProfile, pFragmentEntry, 0);

		if (!FragmentProgram)
		{
			Error = cgGetError();
			os::Printer::log("Cg fragment program failed to compile:", ELL_ERROR);
			os::Printer::log(cgGetLastListing(Driver->getCgContext()), ELL_ERROR);

			Status = false;
		}
		else
			cgD3D9LoadProgram(FragmentProgram, 0, 0);
	}

	/*if (pGeometryProgram)
	{
		GeometryProfile = cgD3D9GetLatestGeometryProfile();

		if (GeometryProfile)
			GeometryProgram = cgCreateProgram(Driver->getCgContext(), CG_SOURCE, pGeometryProgram, GeometryProfile, pGeometryEntry, 0);

		if (!GeometryProgram)
		{
			Error = cgGetError();
			os::Printer::log("Cg geometry program failed to compile:", ELL_ERROR);
			os::Printer::log(cgGetLastListing(Driver->getCgContext()), ELL_ERROR);

			Status = false;
		}
		else
			cgD3D9LoadProgram(GeometryProgram, 0, 0);
	}*/

	getUniformList();

	// create D3D9 specifics sampler uniforms.
	for(unsigned int i = 0; i < UniformInfo.size(); ++i)
	{
		if (UniformInfo[i]->getType() == CG_SAMPLER2D)
		{
			bool IsGlobal = true;

			if (UniformInfo[i]->getSpace() == CG_PROGRAM)
				IsGlobal = false;

			CCgUniform* Uniform = new CD3D9CgUniformSampler2D(UniformInfo[i]->getParameter(), IsGlobal);
			delete UniformInfo[i];
			UniformInfo[i] = Uniform;
		}
	}

	if (Status)
		pMaterialType = Driver->addMaterialRenderer(this);
}