Esempio n. 1
0
void VertexFuncSmoothSphereMapAOS(
    const VERTEXINPUT &in,
    VERTEXOUTPUT &out)
{
    const FLOAT *pWorldMat = (FLOAT *)in.pConstants;
    const FLOAT *pLightPos = (FLOAT *)in.pConstants + CONST_OFFSET_LIGHT_POSITION;

    Mat4Vec3Multiply(out.pVertices, pWorldMat, (FLOAT *)in.pAttribs);

    // Transform normals in attrib buffer by world matrix.
    OSALIGNLINE(FLOAT) normals[4];
    Mat4Vec3Multiply(&normals[0], pWorldMat, &in.pAttribs[SHADER_INPUT_SLOT_NORMAL]);

    // Normalize normals
    __m128 normal = Vec3Normalize(&normals[0]);

    __m128 lightPos = _mm_load_ps(pLightPos);
    __m128 lightDir = _mm_load_ps(in.pAttribs);

    // Compute a light direction vector for each vertex.
    //     lightDir = Normalize(lightPos - vertexPos)
    lightDir = _mm_sub_ps(lightPos, lightDir);
    lightDir = Vec3Normalize(lightDir);

    __m128 ndotl0 = Vec3Diffuse(normal, lightDir);

    _mm_store_ps(&out.pAttribs[0], _mm_load_ps(&in.pAttribs[0]));

    _mm_store_ss(&out.pAttribs[0x2], ndotl0);
}
Esempio n. 2
0
//////////////////////////////////////////////////////////////////////////
/// @brief Update client stats.
INLINE void UpdateClientStats(SWR_CONTEXT* pContext, uint32_t workerId, DRAW_CONTEXT* pDC)
{
    if ((pContext->pfnUpdateStats == nullptr) || (GetApiState(pDC).enableStatsBE == false))
    {
        return;
    }

    DRAW_DYNAMIC_STATE& dynState = pDC->dynState;
    OSALIGNLINE(SWR_STATS) stats{ 0 };

    // Sum up stats across all workers before sending to client.
    for (uint32_t i = 0; i < pContext->NumWorkerThreads; ++i)
    {
        stats.DepthPassCount += dynState.pStats[i].DepthPassCount;

        stats.PsInvocations  += dynState.pStats[i].PsInvocations;
        stats.CsInvocations  += dynState.pStats[i].CsInvocations;
    }


    pContext->pfnUpdateStats(GetPrivateState(pDC), &stats);
}
Esempio n. 3
0
void GLVSLightShader(
    const VERTEXINPUT &in,
    VERTEXOUTPUT &out)
{
    // output description
    const UINT FRONT_COLOR = 0;
    const UINT BACK_COLOR = 4;

    // compute position
    const FLOAT *pConstants = (FLOAT *)in.pConstants;
    const FLOAT *pMVP = &pConstants[GLVSLightConstants::MVP_MATRIX];
    Mat4Vec3Multiply(out.pVertices, pMVP, (FLOAT *)&in.pAttribs[SHADER_INPUT_SLOT_POSITION]);

    // Transform normals in attrib buffer by normal matrix.
    OSALIGNLINE(FLOAT) normals[4];
    Mat4Vec3Multiply(&normals[0], &pConstants[GLVSLightConstants::MV_MATRIX], &in.pAttribs[SHADER_INPUT_SLOT_NORMAL]);

    // Normalize normals
    //__m128 vNormal		= Vec3Normalize(&normals[0]);
    __m128 vNormal = _mm_load_ps(&normals[0]);

    // normalize light
    __m128 vLightDir = _mm_load_ps(&pConstants[GLVSLightConstants::LIGHT0_POS]);
    vLightDir = Vec3Normalize(vLightDir);

    // nDotL and clamp
    __m128 vNdotL0 = Vec3Diffuse(vNormal, vLightDir);

    // light diffuse * nDotL
    __m128 vLightDiffuse = _mm_load_ps(&pConstants[GLVSLightConstants::LIGHT0_DIFFUSE]);
    vLightDiffuse = _mm_mul_ps(vLightDiffuse, vNdotL0);

    // front color = front scene color + light_ambient * front_mat_ambient + light_diffuse * front_mat_diffuse;
    __m128 vFrontColor = _mm_load_ps(&pConstants[GLVSLightConstants::FRONT_SCENE_COLOR]);
    vFrontColor = _mm_add_ps(vFrontColor, _mm_mul_ps(vLightDiffuse, _mm_load_ps(&pConstants[GLVSLightConstants::FRONT_MAT_DIFFUSE])));
    __m128 vAmbient = _mm_mul_ps(_mm_load_ps(&pConstants[GLVSLightConstants::LIGHT0_AMBIENT]), _mm_load_ps(&pConstants[GLVSLightConstants::FRONT_MAT_AMBIENT]));
    vFrontColor = _mm_add_ps(vFrontColor, vAmbient);

    // clamp to 0..1
    vFrontColor = _mm_max_ps(vFrontColor, _mm_setzero_ps());
    vFrontColor = _mm_min_ps(vFrontColor, _mm_set1_ps(1.0));

    // store front color
    _mm_store_ps(&out.pAttribs[FRONT_COLOR], vFrontColor);

#if 1
    // back color
    // invert normal
    vNormal = _mm_mul_ps(vNormal, _mm_set1_ps(-1.0));

    // nDotL and clamp
    vNdotL0 = Vec3Diffuse(vNormal, vLightDir);

    // light diffuse * nDotL
    vLightDiffuse = _mm_load_ps(&pConstants[GLVSLightConstants::LIGHT0_DIFFUSE]);
    vLightDiffuse = _mm_mul_ps(vLightDiffuse, vNdotL0);

    // back color = back scene color + light_ambient * back_mat_ambient + light_diffuse * back_mat_diffuse;
    __m128 vBackColor = _mm_load_ps(&pConstants[GLVSLightConstants::BACK_SCENE_COLOR]);
    vBackColor = _mm_add_ps(vBackColor, _mm_mul_ps(vLightDiffuse, _mm_load_ps(&pConstants[GLVSLightConstants::BACK_MAT_DIFFUSE])));
    vAmbient = _mm_mul_ps(_mm_load_ps(&pConstants[GLVSLightConstants::LIGHT0_AMBIENT]), _mm_load_ps(&pConstants[GLVSLightConstants::BACK_MAT_AMBIENT]));
    vBackColor = _mm_add_ps(vBackColor, vAmbient);

    // clamp 0..1
    vBackColor = _mm_max_ps(vBackColor, _mm_setzero_ps());
    vBackColor = _mm_min_ps(vBackColor, _mm_set1_ps(1.0));

    // store back color
    _mm_store_ps(&out.pAttribs[BACK_COLOR], vBackColor);
#endif
}