static bool ep_compile_pass_shaderparams(struct effect_parser *ep, struct darray *pass_params, struct darray *used_params, gs_shader_t *shader) { size_t i; darray_resize(sizeof(struct pass_shaderparam), pass_params, used_params->num); for (i = 0; i < pass_params->num; i++) { struct dstr *param_name; struct pass_shaderparam *param; param_name = darray_item(sizeof(struct dstr), used_params, i); param = darray_item(sizeof(struct pass_shaderparam), pass_params, i); param->eparam = gs_effect_get_param_by_name(ep->effect, param_name->array); param->sparam = gs_shader_get_param_by_name(shader, param_name->array); if (!param->sparam) { blog(LOG_ERROR, "Effect shader parameter not found"); return false; } } return true; }
gs_vertex_shader::gs_vertex_shader(gs_device_t *device, const char *file, const char *shaderString) : gs_shader (device, GS_SHADER_VERTEX), hasNormals (false), hasColors (false), hasTangents (false), nTexUnits (0) { vector<D3D11_INPUT_ELEMENT_DESC> inputs; ShaderProcessor processor(device); ComPtr<ID3D10Blob> shaderBlob; string outputString; HRESULT hr; processor.Process(shaderString, file); processor.BuildString(outputString); processor.BuildParams(params); processor.BuildInputLayout(inputs); GetBuffersExpected(inputs); BuildConstantBuffer(); Compile(outputString.c_str(), file, "vs_4_0", shaderBlob.Assign()); hr = device->device->CreateVertexShader(shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), NULL, shader.Assign()); if (FAILED(hr)) throw HRError("Failed to create vertex shader", hr); hr = device->device->CreateInputLayout(inputs.data(), (UINT)inputs.size(), shaderBlob->GetBufferPointer(), shaderBlob->GetBufferSize(), layout.Assign()); if (FAILED(hr)) throw HRError("Failed to create input layout", hr); viewProj = gs_shader_get_param_by_name(this, "ViewProj"); world = gs_shader_get_param_by_name(this, "World"); }