Even a "simple" program should verify it's ability to function properly, unless it's purely a hobby or learning pursuit.
That's what the OpenGL specification is for. Conforming implementations guarantee a minimum working set of capabilities on which software can rely on. I don't know what you are thinking, but none of those values you are querying is allowed to return 0, at least since 3.0
according to the official reference page for glGet(). In fact, the minimum allowed values are fairly generous for all but the most demanding applications if you ask me. Worrying that a program will fail to function properly because there might not be enough resources to use is not an OpenGL thing. It might be the case for other APIs like DirectX, but when you know that industrial and other more "serious" applications rely on your specification, you leave less room for vendors to interpret your requirements.
It could simply be struct like ContextSettings that gets filled in with stuff
Having a central location for such a broad range of unrelated attributes isn't good style if you ask me. Any time a feature is added/changed that relies on such values, changes will have to be made to multiple modules instead of solely at the site at which the value is relevant. This increases coupling, and makes proper maintenance of the code slightly more tedious with every iteration. The sfml-window module's sole purpose is to provide a working GL environment on which other modules or your own code can build on top of. It shouldn't try to take over responsibility when it doesn't have to. Sure, you and other coders might want it to, because we end up saving you work, but keeping the implementation clean and easily maintainable has higher priority, especially given SFML's limited development resources.
max texture size
sf::Texture::getMaximumSize()
GL_MAX_TEXTURE_UNITS
Too specific, can perform on your own with current master.
geometry shader support check (should that be added to SFML)
#428a mipmap support check
#123shader profiles supported
Can be derived from context version.
This would be "simple" in that the casual user could totally ignore this HardwareCapabilities struct. On the flip-side, for any more serious software release, the programmer could query it and make it's own decisions how to handle this info, and validate or alter the program's functionality (e.g. simpler shaders). And this could be done without touching any opengl, remaining true to the spirit of SFML's "simple" API.
There are 2 kinds of "Simple", and over time I feel SFML is diverging from one to the other (which is not necessarily a bad thing).
The first kind, probably the kind many beginners have in mind when they start using SFML is the "I don't need to know how the stuff works" simple. They start using SFML, try to realize whatever they had envisioned using the tools provided to them, and any time lower level knowledge becomes unavoidable, they end up posting on the forum. SFML hides the lower level implementation from them, shielding the nastiness of OpenGL from people who are already struggling just learning C++. SFML tries to hide the details from them the best it can, but at times it just can't keep the promise and has to let it seep out in some way.
One of these is obvious with sf::Shader. Obviously the user will need to know GLSL to make use of it, and in addition to that they will need to know everything else related to using shaders properly, such as proper texture management and uniform specification. At this point SFML just gives up and doesn't try to hide anything from the user any longer. If they need special functionality for their specific use case, they will have to take care of it themselves.
In the past, this was always hard to do, because SFML actively prevented users from extending the functionality of its classes when they just wouldn't cut it. This lead to users mixing sfml-graphics and raw OpenGL code way more than necessary, which is why I tried to improve the situation by making it less necessary now than it previously was.
The second kind, and the way in which I use SFML is the "save me from having to write 1000s of lines of code" simple. SFML can simplify the code that people would have written without it, while making sure not to limit them in unreasonable ways. If you are already a seasoned OpenGL programmer, then you have probably gone through countless cycles of writing the same old boilerplate code over and over again. In this situation you are happy for every detour you can take that meets your requirements. A library might not guarantee that a detour exists for everything you are trying to do, but even if it increases your overall productiveness by just a bit, it would have already done its job.
I don't know about you, but I find many programmers these days unreasonably assuming that they should only have to use a single library and that library has to do everything they need it to do in their specific project. There are many libraries like this out there already, and over time they just get bloated to the point where I personally consider them unusable for the majority of my use cases. Instead of aiming to cover the superset of all use cases, SFML takes a different approach and tries to cover the common subset of all use cases in order not to introduce too much bloat
for everybody. I'm not saying that the amount of subjective bloat will be the same for everybody, but it shouldn't reach a point where people have to start considering whether the library might actually hinder them from working effectively.
People really shouldn't be scared of having to combine multiple libraries in their projects, it has been said time and again: SFML isn't a game engine. SFML might be a maverick in this sense, but until now it hasn't harmed it in any way, and to maintain this stance, we simply have to be stricter than other libraries when it comes to the definition of the API.
By not having it, it's no more simple for a casual user, but much less simple for any programmer who is writing a serious software release.
If you replace "any programmer who is writing a serious software release" with "programmer who is used to how 90% of all other libraries function" you might be on to something.
Seriously though, the only reason I can think of for why people ask open source libraries to implement application specific feature XYZ is because a) it would be free of charge to them and b) it would save them manhours which they could spend on something else instead. If libraries charged their users for implementing very specific features, they would probably think twice about whether they should implement it themselves instead. We develop with the community in mind, and not single users.
You're basically "forcing" all those users to write this low level code themselves. That's the opposite of simple.
Do you really expect any arbitrarily selected application requirements to be reducible to an implementation that you will always deem "simple? It's a simple fact of life, not only in software development. The more complex the task at hand, the more effort it will take to fulfil said task. Building an airport will take considerably more work than building a house, even if the contractor has a lot of experience building runways and terminal buildings.
What I find really annoying is a current trend of programmers boasting resumes containing lines like "Has experience with library X, Y and Z" being employed in positions which
might end up requiring a bit more expertise than that. If all these people really knew how to do is use said libraries, then what are they going to do if the libraries can't fulfil their employers' requirements? Go to the library and ask them to implement it just because that's the only thing they know how to use? If they ended up saying no, I have no idea what the company would end up doing, probably just dropping the feature altogether if I didn't know any better.
I kind of miss the days when people were considered "graphics programmers" or "network programmers". They would have the expertise to get the job done, no matter what the situation looked like. At the end of the day, when you have to ship the product, it doesn't matter how it is implemented, only that all requirements are met. Real programmers wouldn't complain about having to go a few levels lower when it was necessary, and would rejoice whenever a library did indeed end up saving them work. Too much burden is placed on libraries these days, simply because the people who claim they are "programmers" can't go through their routine of simply plugging modules together and ending up with a finished product. People have wondered why I consistently detest the Java "programming language", now they might have a few more clues.
Because it's like SFML does 95% of the base functionality that every fully robust app will need, but leaves that 5% where the user must delve into the very low level opengl code that SFML otherwise successfully abstracts away.
Same argument as above. If SFML really went out of its way to make sure 100% was covered in every scenario, you might have forgotten that those 5%s add up over time to something that is truly monstrous.
To me, the "S" in SFML is largely about allowing me to avoid low level opengl.
Avoiding is not the same as ignoring. I consider the former optional, while the latter is what some people hope to get away with, but end up burning themselves with. If you know what you are doing is beyond the capabilities of what most SFML users might make use of, always be prepared to write OpenGL code.
But SFML also allows for layers of depth. A casual user can create a few sprites and move them around. A more advanced user can employ VertexArrays, Shaders, RenderTextures, etc. The casual user can ignore those. You guys make the use of these more advanced concepts (shaders, render textures, etc) MUCH more pleasant to work with ("simple") than writing the raw opengl. So again, I think you have been largely successfully here. Except, perhaps, a few little edge cases like this.
You consider this an edge case, I consider this as the next layer of depth in your words. Just because OpenGL symbols aren't in the sf:: namespace, doesn't mean that it is not considered as the next logical step after usage of sf::Shaders and sf::RenderTextures. We could just pull everything into an sf::ogl:: namespace, but since it would serve no practical purpose, we just recommend anybody who is interested to learn more about OpenGL and how they can use it alongside SFML.